0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用ESP8266WiFi模块控制机械臂

454398 来源:wv 2019-09-20 10:08 次阅读

第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代码了。

1。下载并安装Arduino IDE最新版

您可以在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

    文章

    515

    浏览量

    24583
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    45000
收藏 人收藏

    评论

    相关推荐

    ESP8266笔记-05.ESP8266 WIFI的使用

    ESP8266是怎么火起来的?毫无疑问就是他把WIFI模块的价格成功的打了下来,在我第一次看到ESP8266仅仅10元成本的开发板竟然可以连接WIF
    发表于 10-31 18:33

    ESP8266 太空人动画的 OLED 显示

    ESP8266 太空人动画的 OLED 显示
    的头像 发表于 10-08 15:06 278次阅读
    <b class='flag-5'>ESP8266</b> 太空人动画的 OLED 显示

    ESP8266 通过 MQTT 协议实现 LED 的远程控制

    本文简要介绍了搭建 EMQX 服务器实现基于 MQTT 协议远程控制 NodeMCU ESP8266 板载 LED 的解决方案。
    的头像 发表于 09-25 09:11 2008次阅读
    <b class='flag-5'>ESP8266</b> 通过 MQTT 协议实现 LED 的远程<b class='flag-5'>控制</b>

    arduino(1)--ESP8266配置

    硬件准备 首先需要准备一个开发板,这里我准备的是淘宝购买的兼容arduino的ESP8266模块。 arduino配置 我使用的是arduino来编程实现,故需要下载对应的库文件,打开
    发表于 09-06 11:00

    esp32和esp8266代码共用吗

    本文将介绍ESP32和ESP8266两款流行的微控制器在代码共用性方面的可能性与差异性。 一、引言 随着物联网技术的飞速发展,越来越多的智能设备开始进入我们的生活。其中,ESP32和
    的头像 发表于 08-19 18:23 1152次阅读

    esp8266esp32区别是什么

    以下是关于ESP8266ESP32的主要区别: 处理器和架构 : ESP8266 :使用一个Tensilica L106 80MHz的处理器,属于Xtensa架构。 ESP32 :使
    的头像 发表于 08-19 18:16 5400次阅读

    esp8266不烧录可以使用吗

    ESP8266是一款非常流行的Wi-Fi模块,广泛应用于物联网项目中。然而,如果不进行烧录,ESP8266将无法正常工作。 1. ESP8266简介
    的头像 发表于 08-19 17:28 806次阅读

    esp8266wifi模块怎么连接手机

    ESP8266 WiFi模块连接手机主要可以通过两种方式实现: 通过路由器连接(STA模式)和直接作为热点连接(AP模式) 。以下是两种连接方式的步骤: 一、通过路由器连接(STA模式) 配置
    的头像 发表于 08-19 17:27 2812次阅读

    如何使用ESP8266创建一个WiFi热点?

    我有第二张提供免费互联网的SIM卡,但我无法在手机中使用它,因为我只有一个SIM卡插槽。 因此,我想使用ESP8266创建一个WiFi热点,并使其将接收到的所有流量路由到包含我的第二张SIM卡
    发表于 07-19 11:29

    如何给ESP8266模块命名?

    我正在为我ESP8266模块分配一个名称。我想使用名称访问它,而不是 Station 模式下的 IP 地址。有什么建议怎么做吗? 我正在使用本机代码和 AT 命令。我在 WIFI AP 中为
    发表于 07-19 08:47

    esp8266 wifi模块CIPSEND发送返回no tail的原因?

    问题介绍:最近在做一个wifi通信的项目,用到了esp8266的模组,GMR版本信息如下; L:9 D:AT+GMR L:43 D:AT version:0.60.0.0(Jan 29 2016
    发表于 07-16 07:27

    请问ESP8266为什么无法加入AP?

    我正在使用ESP8266最新的 SDK 版本 3.4。我编写了一个将加入 AP 的代码。代码在 ESP8266 Devkit 上运行,但不在 ESP01 模块上运行。在两个
    发表于 07-08 08:24

    ESP8266网络天气时钟OLED显示

    基于ESP8266实现网络获取天气和时钟并OLED显示
    的头像 发表于 06-28 04:46 1166次阅读
    <b class='flag-5'>ESP8266</b>网络天气时钟OLED显示

    国产低成本Wi-Fi SoC解决方案芯片ESP8266ESP8285对比差异

    ESP8266ESP8285对比差异 ESP8285相当于在ESP8266基础上多加了1/2MB Flash, ESP8285与
    的头像 发表于 05-17 11:44 1338次阅读
    国产低成本Wi-Fi SoC解决方案芯片<b class='flag-5'>ESP8266</b>与<b class='flag-5'>ESP</b>8285对比差异

    使用Wi-Fi ESP8266方案模组接入云平台

    ESP8266模块芯片是基于无线通信协议的UARTWi-Fi透传模块芯片,支持802.11b/g/n的无线标准,并带有三种可选择的工作模式。ESP8266
    的头像 发表于 05-10 08:20 1853次阅读
    使用Wi-Fi <b class='flag-5'>ESP8266</b>方案模组接入云平台