Arduino蚂蚁六足机器人
在本教程中,我将向您展示我是如何构建 Arduino 六足机器人的。顾名思义,六足动物有 6 条腿,但除此之外,它还有尾巴或腹部、头部、触角、下颌骨,甚至还有功能性的眼睛。所有这一切,让六足动物看起来像一只蚂蚁,因此我们也可以称它为 Arduino Ant Robot。
您可以观看以下视频或阅读下面的书面教程。
为了控制机器人,我制作了一个定制的 Android 应用程序。该应用程序有 4 个按钮,我们可以通过这些按钮命令机器人向前或向后移动,以及向左或向右转。除了这些主要功能外,机器人还可以移动头部和尾部,还可以咬、抓、放东西,甚至可以攻击。
正如我之前提到的,机器人有功能性的眼睛,或者我专门设计了头部以适应超声波传感器。因此,如果我们尝试触摸机器人头部或将手靠近传感器,机器人就会开始准备攻击。
如果我们后退,机器人会解除攻击,但如果我们把手靠近它,它会攻击并咬我们。那么这有多酷呢?坚持下去,你会确切地了解我是如何构建它的以及一切是如何工作的。
像往常一样,我首先使用 3D 建模软件设计六足动物。六足有 6 条腿,每条腿由 3 个关节或 3 个伺服器组成。这意味着我们总共需要 18 个舵机,而我使用的是 MG996R 舵机。
在背面,我们有由另一个 MG996R 伺服驱动的尾巴。这个蚂蚁机器人的头部有两个自由度,或者它可以滚动和倾斜,它又是由另外两个伺服驱动的。所以这个项目总共需要 21 个舵机,型号为 MG996R,另外还有一个更小的 SG90 微舵机用于下颌骨。
在这里,我们还有蚂蚁的眼睛,它们的设计适合 HC-SR04 超声波传感器。所有部件都组装在两个板之间,另外我为顶板做了一个有趣的弧形盖,以隐藏两个板之间的所有接线、Arduino 和电池。
您可以找到并下载此 3D 模型,也可以在 Thangs 上的浏览器中进行探索。
STL 文件:
我想你已经知道接下来会发生什么,那就是 3D 打印机器人零件。我使用 Creality CR-10 3D 打印机进行所有打印,它做得很好。最难打印的部分是头部,因为我想成为一个单一的打印。
为此,我不得不使用 60 度的支撑悬垂角以及一些支撑挡板。无论如何,Creality CR-10 做得很好,头部也很完美。
打印完所有零件后,我们就可以继续组装六足机器人了。我开始组装腿。为了将伺服系统固定到打印部件上,我使用了 M3 螺栓和螺母,以及弹簧垫圈。螺栓的长度至少需要 12 毫米,在我的情况下,我使用了 16 毫米长的螺栓。
整个组件需要大约 200 个螺栓。为了将链接相互连接,我们使用随伺服套件一起提供的圆形喇叭作为附件。但是,我们需要在它们每个上钻3mm的孔,以便螺栓可以穿过,或者我们可以使用具有M3螺纹的金属圆角,可以单独购买。
在固定舵机的链接时,我们需要确保我们始终将它们连接在相同的位置并且它们具有完整的运动范围。
我们应该注意到,舵机的顶部有一个小三角形支撑,需要移除。我使用了一把简单的美工刀来做到这一点,这样就可以将伺服系统与印刷部件一起放置在闪光处。在插入第三个舵机之前,我们首先需要插入一个 M4 螺栓,用于连接支腿和底板。
这是腿组件的外观。它实际上很容易组装,但现在我们需要另外五个。
一旦我们准备好所有的腿,我们就可以继续将它们安装到机器人的身体或两个板上。首先,我们需要使用与之前相同的方法,使用 M3 螺栓和螺母将圆形喇叭固定到顶部平台上。然后我们可以简单地使用螺栓将它们连接到舵机轴上,但在此之前我们需要将舵机的位置调整到正好在中间。
这是必要的,这样我们才能获得舵机的全范围运动,也可以减少 Arduino 编程时的调整或校准过程。
固定好腿后,这个项目已经开始成型,看起来像一个六足动物。
背面还有一个圆形喇叭,用于尾舵,也需要固定这一点。
接下来我们需要将六足倒置放置,这样我们就可以将底板插入支腿的 M4 螺栓。然后我用一些平垫圈和自锁螺母将腿固定在上面。我们应该注意这些螺栓的拧紧程度,因为它们实际上是枢轴接头,并且腿也应该能够在足够安全的情况下旋转。
接下来,我们需要为头部安装第一个伺服系统,用于滚动运动。该伺服器应垂直于底板放置,因此为此我制作了两个小板,它们首先固定在伺服器上。然后我们可以在两个板之间插入舵机,我们可以很容易地用 M3 螺栓和螺母固定它。
然后我们有一个 U 形支架,在这里我们需要连接两个圆形喇叭来连接头部的两个伺服器。同样,在将支架固定到滚动伺服系统之前,我们需要确保伺服系统的位置在中间,以便它可以双向旋转 90 度。
接下来是倾斜伺服支架。所以这里首先我们需要插入一个 M4 螺栓并将其固定到 U 形支架上。在安装倾斜电机之前,我们还需要插入四个 M3 螺栓,稍后将用于固定头部。然后我们可以将倾斜伺服插入支架,并小心地将轴安装到圆角上。这里有点紧,但 U 形支架可以帮助弯曲一点。
最后,我们需要用 M3 螺栓固定伺服系统,这样头部机构就完成了。现在它可以滚动和倾斜。
在将头部连接到机构之前,我们需要预先组装它,或者使用小型 SG90 伺服系统和超声波传感器连接下颌骨。这里还是有点紧,但我仍然设法插入第一下颌骨并使用 M4 螺栓将其固定在头部。
可以看到,眼睛区域有一个专门设计的小孔,我们可以通过螺丝刀拧紧螺栓。
接下来是微伺服到位,并使用两个螺钉固定。在第二个下颌骨上,我们首先需要为 SG90 伺服系统连接一个小臂喇叭。
然后我们可以将下颌骨插入到位,将两个齿轮配对并使用螺丝刀将其固定到电机轴上。
接下来我们可以将超声波传感器放置到位。眼孔完全适合超声波传感器,所以我只需使用几滴 AC 胶水将传感器固定到头部。
还有一个细节要添加到头部,那就是天线。为此,我使用了 3 毫米的刻度线,我将其切成 13 厘米左右的长度,然后稍微弯曲它以获得所需的形状。我再次使用几滴 AC 胶水将它们固定在头部。最后,我们可以使用之前插入的四个螺栓将头部连接到滚动和倾斜机构。
头部现在功能齐全,可以滚动,可以倾斜,甚至可以咬人。还有两个需要安装的 3D 打印部件。那是可以简单地滑入尾支架和弯曲盖的尾巴,我们将在最后实际使用它来遮盖电子设备。所以这是我们的蚂蚁机器人的最终外观,我真的很喜欢这种蓝白色组合的结果。
好的,现在我们可以继续使用电子设备了。这是这个项目的电路图,虽然看起来有点复杂,但实际上很简单,因为舵机连接很多。
除了 22 个舵机之外,我们还需要一个用于智能手机通信的 HC-05 蓝牙模块以及一些电容器和电阻器。当然,机器人的大脑是一块 Arduino 板,在这种情况下就是 Arduino Mega,因为它是唯一可以使用 Servo 库控制超过 12 个舵机的板。
相关教程:伺服电机如何工作以及如何使用 Arduino 控制伺服
为了给机器人供电,我将使用电压约为 12V 的 3S LiPo 电池。锂聚合物电池可以处理更高的电流消耗,因此它们适合这个项目,因为如果所有伺服系统在满载时同时接合,它们可以消耗大约 10 安培的电流。但是舵机的工作电压限制在 4.8 到 7.2V,这意味着我需要使用 DC-DC 降压转换器将 12V 转换为 5V。即使我们使用 2S LiPo 电池,满载时电压约为 7.4V 或 8.4V,我们仍然需要使用降压转换器。我将用于该项目的降压转换器可以处理高达 8 安培的电流,但我建议使用 10 至 15A 的电流,以确保您有足够的功率并且不会过热。就我而言,我在移动时注意到机器人的最大电流消耗约为 6 安培。
您可以从以下链接获取此项目所需的组件:
现在,如果我们尝试将所有东西连接在一起,那将是一团糟,因为有许多伺服连接。因此,我使用 EasyEDA 免费在线电路设计软件设计了一个定制 PCB。该 PCB 实际上将充当 Hexapod 的 Arduno Mega Shield,因为我们将能够直接将其连接到 Arduino Mega Board 的顶部。我将舵机连接安排得彼此靠近,并在它们旁边放了两个大电容器,以保持电压更稳定。我还包括一个 NRF24L01 收发器模块的连接,以防我们想使用无线电控制来控制机器人。有几个数字和模拟引脚连接、5V 和接地连接、两个 LED 连接以及一个用于监控电池电压的连接。 12V 电池电压将通过由两个电阻器 R1 和 R2 组成的分压器,将电压降低到 5V 以下,以便模拟引脚可以安全地读取它。这样我们就可以知道什么时候需要给电池充电了。
这是此 PCB 设计的项目文件的链接。所以一旦我完成了设计,我就生成了制造 PCB 所需的 Gerber 文件。
格柏文件:
然后我从 JLCPCB 订购了 PCB,这实际上是这个视频的赞助商。
在这里,我们可以简单地拖放 Gerber 文件,上传后,我们可以在 Gerber 查看器中查看我们的 PCB。如果一切正常,那么我们可以继续选择我们想要的 PCB 属性。在这种情况下,我选择 PCB 颜色为蓝色,以便与 Arduino 板颜色相匹配。就是这样,现在我们可以以合理的价格简单地订购我们的 PCB。请注意,如果这是您从 JLCPCB 订购的第一个订单,您只需 2 美元即可获得多达 10 个 PCB。
几天后,多氯联苯已经到货了。 PCB的质量很好,一切都与设计中的完全一样。
好的,现在我们可以继续组装PCB了。我首先将公针头焊接到用于将其连接到 Arduino 板的 PCB 上。一旦我们将排针放在底部,我们可以使用某种板来固定销并翻转电路板。现在我们需要将它们全部焊接到 PCB 上。完成后,我们可以继续进行伺服连接,我们还需要公排针。
此时,我们实际上可以插入所有连接的排针,并使用相同的方法翻转 PCB 并将所有引脚焊接到上面。最后我们需要焊接电阻、电容和接线端子。就是这样,我们的蚂蚁机器人的 Arduino Mega Shield 现已准备就绪。现在我们可以简单地将它插入到 Arduino 板上。
接下来我们需要将降压转换器的输出电压设置为 5V。我们可以通过调整降压转换器的电位器来做到这一点。您可以注意到这里我在输入端添加了一个电源开关,并将电池 12V 连接到 PCB 上的 12V 引脚,该引脚仅用于监控电池电压。
请记住,PCB 的主输入必须是 5V。
所以现在我们可以在两个板之间插入电子元件。再次有点紧,但我们仍然可以安装所有东西。首先是我用胶带固定它的电池,然后是 Arduino 和我们制作的 PCB。接下来,我们可以连接 NRF24L01 收发器或仅连接蓝牙模块,具体取决于我们将使用的通信类型。我还插入了一个 LED,用于指示电池何时需要充电,或者电压降至 11V 以下。最后,我们需要将所有伺服系统连接到伺服引脚。在执行此操作时,请务必记下您连接每个伺服的引脚号。连接所有舵机后,我们可以简单地将弧形盖板放在顶板上,我们实际上完成了这个项目。
本视频剩下要做的就是看看 Arduino 程序是如何工作的。由于代码有点长,为了更好的理解,我将把程序的源代码分节贴出来,每个节都有说明。并且在文末我会贴出完整的源码。
因此,为了控制舵机,我们将使用基本的 Servo 库,而对于蓝牙通信,我们还需要包含 SoftwareSerial 库。首先我们需要定义所有伺服对象以及下面程序所需的一些变量。
在设置部分,我们需要初始化蓝牙通信、超声波传感器的引脚模式、LED,并定义舵机连接的引脚。
然后使用 write() 函数,我们将伺服系统移动到它们的初始位置。这实际上是我们可以校准伺服系统的地方。考虑到您在组装机器人时无法将每个伺服器设置在准确的位置,但在这里我们可以进行调整并找出我们的初始值,然后我们可以从那里对机器人运动进行编程。
在对六足运动进行编程时,有几种方法可以完成,例如使用正向或反向运动学。这些方法包括一些严肃的数学,其中每个关节的位置是根据身体所需最终位置的输入来计算的。但是,我决定让它变得不那么复杂,因为无论如何我使用的伺服系统都不足以完成这样的任务。那是因为我的舵机是 MG996R 舵机的廉价版。它们没有正确的扭矩,而且它们并不总是准确地定位在所需的位置。
那么让我们看看我是如何让六足行走的。我制作了一个单独的自定义函数来移动每条腿。腿部循环包括两个阶段,称为摆动和站立。在摆动阶段,腿通过空气从初始位置移动到最终位置,而在站立阶段,腿从最终位置移动回到初始位置,腿末端执行器接触地面。这样六足的身体就会向前移动。
所以我手动编程每个舵机的位置,以使用主循环和一些计数器来实现这些运动。
因此,首先两个外部伺服器抬高腿,连接到身体的第三个伺服器开始沿特定方向旋转。当第三个舵机在它停止旋转前 10 步时,我们开始将外部的两个舵机向后移动到相同的位置以接触地面。这完成了摆动阶段,或腿从其初始位置移动到最终位置。然后我们将第三个伺服从最终位置旋转回初始位置,这样就完成了站立阶段。支路执行一个周期后,计数器被重置,支路将一遍又一遍地重复循环。每个迭代或步骤都在主循环部分执行,其中还有一个控制伺服速度的延迟时间。我为所有其他腿制作了类似的功能,以及一些额外的功能,用于使腿向相反方向移动以实现反向、左右移动。以类似的方式使用计数器来跟踪我对其余功能的编程,例如移动头部、移动尾部、下颌骨等。
所以举个例子,如果我们想让机器人向前移动,我们需要调用六个 moveLeg() 自定义函数,这些函数会在主循环中不断重复。
您可以注意到 3 条腿是偏移的,因此当 1 号腿 3 和 5 处于摆动阶段时,其他 3 条腿 2、4 和 6 处于站立阶段。如果我们想向左移动,我们调用相应的 moveLeft() 函数。
这些命令实际上来自蓝牙模块或我们智能手机上定制的 Android 应用程序。
现在让我们看一下这个应用程序,看看它实际上向 Arduino 发送了什么样的数据。我使用 MIT App Inventor 在线应用程序制作了这个应用程序,它是这样工作的。
所以应用程序的图形实际上是我制作并放置为按钮的图像。在底部我们有一个用于控制机器人速度的滑块,在顶部是用于连接蓝牙模块的按钮。
让我们看一下程序或应用程序背后的块。
因此,例如,如果我们单击 Forward 按钮,“if”语句中的块将被执行。这意味着我们会将数字 2 发送到 Arduino 并执行前进的功能集。同时我们可以注意到我们将按钮的图像更改为同一图像的另一个突出显示的版本。如果我们再次按下相同的按钮,现在将执行“else”语句中的块,并将数字 0 发送到 Arduino,Arduino 将重置所有计数器并将机器人移动到初始位置。我们还设置了该按钮的初始图像。所以我对所有其他按钮都使用了相同的原理。
以下是上述 MIT App Inventor 项目的下载文件,以及准备安装在智能手机上的 Android App:
让我们看一下Arduino程序中的另外两个功能,那就是电池电压监测器和超声波传感器。
因此,如果电池电压低于 11 伏,我们将打开 LED,如果超声波传感器检测到距离小于 40 厘米的物体,机器人就会准备攻击。
如果前面不再有物体,它会解除攻击,如果物体仍然存在并且靠近头部,机器人就会攻击。
这就是这个视频的全部内容。
在这里您可以下载此 Arduino Hexapod 项目的完整代码:
请注意,如果您决定构建此项目,则需要准备好面对一些挑战。对我来说最大的问题是我使用的伺服系统性能不佳。我希望你喜欢这个视频并学到了一些新东西。随时在下面的评论部分提出任何问题,并查看我的 Arduino 项目收藏。概览
Arduino Hexapod – 蚂蚁机器人 3D 模型
3D 打印零件
组装 Arduino 六足位移台
Arduino Ant 机器人电路图
为 Arduino Hexapod 设计 PCB
组装PCB
Arduino Hexapod 代码
#include <Servo.h>
#include <SoftwareSerial.h>
#define trigPin 7
#define echoPin 6
#define ledB 10
SoftwareSerial Bluetooth(12, 9); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)
// Create servo object
Servo s24;
Servo s23;
Servo s22;
Code language: Arduino (arduino)void setup() {
Serial.begin(38400);
Bluetooth.begin(38400); // Default baud rate of the Bluetooth module
Bluetooth.setTimeout(1);
delay(20);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(ledB, OUTPUT);
// Head
s15.attach(36, 600, 2400);
s14.attach(35, 600, 2400);
s13.attach(34, 600, 2400); //grip
// Tail
s5.attach(26, 600, 2400); // Tail
// Leg 4
s10.attach(31, 600, 2400);
s11.attach(32, 600, 2400);
s12.attach(33, 600, 2400); //rot
// Leg 5
s7.attach(28, 600, 2400);
s8.attach(29, 600, 2400);
s9.attach(30, 600, 2400); //rot
// Leg 6
s1.attach(22, 600, 2400);
s2.attach(23, 600, 2400);
s3.attach(24, 600, 2400); //rot
// Leg 1
s18.attach(39, 600, 2400);
s17.attach(38, 600, 2400);
s16.attach(37, 600, 2400); //rot
// Leg 2
s21.attach(42, 600, 2400);
s20.attach(41, 600, 2400);
s19.attach(40, 600, 2400); //rot
// Leg 3
s24.attach(45, 600, 2400);
s23.attach(44, 600, 2400);
s22.attach(43, 600, 2400); //rot
Code language: Arduino (arduino)// == Move to initial position
// Head
s15.write(72);
s14.write(50);
s13.write(90); // Grip
s5.write(65); // Tail
// Leg 4
s10.write(65);
s11.write(35);
s12.write(40);
// Leg 5
s7.write(80);
s8.write(50);
s9.write(25);
// Leg 6
s1.write(90);
s2.write(45);
s3.write(60);
// Leg 1
s18.write(60);
s17.write(90);
s16.write(100);
// Leg 2
s21.write(50);
s20.write(85);
s19.write(75);
// Leg 3
s24.write(50);
s23.write(80);
s22.write(80);
Code language: Arduino (arduino)void moveLeg1() {
// Swign phase - move leg though air - from initial to final position
// Rise the leg
if (i1L1 <= 10) {
s18.write(60 - i1L1 * 2);
s17.write(90 - i1L1 * 3);
i1L1++;
}
// Rotate the leg
if (i2L1 <= 30) {
s16.write(100 - i2L1);
i2L1++;
}
// Move back to touch the ground
if (i2L1 > 20 & i3L1 <= 10) {
s18.write(40 + i3L1 * 2);
s17.write(60 + i3L1 * 3);
i3L1++;
}
// Stance phase - move leg while touching the ground
// Rotate back to initial position
if (i2L1 >= 30) {
s16.write(70 + i4L1);
i4L1++;
l1status = HIGH;
}
// Reset the counters for repeating the process
if (i4L1 >= 30) {
i1L1 = 0;
i2L1 = 0;
i3L1 = 0;
i4L1 = 0;
i5L1 = 0;
}
// Each iteration or step is executed in the main loop section where there is also a delay time for controlling the speed of movement
}
Code language: Arduino (arduino)// Move forward
if (m == 2) {
moveLeg1();
moveLeg3();
moveLeg5();
if (l1status == HIGH) {
moveLeg2();
moveLeg4();
moveLeg6();
}
}
Code language: Arduino (arduino)// Check for incoming data
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.read(); // Read the data
Code language: Arduino (arduino)Arduino Ant 机器人安卓应用
// Monitor the battery voltage
int sensorValue = analogRead(A3);
float voltage = sensorValue * (5.00 / 1023.00) * 2.9; // Convert the reading values from 5v to suitable 12V i
Serial.println(voltage);
// If voltage is below 11V turn on the LED
if (voltage < 11) {
digitalWrite(ledB, HIGH);
}
else {
digitalWrite(ledB, LOW);
}
Code language: Arduino (arduino)// Get the distance from the ultrasonic sensor
if (getDistance() > 40) {
att = 0;
}
if (getDistance() <= 40) {
att = 1;
dataIn = 99;
}
Code language: Arduino (arduino)// If there is an object in front of the sensor prepare for attack
if (att == 1) {
prepareAttack();
if (aStatus == HIGH) {
while (a == 0) {
delay(2000);
a = 1;
}
if (getDistance() > 30) {
att = 2;
a = 0;
aStatus = LOW;
initialPosHead();
}
if (getDistance() < 30) {
att = 3;
a = 0;
aStatus = LOW;
initialPosHead();
}
}
}
// If there is no longer object in front, dismiss the attack
if (att == 2) {
dismissAttack();
if (aStatus == HIGH) {
dataIn = 0;
att = 0;
}
}
// If there is closer to the sensor attack
if (att == 3) {
attack();
if (attStatus == HIGH) {
while (aa == 0) {
delay(2000);
aa = 1;
} attStatus = LOW;
}
if (aStatus == HIGH) {
while (a == 0) {
delay(2000);
a = 1;
}
dataIn = 0;
att = 0;
initialPosHead();
}
}
Code language: Arduino (arduino)
制造工艺