第1步:工具和材料
此項目使用了以下工具和材料:
工具和材料:
焊鐵和焊絲。我不得不將一些端子焊接到Nunchuk的電線上,以便將它連接到Arduino;
收縮管。使用一些收縮管來更好地隔離導體;
螺絲刀。使用一些螺栓和螺母安裝結構;
6軸機械桌面機械臂(鏈接)。這個很棒的工具包已經有幾個組件,如下所述。它可靠且易于組裝;
12V電源(2A或更高);
ESP8266-01 (鏈接/鏈接)。它被用作“WiFi調制解調器”。它接收來自控制接口的信號,由Arduino執行;
公母跳線(5線);
Arduino Mega (鏈接/鏈接/鏈接)。請注意,我使用的機器人手臂套件還有一個已經附帶此Arduino板的板和控制器束。如果您沒有使用這些套件,您也可以使用其他Arduino板;
Sain Smart 6軸機械桌面臂已經附帶以下組件:
Arduino Mega 2560 R3(鏈接)
控制板屏蔽(鏈接)
NRF24L01 +無線收發模塊(鏈接)
MPU6050 3 -axis陀螺儀和3軸加速度計(鏈接)
71 x M3X8螺絲
47 x M3螺母
2 x U支架
5 x伺服支架
4 x 9kg伺服(鏈接)
2 x 20kg伺服(鏈接)
6 x金屬伺服托盤
3 x U支架
21 x直角支架
3 x法蘭軸承
1 x夾具
您可能會在線找到其他機器人手臂套件(鏈接),甚至可以自己設計。例如,有一些可以3D打印的精彩項目。
在下一步中,我將向您展示如何在連接電路之前組裝臂套件。如果您沒有類似的套件,請隨意跳一些步驟。您可以使用另一個機械臂套件,組裝并直接跳轉到電子設備和編程步驟。
步驟2:組裝機器人手臂
在這一步中,我將向您展示如何組裝我使用的臂套件(機械部件)(鏈接)。如果您沒有類似的套件,請隨意跳一些步驟。您可以使用另一個機械臂套件,組裝并直接跳轉到電子設備和編程步驟。
要組裝的第一個部件是機器人的基礎。它由兩個U形支架組成,使用四個M3螺栓和螺母背靠背連接,如圖所示;
第一臺伺服電機使用伺服支架垂直安裝在底座上。該型材使用四個M3螺栓和螺母固定在底座上,如圖所示。伺服#1位于其頂部,并使用四個M3螺栓和螺母連接。伺服軸上安裝有圓形金屬喇叭。該套件配有幾個塑料喇叭。它們不會用于組裝機器人。
另一個伺服支架垂直于前一個安裝。它使用四個M3螺栓連接到伺服#1喇叭。伺服#2安裝有四個M3螺栓和螺母,還使用圓形金屬喇叭。然后使用四個螺栓將U支架連接到喇叭上。請注意,使用M3螺栓對準伺服軸。它賦予結構穩定性。軸承安裝在該螺栓上,并使用另一個M3螺母將其鎖定到位。這樣,U支架緊緊地連接到伺服#2中心軸。
使用四個M3螺栓和螺母安裝另一個U型支架。另一方面,使用圓形金屬喇叭和四個螺栓安裝伺服#3。伺服支架連接到伺服電機,L形輪廓通過一些螺栓和螺母連接到伺服支架。請注意,如前所述,另一個軸承用于伺服軸。
使用一組四個M3螺栓和螺母將另一個U形支架連接到L形型材。與前一步驟類似,伺服#4使用四個螺栓安裝到U支架上。另一個伺服支架連接到伺服。
第五個伺服系統使用另一個伺服支架垂直于伺服#4連接,使用四個M3螺栓和螺母安裝。
然后將夾具連接到伺服#5軸。在它的頂部,伺服#6使用一些螺栓,螺母和金屬喇叭連接。夾具有一些齒輪,可以將伺服的旋轉轉動為夾具的線性運動。
步驟3:接線電路
組裝結構后,您就可以準備接線電路了。我使用了機器人手臂套件附帶的控制板護罩。它使組件的連接更容易,因為它已經配備了用于伺服電機,電源等的特定連接器。
不幸的是,這個控制板沒有ESP8266的特定連接器。所以我不得不使用一些跳線將Wi-Fi模塊連接到我的Arduino Mega。
按如下方式連接組件:
ESP8266:
ESP8266 RX =》 Arduino Mega Pin 14(在屏蔽上)
ESP8266 TX =》 Arduino Mega Pin 15(在屏蔽上)
ESP8266 Vcc =》 Ardino Mega Pin 3V3(在屏蔽上)
ESP8266 Gnd =》 Arduino Mega Pin Gnd(在屏蔽上)
ESP8266 CH_PD =》 Arduino Mega Pin 3V3(在屏蔽,在為24L01模塊保留的連接器中)
您會注意到伺服控制屏蔽有兩個標記為5V的引腳。雖然其中一個實際上是3.3V引腳。用電壓表測試。
伺服系統:
控制屏蔽端子11 =》伺服#1
控制屏蔽端子12 =》伺服#2
控制屏蔽端子13 =》伺服#3
控制屏蔽端子8 =》伺服#4
控制屏蔽端子9 =》伺服#5
控制屏蔽端子10 =》伺服#6
如果您不使用控制屏蔽,則應使用以下引腳配置:
Arduino引腳11 =》伺服#1(Sgn)
Arduino引腳12 =》伺服#2(Sgn)
Arduino引腳13 =》伺服#3(Sgn)
Arduino引腳8 =》伺服#4(Sgn)
Arduino引腳9 =》伺服#5(Sgn)
Arduino引腳10 =》伺服#6(Sgn)
Arduino Gnd =》伺服Gnd
6V電源=》伺服Vcc
您還需要連接外部12V電源。我建議一個輸出超過2A的人。伺服電機消耗大量電能,如果電源不夠強大,伺服電機會振動并變得非常熱。它們也將失去實力。
在上傳Arduino代碼之前不要連接電源(如后面的步驟所示)。盾牌上有一個電源按鈕。將其保持在關閉位置。
在Arduino上插入USB線并繼續下一步。
警告!您會注意到我已將ESP8266 RX/TX引腳直接連接到Arduino TX/RX引腳。它對我有用,但我不建議這樣做。 ESP8266工作在3.3V,Arduino引腳工作在5V。有人說它可能會燒壞你的ESP8266模塊(雖然我已經多次測試過,但沒有問題)。如果要將5V轉換為3.3V,可以使用分壓器或電壓電平轉換器。
步驟4:設置Arduino IDE
現在硬件準備就緒,是時候處理Arduino代碼了。
您可以在Arduino的網站上找到適用于Windows,Linux或MAC OSX的最新版本:https://www.arduino.cc/en/main/software
免費下載,將其安裝到您的計算機上并啟動它。
Arduino和ESP8266模塊之間沒有使用額外的庫進行通信。請檢查ESP8266的波特率并在代碼中正確設置。
步驟5:Arduino代碼
下載Arduino代碼(瀏覽器控制臂) -v3.ino)并用路由器密碼替換你的wifi路由器SSID和YYYYY的XXXXX。將Arduino板連接到計算機USB端口并上傳代碼。
電路通電后,手臂將移動到起始位置,ESP8266將嘗試連接Wi-Fi網絡。
警告:當代碼開始運行時,機械臂將快速移動到其初始位置。小心不要在啟動過程中受傷或損壞附近的設備!
根據舵機的安裝方式,您可能需要更換每個伺服電機的起始角度。
代碼說明:
在設置之前,代碼會導入草圖上使用的庫。僅使用 servo.h 庫。沒有使用庫來連接WiFi模塊。
定義要使用的引腳,并聲明全局變量。 angle#整數變量存儲每個伺服的初始位置。如果您希望機器人從不同的位置開始,請更改這些變量的值。
angle#sp 是每個伺服的設定點。在執行代碼期間,控制器將以給定的速度移動電機,直到達到設定值。
servo_speed 變量定義所有伺服的運動速度。如果您希望特定伺服移動得更快,請增加其值。
//Include libraries
#include
//define variables
#define DEBUG true //display ESP8266 messages on Serial Monitor
#define SERV1 8 //servo 1 on digital port 8
#define SERV2 9 //servo 2 on digital port 9
#define SERV3 10 //servo 3 on digital port 10
#define SERV4 11 //servo 4 on digital port 11
#define SERV5 12 //servo 5 on digital port 12
#define SERV6 13 //servo 6 on digital port 13
Servo s1; //servo 1
Servo s2; //servo 2
Servo s3; //servo 3
Servo s4; //servo 4
Servo s5; //servo 5
Servo s6; //servo 6
//define starting angle for each servo
//choose a safe position to start from
//it will try to move instantaniously to that position when powered up!
//those angles will depend on the angle of each servo during the assemble
int angle1 = 90; //servo 1 current angle
int angle2 = 30; //servo 2 current angle
int angle3 = 0; //servo 3 current angle
int angle4 = 90; //servo 4 current angle
int angle5 = 90; //servo 5 current angle
int angle6 = 45; //servo 6 current angle
int servo_speed = 6; //speed of the servos
int angle1sp = 90; //servo 1 set point
int angle2sp = 30; //servo 2 set point
int angle3sp = 0; //servo 3 set point
int angle4sp = 90; //servo 4 set point
int angle5sp = 90; //servo 5 set point
int angle6sp = 45; //servo 6 set point
boolean display_angles = true; //boolean used to update the angle of each servo on Serial Monitor
在設置過程中,每個伺服都連接到一個特定的引腳,并且它的位置已經開始。
使用Arduino Mega的兩個串行端口:一個用于串行監視器通信,另一個用于與ESP8266-01模塊通信。兩個串行通信都在設置過程中啟動。
與ESP8266模塊的通信使用標準AT命令。
首先,Arduino發送命令用于模塊的其余部分(使用 AT + RST )。它將重啟模塊。 ESP8266模塊可能在工作站或作為接入點工作。它設置為站模式(使用 AT + CWMODE = 1 ),并接收連接到WiFi路由器的命令( AT + CWJAP = SSID,PASSWORD )。 while循環等待,直到連接成功。
AT + CIFSR 命令我用來顯示屬于ESP8266的IP地址。稍后將在控制界面上使用它。然后在端口80啟動Web服務器。這樣,ESP8266將能夠接收發往該IP地址和端口的消息。
//SETUP
void setup() {
//attach each servo to a pin and start its position
s1.attach(SERV1);
s1.write(angle1);
s2.attach(SERV2);
s2.write(angle2);
s3.attach(SERV3);
s3.write(angle3);
s4.attach(SERV4);
s4.write(angle4);
s5.attach(SERV5);
s5.write(angle5);
s6.attach(SERV6);
s6.write(angle6);
//start serial communication
Serial.begin(9600);
Serial.println(“Connecting.。.”);
Serial3.begin(9600);
//Wi-Fi connection
sendData(“AT+RST ”, 2000, DEBUG); //reset module
sendData(“AT+CWMODE=1 ”, 1000, DEBUG); //set station mode
sendData(“AT+CWJAP=”XXXXX“,”YYYYY“ ”, 2000, DEBUG); //connect wifi network
while(!Serial3.find(“OK”)) { //wait for connection
}
sendData(“AT+CIFSR ”, 1000, DEBUG); //show IP address
sendData(“AT+CIPMUX=1 ”, 1000, DEBUG); //allow multiple connections
sendData(“AT+CIPSERVER=1,80 ”, 1000, DEBUG); // start web server on port 80
}
主循環一遍又一遍地重復。在每次掃描期間,Arduino將檢查是否有傳入消息。如果是,它將讀取完整的字符串并將其分成六個較小的字符串。每一個都代表每個伺服的設定值。
void loop() {
if (Serial3.available()) //check if there is data available on ESP8266
{
if (Serial3.find(“+IPD,”)) //if there is a new command
{
String msg;
Serial3.find(“?”); //run cursor until command is found
msg = Serial3.readStringUntil(‘ ’); //read the message
String command = msg.substring(0, 3); //command is informed in the first 3 characters. “srs” = command to move the six servos
String valueStr1 = msg.substring(4, 7); //next 3 characters inform the desired angle
String valueStr2 = msg.substring(8,11); //next 3 characters inform the desired angle
String valueStr3 = msg.substring(12,15); //next 3 characters inform the desired angle
String valueStr4 = msg.substring(16,19); //next 3 characters inform the desired angle
String valueStr5 = msg.substring(20,23); //next 3 characters inform the desired angle
String valueStr6 = msg.substring(24,27); //next 3 characters inform the desired angle
int angle1sp = valueStr1.toInt(); //convert to integer
int angle2sp = valueStr2.toInt(); //convert to integer
int angle3sp = valueStr3.toInt(); //convert to integer
int angle4sp = valueStr4.toInt(); //convert to integer
int angle5sp = valueStr5.toInt(); //convert to integer
int angle6sp = valueStr6.toInt(); //convert to integer
代碼將以小步長增加/減小每個伺服的角度,直到它與接收的設定值匹配。在每個循環結束時,延遲用于限制電機的速度。
if (angle1 》 angle1sp) {
angle1 -= 1;
s1.write(angle1);
}
if (angle1 《 angle1sp) {
angle1 += 1;
s1.write(angle1);
}
。
。
。
delay(100/servo_speed);
步驟6:HTML接口
使用html和Javascript設計了一個簡單的控制界面。下載它,解壓縮并在您的Web瀏覽器中啟動它。我在Firefox和Google Chrome瀏覽器中測試過它。
為了向Arduino發送命令,用戶應輸入分配給ESP8266的IP地址。如前所述,您可以使用串行監視器獲取它。幸運的是,IP往往會在以下連接中重復出現。
在此控制界面上,用戶可以使用一些滑動條為每個關節選擇給定的角度。每個伺服的當前角度顯示在每個條形下。
向命令堆棧添加位置按鈕使用戶能夠將手臂的當前位置存儲在命令堆棧在文本框中。這樣,可以存儲一系列位置,每次移動之間都有一個可配置的延遲。
每個命令定義為 sr1:angle1 sr2:angle2 sr3:angle3 sr4:angle4 sr5:angle5 sr6 :angle6延遲:時間。角度以度和時間表示,以毫秒為單位。用戶還可以在文本框中手動編輯命令。
運行命令堆棧播放存儲在命令堆棧中的命令序列。 清除命令堆棧會清除命令列表。用戶還可以保存命令列表(在文本文件中)并稍后加載。這樣,可以存儲命令序列并重復它們。
解釋Html代碼:
Html文件分為頭部和主體部分。頭部僅顯示一些元數據并指示將在該文件上運行哪些javascript文件。
正文是定義所有輸入(文本形式,按鈕和滑動條)的位置。聲明了一個文本框,供用戶輸入每個將發送的命令的IP地址。它以給定的IP地址(192.168.0.9)開始,但您必須使用從串行監視器獲得的IP地址進行更新。
ESP8266 IP Address:
在六列中添加了六個滑動條表,每個伺服一個。滑桿使用范圍類型輸入定義,角度在0到180度之間。值參數給出每個伺服的起始角度,顯示在每個條形下方的文本字段中。
用戶可以通過用鼠標拖動滑塊來改變角度。釋放鼠標按鈕時,將調用 moveSrs()函數。它將在稍后描述。
Servo 1
定義了一個按鈕,用于將當前角度添加到命令堆棧。 addCommand()函數在單擊時被調用。其右側的文本框用于輸入兩個命令之間使用的時間延遲(以毫秒為單位)。
第二個表用于組織其他功能。定義了textarea來存儲命令堆棧。 Bellow它有兩個按鈕,用于調用 runCommands()和 clearCommads()函數。
Command stack:
Run command stack
Clear command stack
最后表中有一些用于保存和打開文本文件的按鈕。
Javascript代碼說明:
html接口調用兩個Javascript文件:jquery.js和myscript.js。在myscript.js中,我設計了自己的函數來與機器人進行交互。
如前所述,每當移動(和釋放)滑塊時, moveSrs()函數被調用。它具有每個伺服的角度作為輸入。它處理這些值(添加一些零,以便它總是有三位數)并向ESP8266模塊的IP地址發送消息。
function moveSrs(angle1, angle2, angle3, angle4, angle5, angle6)
{
TextVar = myform2.inputbox.value;
ArduinoVar = “http://” + TextVar + “:80”;
//add zeros
if (angle1 《 100) {
angle1 = “0” + angle1;
}
if (angle1 《 10) {
angle1 = “0” + angle1;
}
。
。
。
//send command
$.wait(5000).then($.get( ArduinoVar, { “srs”: angle1 + “ ” + angle2 + “ ” + angle3 + “ ” + angle4 + “ ” + angle5 + “ ” + angle6 }, function(data){alert(“data:” + data);})) ;
{Connection: close};
}
有一個 updateTextInput#( )每個伺服的功能。它僅用于使用伺服器的當前角度更新滑動條下的文本。
//update text under scroll bars
function updateTextInput1(val) {
document.getElementById(‘s1textInput’).value=val;
}
addCommand()函數只需向堆棧文本框中添加一個新行適當的角度和延遲。另一方面, clearCommand()清除該文本框。
//add command to the stack
function addCommand(val1, val2, val3, val4, val5, val6, val7) {
document.getElementById(‘inputTextToSave’).value = document.getElementById(‘inputTextToSave’).value + “sr1:” + val1 + “ sr2:” + val2 + “ sr3:” + val3 + “ sr4:” + val4 + “ sr5:” + val5 + “ sr6:” + val6 + “ delay:” + val7 + String.fromCharCode(13, 10);
}
//clear command stack
function clearCommand() {
document.getElementById(‘inputTextToSave’).value = “”;
}
runCommands()是處理命令堆棧的地方。它一次在線讀取并將其拆分以獲得該命令行中每個伺服的角度。我會注意到使用了 setTimout 函數。時間變量‘k’在每個命令行增加給定時間(延遲值)。使用 setTimout 函數,只有在給定時間過后才會發送新命令,并且ESP8266不會同時收到大量消息。否則,它會超出緩沖區并可能崩潰。
//run command stack
function runCommands(val) {
var k = 0;
step = 0;
var commands = val.split(“ ”),i;
for (i = 0; i 《 commands.length - 1; i++) {
setTimeout(function(data){
var angle1 = commands[step].split(“ ”)[0];
angle1 = angle1.split(“:”)[1];
var angle2 = commands[step].split(“ ”)[1];
angle2 = angle2.split(“:”)[1];
var angle3 = commands[step].split(“ ”)[2];
angle3 = angle3.split(“:”)[1];
var angle4 = commands[step].split(“ ”)[3];
angle4 = angle4.split(“:”)[1];
var angle5 = commands[step].split(“ ”)[4];
angle5 = angle5.split(“:”)[1];
var angle6 = commands[step].split(“ ”)[5];
angle6 = angle6.split(“:”)[1];
moveSrs(angle1, angle2, angle3, angle4, angle5, angle6);
step+=1;
},k);
var tempo = commands[step].split(“ ”)[6];
tempo = tempo.split(“:”)[1];
k += parseInt(tempo);
}
}
第7步:玩得開心!
將USB電纜插入計算機,打開串行監視器并打開機器人電源。
它將自動連接您的WiFi網絡并顯示其IP地址。保存該號碼。您現在可以移除USB電纜(甚至重置Arduino)。如果您嘗試將其再次連接到同一網絡,它可能會使用相同的IP地址。
在Web瀏覽器上打開該界面,然后輸入您之前看到的IP地址。計算機必須連接到同一個WiFi網絡。
選擇每個關節的角度并添加到一堆命令。任何兩個命令之間都可能使用延遲。請注意,在發送新命令之前,延遲必須足夠大以確保先前的命令已結束(機器人已達到最后設定點)。
您可以在.txt上保存命令堆棧文件并在以后使用。
保存一些動作,播放它們并享受樂趣!
-
機械臂
+關注
關注
12文章
510瀏覽量
24500 -
ESP8266
+關注
關注
50文章
962瀏覽量
44852
發布評論請先 登錄
相關推薦
評論