第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文章
509浏览量
24491 -
ESP8266
+关注
关注
50文章
962浏览量
44825
发布评论请先 登录
相关推荐
评论