Nunchuk 控制机械臂(使用 Arduino)
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
图> 图> 图>
机械臂太棒了!世界各地的工厂都有它们,他们在那里精确地喷漆、焊接和搬运东西。它们还可以在太空探索、海底遥控车辆,甚至医疗应用中找到!
现在您可以在自己的家中、办公室或实验室中拥有更便宜的版本!厌倦了重复的工作?编程你自己的机器人来帮助你……或者把事情搞砸! :D
在本教程中,我将向您展示如何安装机械臂,以及如何使用 Arduino Mega 对其进行编程。对于这个项目,我还想体验一种不同的控制机械臂的方法:使用任天堂双节棍!它们很便宜,很容易找到,而且有很多传感器。
您可以通过多种方式使用本教程。如果您没有机械臂套件(并且不想购买或构建),您仍然可以使用它来学习有关 Arduino 编程的知识,以及如何将 Wii Nunchuk 连接到您自己的项目。您还可以用它来练习电子和机械技能。
第 1 步:工具和材料 图> 图> 图> 图>
本项目使用了以下工具和材料:
工具和材料:
- 烙铁和电线。 我不得不将一些端子焊接到 Nunchuk 的电线上,以便将其连接到 Arduino;
- 收缩管。 一些收缩管用于更好地隔离导体;
- 螺丝刀。 该结构使用一些螺栓和螺母安装;
- 6 轴机械桌面机械臂 (关联)。这个很棒的套件已经带有几个组件,如下所述。它可靠且易于组装;
- 12V 电源(2A 或更多);
- 双节棍控制器 (关联)。与Arduino板接口,用于控制机械臂;
- 公跳线(4根);
- Arduino Mega (链接/链接/链接)。请注意,我使用的机械臂套件也有一个板和控制器包,已经随此 Arduino 板提供。如果您不使用这些套件,您也可以使用其他 Arduino 板;
后来我得知有一个 Nunchuk 适配器 使与面包板的连接更容易(链接/链接)。如果您想在焊接时保持相同的时间并且不想像步骤 9 中描述的那样破坏原始连接器,这是一个不错的选择。
Sain Smart 6 轴机械桌面臂已经带有以下组件:
- Arduino Mega 2560 R3(链接)
- 控制板屏蔽(链接)
- NRF24L01+ 无线收发器模块(链接)
- MPU6050 3 轴陀螺仪和 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 个抓手
您可能会在网上找到其他机械臂套件,甚至可以设计自己的。例如,您可以 3D 打印一些很棒的项目。
在接下来的 7 个步骤中,我将向您展示如何在连接电路之前组装臂套件。如果您没有类似的套件,请随意跳一些步骤。您可以使用另一个机械臂套件,组装它并直接跳转到电子和编程步骤。
每一步都有一个 gif 动画,显示我的机械臂是如何组装的。它仅在网站的桌面版本上运行。
第 2 步:组装机械臂 Pt1 - 底座 图> 图>
第一个要组装的部分是机器人的底座。
它由两个 U 形支架组成,使用四个 M3 螺栓和螺母背靠背连接,如图所示。这大概是最容易安装的部分。
第 3 步:组装机械臂 Pt2 - 伺服 #1 图> 图> 图> 图>
第一个伺服电机使用伺服支架垂直安装在底座上。如图所示,该型材使用四个 M3 螺栓和螺母连接到底座上。伺服 #1 位于其顶部,并使用四个 M3 螺栓和螺母连接。
一个圆形金属喇叭连接到伺服轴上。该套件配有几个塑料喇叭。它们不会用于组装机器人。
第 4 步:组装机械臂 Pt3 - 伺服 #2 图> 图> 图> 图> 图> 图>
另一个伺服支架与前一个垂直安装。它使用四个 M3 螺栓连接到伺服 #1 喇叭。舵机#2用四个M3螺栓和螺母安装,同样使用圆形金属喇叭。
然后使用四个螺栓将 U 形支架连接到喇叭上。请注意,在伺服轴的对面使用了 M3 螺栓。它使结构具有稳定性。轴承安装在该螺栓上,并使用另一个 M3 螺母将其锁定到位。这样 U 型支架就紧紧地连接到伺服 #2 中心轴上。
第 5 步:组装机械臂 Pt4 - 伺服 #3 图> 图> 图> 图> 图>
使用四个 M3 螺栓和螺母安装另一个 U 型支架。
在另一端,使用圆形金属喇叭和四个螺栓安装伺服 #3。伺服支架连接到伺服电机上,L形型材通过一些螺栓和螺母连接到伺服支架上。
请注意,如前所述,在伺服轴的对面使用了另一个轴承。
第 6 步:组装机械臂 Pt4 - 伺服 #4 图> 图>
另一个 U 形支架使用一组四个 M3 螺栓和螺母连接到 L 形型材。与上一步类似,伺服 #4 使用四个螺栓安装到 U 型支架上。另一个舵机支架连接到舵机。
第 7 步:组装机械臂 Pt4 - 伺服 #5 图> 图>
第五个舵机使用另一个舵机支架与舵机 #4 垂直连接,使用四个 M3 螺栓和螺母安装。
第 8 步:组装机械臂 Pt4 - 伺服 #6 图> 图>
然后将夹具连接到伺服 #5 轴。在它的顶部,伺服 #6 使用一些螺栓、螺母和金属喇叭连接。夹持器有一些齿轮,可以将舵机的旋转变成夹持器的直线运动。
第 9 步:准备 Nunchuk 控制器 图> 图> 图> 图>
对于这个项目,出于多种原因,我决定使用 Nintendo Nunchuk 控制器:
- 它们很便宜! 副本可能质量较差,但我不需要这个项目的强大控制器;
- 它们很容易找到! 网上有几个原始和廉价的复制品。
- 它有很多传感器! 每个控制器有两个按钮(Z 和 C 按钮),一个两轴操纵杆(X 和 Y)和一个三轴加速度计;
- 它有一个 Arduino 库。 Robert Eisele 设计了一个惊人且易于使用的库,用于读取 Nunchuk 传感器。看看:https://www.xarg.org/2016/12/using-a-wii-nunchuk-with-arduino/
不幸的是,Nunchuk 操纵杆有一个复杂的连接器,很难与其他电子设备连接。为了将它连接到 Arduino,我不得不切断它的电缆并暴露它的电线。这样,它就不再适用于 Nintendo Wii... :/
首先,我必须切断操纵杆的连接器并去除电线的绝缘层。使用万用表,根据每根导线的颜色,我根据图中所示的连接器原理图确定每根导线(Vcc、GND、SCL 和 SDA)的功能。电线的颜色没有标准。我已经听说过以下可能性:
原文:
- SDA =绿色
- SCL =黄色
- 3V3 =红色
- GND =白色
副本#1:
- SDA =黄色
- SCL =白色
- 3V3 =绿色
- GND =红色
副本#2:
- SDA =蓝色
- SCL =白色
- 3V3 =粉红色
- GND =绿色
我将电线焊接到公跳线,以便更轻松地连接到 Arduino 板。为此,我使用了烙铁和一些收缩管,如图所示。
后来我得知有一个 Nunchuk 适配器可以更轻松地连接到面包板(链接/链接)。如果您想在焊接时保持相同的时间并且不想破坏原始连接器,这是一个不错的选择。
第 10 步:连接电路 图> 图>
组装好结构并完成 Nunchuk 连接器后,您就可以准备好连接电路了。我使用了机械臂套件随附的控制板防护罩。它使组件的连接更容易,因为它已经带有用于伺服电机、电源等的特定连接器。
按如下方式连接组件:
双节棍:
- Nunchuk pin 6 (SCL) => Arduino Mega Pin 21 (SCL)(在屏蔽上)
- Nunchuk pin 1 (SDA) => Arduino Mega Pin 20 (SDA)(在屏蔽上)
- Nunchuk pin 3 (Vcc) => Ardino Mega Pin 3V3(在屏蔽上)
- Nunchuk pin 4 (Gnd) => Arduino Mega Pin Gnd(在屏蔽上)
如果您使用的是 Arduino Uno,Nunchuk 的 SCL 和 SDA 引脚应连接到不同的 Arduino 引脚,如下所示:
- Nunchuk 引脚 6 (SCL) => Arduino Uno 引脚 A5
- Nunchuk 引脚 1 (SDA) => Arduino Uno 引脚 A4
- Nunchuk 引脚 3 (Vcc) => Ardino Uno 引脚 3V3
- Nunchuk pin 4 (Gnd) => Arduino Uno Pin Gnd
伺服:
- 控制屏蔽端子 11 => 伺服 #1
- 控制屏蔽端子 12 => 伺服 #2
- 控制屏蔽端子 13 => 伺服 #3
- 控制屏蔽端子 8 => 伺服 #4
- 控制屏蔽端子 9 => 伺服 #5
- 控制屏蔽端子 10 => 伺服 #6
如果您不使用控制屏蔽,则应使用以下引脚配置:
- Arduino Pin 11 => 伺服 #1 (Sgn)
- Arduino Pin 12 => 伺服 #2 (Sgn)
- Arduino Pin 13 => 伺服 #3 (Sgn)
- Arduino Pin 8 => 伺服 #4 (Sgn)
- Arduino Pin 9 => 伺服 #5 (Sgn)
- Arduino Pin 10 => 伺服 #6 (Sgn)
- Arduino 接地 => 伺服接地
- 6V 电源 => 伺服 Vcc
您还需要连接外部 12V 电源。我建议一个输出超过 2A 的。舵机耗电很大,如果电源不够大,舵机会振动并变得很热。他们也会失去力量。
在上传 Arduino 代码之前不要连接电源(在后面的步骤中显示)。盾牌上有一个电源按钮。保持在关闭位置。
将 USB 电缆插入 Arduino 并继续下一步。
第 11 步:设置 Arduino IDE 图>
现在硬件已准备就绪,是时候处理 Arduino 代码了。
1.下载并安装 Arduino IDE 最新版本 您可以在 Arduino 的网站上找到适用于 Windows、Linux 或 MAC OSX 的最新版本:https://www.arduino.cc/en/main/software
免费下载,将其安装到您的计算机上并启动。
2.添加库
对于这个项目,我使用了 Robert Eisele 令人惊叹的 Nunchuk Arduino 库!你可以在他的网站上找到更多关于它的信息:
https://www.xarg.org/2016/12/using-a-wii-nunchuk-with-arduino/
在 https://github.com/infusion/Fritzing/tree/master/Wii-Nunchuk 下载库
导航到 Sketch-> 包含库 -> 管理库 ...在您的 Arduino IDE 上添加库。
图书馆如何运作?
Nunchuk 库带有一组用于读取控制器传感器的函数:
nunchuk_buttonZ() :如果 Z 按钮被按下,则返回 1,否则返回 0; nunchuk_buttonC() :如果按下 C 按钮,则返回 1,否则返回 0; nunchuk_joystickX() :返回操纵杆的 x 值(-127 到 127 之间); nunchuk_joystickY() :返回操纵杆的 y 值(-127 到 127 之间); nunchuk_pitch() :以弧度为单位返回控制器的角度(在 -180º 和 180º 之间); nunchuk_roll() :以弧度为单位返回控制器的滚动角(-180º 到 180º 之间)。
角度以弧度返回。我在 Arduino 代码中将这些值转换为度数。
第 12 步:Arduino 代码 图> 图> 图> 图> 图>
下载Arduino的草图文件。
将 USB 电缆插入计算机的 USB 端口并上传代码。上传代码需要一些时间。您可以利用这段时间在等待时“喜欢”和“分享”本教程! :D
上传完成后,拔掉USB线,连接电源,打开电源按钮。代码将立即开始运行。
警告:当代码开始运行时,机械臂会非常快速地移动到它的初始位置。启动时注意不要受伤或损坏附近的设备!
您可能需要更换每个伺服电机的起始角度,具体取决于您的伺服器的安装方式。
代码解释:
在设置之前,代码会导入草图上使用的库(nunchuk.h、wire.h 和 servo.h ).
定义要使用的引脚,并声明全局变量。 角度# 整数变量存储每个伺服的初始位置。如果您希望机器人从不同的位置开始,请更改这些变量的值。
伺服#_speed 变量定义了每个伺服的运动速度。如果您希望特定伺服器移动得更快,请增加其值。 角度#min 和 angle#max 变量用于限制每个伺服的最大和最小角度。您可以设置这些变量以避免机器人的连续关节之间发生碰撞。
//包含库#include #include #include //定义变量#define SERV1 8 //数字端口8上的伺服1#define SERV2 9 //舵机2在数字端口9#define SERV3 10 //舵机3在数字端口10#define SERV4 11 //舵机4在数字端口11#define SERV5 12 //舵机5在数字端口12#define SERV6 13 / /servo 6 在数字端口 13Servo s1 上; //舵机1舵机s2; //伺服2伺服s3; //伺服3Servo s4; //伺服4Servo s5; //伺服5Servo s6; //servo 6//定义每个舵机的起始角度//选择一个安全的位置开始//它会在通电时立即尝试移动到那个位置!//这些角度将取决于每个舵机的角度组装角1 =90; //伺服1当前角度int angle2 =30; //伺服2当前角度int angle3 =0; //伺服3当前角度int angle4 =90; //伺服4当前angleint angle5 =90; //伺服5当前角度int angle6 =45; //舵机6当前角度intservo1_speed =3; //伺服1 speedintservo2_speed =3; //伺服2 speedintservo3_speed =3; //伺服3 speedint 伺服4_速度=1; //伺服4 speedint伺服5_速度=1; //伺服5速度//定义每个伺服的限制//这些角度将取决于组装期间每个伺服的角度angle1min =0; //伺服1最小角度int angle1max =180; //伺服1最大角度int angle2min =0; //舵机2最小角度int angle2max =180; //伺服2最大角度int angle3min =0; //伺服3最小角度int angle3max =180; //伺服3最大角度int angle4min =0; //舵机4最小角度int angle4max =180; //伺服4最大角度int angle5min =0; //舵机5最小角度int angle5max =180; //伺服5最大角度int angle6min =0; //舵机6最小角度int angle6max =180; //伺服6最大角度boolean display_angles =true; //boolean 用于更新串行监视器上每个舵机的角度
在设置过程中,每个舵机都连接到一个特定的引脚,并开始其位置。
串行通信(到串行监视器)和与 Nunchuk 的 I2C 通信也从这里开始。
//SETUPvoid setup() { //将每个舵机连接到一个引脚并开始其位置 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); //开始串行通信Serial.begin(9600); //启动双节棍线.begin(); nunchuk_init();}
主循环一遍又一遍地重复。在每个周期读取 Nunchuk 状态。根据读数,执行不同的命令。
void loop() { //读取双节棍传感器 if (nunchuk_read()) { int x =nunchuk_joystickX(); //操纵杆 X 位置 int y =nunchuk_joystickY(); //操纵杆 Y 位置 boolean z =nunchuk_buttonZ(); //z 按钮状态 boolean c =nunchuk_buttonC(); //c 按钮状态浮动间距 =nunchuk_pitch(); //俯仰角浮动滚动 =nunchuk_roll(); //滚动角度
操纵杆 X 将用于移动舵机 #1。
使用了以下代码块。首先它检查操纵杆的值是否足够大。这样,噪音和小的变化就被忽略了。如果该值满足要求,则舵机角度以给定速度增减。
//左转/右转(以固定速度) //左转 if (x> 90) { angle1 -=servo1_speed; display_angles =true;如果(角度 1 <角度 1 分钟){ 角度 1 =角度 1 分钟; } } //右转 if (x <-90) { angle1 +=servo1_speed; display_angles =true;如果(角度 1> 角度 1 最大值){ 角度 1 =角度 1 最大值; s1.write(angle1); //更新舵机位置
类似的块用于操纵杆 y。它用于改变伺服 #3 的角度。伺服 #2 在此代码中保持固定。
夹具的旋转由控制器的滚动角和俯仰角给出,由其加速度计测量。为了更容易控制手臂,只有在按下C或Z按钮时才会更新夹具的角度。
仅按下 C 按钮时,代码会读取横滚角并将其用作设定点。伺服 #5 旋转直到达到设定点。它的速度与实际位置和所需位置之间的误差成正比。类似的代码用于伺服 #4,它跟踪 Nunchuk 的俯仰角。
// 仅在按下按钮时启用加速度计 // 旋转夹具(仅按下 Z 按钮) if (c &&!z) { roll =roll * 57.0 + 90.0; //转换度数servo5_speed =abs(angle5 - roll)/10 + 1; //速度成比例做实际和期望角度之间的误差 if (roll> angle5) {angle5 +=servo5_speed; display_angles =true; } if (roll
只要同时按下 C 和 Z 按钮,夹具就会关闭。当这些按钮中的任何一个被释放时,机器人将打开其抓手。
//打开/关闭夹具(两个按钮都按下) if(z &&c) { s6.write(90); //关闭抓手 display_angles =true; } else { s6.write(45); //打开抓手 }
草图末尾有一段代码。它将在串行监视器上显示每个伺服电机的实际角度。可能有助于选择每个电机的启动角度。
双节棍
第 13 步:使用 图> 图> 图> 图>
现在一切都准备好了,给机器人加电,玩得开心!
Nunchuk 用于控制图中所示的五种运动:右/左旋转、上/下运动、夹爪旋转、夹爪上/下运动和夹爪打开/关闭运动。你可以结合这些动作来执行不同的任务。
您可以根据摇杆的按钮和角度的组合修改代码以实现不同的动作。
代码
- nunchuk.ino
nunchuk.inoArduino
无预览(仅限下载)。
Github
https://github.com/infusion/Fritzing/tree/master/Wii-Nunchukhttps://github.com/infusion/Fritzing/tree/master/Wii-Nunchuk制造工艺