当前位置:网站首页>Arduino六足机器人
Arduino六足机器人
2022-07-06 00:23:00 【acktomas】
Arduino六足机器人第一部分—机制与接线
这篇文章来源于DevicePlus.com英语网站的翻译稿。
六足机器人是最炫酷的机器人之一,但是通常价格昂贵。原因之一是它们由多个零部件组成,并且使用18个伺服,而这些都需要由某些微控制器来供电和驱动。在本教程中,我将展示如何通过使用3D打印所有零部件并仅使用12个伺服来构建您自己的Arduino六足机器人,或简称为Ardupod。准备好了吗?那让我们开始吧!
硬件
- • Arduino UNO (或其他可兼容Arduino的开发板)
- • Adafruit 16通道PWM扩展板(或模块;但是,此处强烈建议使用该扩展板,因为它的原型面积很小)
- • 12个带有金属齿轮的微型伺服(MG90S或其他同等规格产品)
- • 4.8V或6V电池(镍氢、锂离子等)
- • 60个M3螺栓+120个螺母和垫圈(仅用于身体,对于其他部件的安装您需要再另外添加)
- • 6个相同的圆珠笔弹簧
- • HC-SR04超声波测距模块(可选)
软件
- • Arduino IDE
- • SolidWorks或其他3D建模软件
- • Github – 您在这里可以找到所有用于打印的 Arduino源代码和3D模型
其他工具
- • 3D 打印机
- • 非常建议使用万用表、烙铁和电钻等其他工具
设计
如上所述,本次所设计的六足机器人仅需要12个伺服来移动六条腿。这意味着每条腿只配有两个伺服,具有两个自由度(DOF)。与通常的每条腿有三个伺服相比,这种方法有几个优点。我们将需要更少的功率以及更少的处理时间来驱动伺服。但是,移除一个伺服也意味着我们牺牲了一个自由度,因此在对机器人进行稳定爬行的编程上会更具有挑战性。
为了弥补缺少一个伺服所带来的缺陷,所有腿部都有一个可以将伺服的角运动转换为腿部线性运动的机械系统。
该机制内含一个弹簧。弹簧的作用是对在打印过程中造成的所有误差进行补偿。另外,弹簧还可以提供更强大的支撑力,从而有助于实现更自然的爬行运动。您可以在任何地方获取弹簧。比如,圆珠笔里的小弹簧就可以用在这里,但是您可能需要稍微修剪一下长度。请确保您所获取的弹簧可以压缩,并且足够支撑机器人的重量。此外,在开始打印零部件之前,请确保弹簧适用于打印好的部件 leg_1和 leg_1_seg_1(详情参见 Github )。
组装
接下来,欢迎进入本文中最难的部分:组装腿部。无论是在构建上还是编程上,这都属于相当高阶的一个项目。我们将假设打算制造这台机器人的人对于使用诸如电钻和烙铁之类的设备具有基本的操作技能。
图1:腿部组装概览
图2:腿部组装细节
图3:组装好的腿部
组装腿部时,请始终记得必须在每两个需要上下移动的塑料件之间放置一个垫圈。您可能需要用电钻调整孔的大小,保证螺栓能够自由旋转。同时,请注意每个螺栓需要两个螺母。
图4:连接腿部关节:塑料件(黑色)和金属件(浅灰色)
这对于保持整个支撑系统的正常工作十分重要。组装腿部时,请确保不要将底部螺母拧得太紧,并调整至使塑料部件仍可以自由移动。然后,顶部螺母要尽可能拧到最紧。底部螺母保证了所有部件的自由移动,而顶部螺母保证了所有部件的紧固连接。如果您的螺母拧的过松,那么腿部会变得非常不稳定;如果拧的过紧,将会对伺服带来不必要的负载。对腿部的调整可能要经过几次尝试才能完成。这是本教程中最重要的部分,因此请确保正确完成此步骤。
伺服通过一个小小的“三角臂”来固定在适当位置,这种三角臂通常用于将伺服齿轮轴连接到您想要移动的任何物体上。但是,在这种情况下,三角臂的位置将会被固定,以便当伺服运转时,它也会自行移动,从而使腿部移动。
请确保您使用的是金属齿轮伺服,而不是塑料齿轮伺服!在这种应用中如果使用塑料齿轮,不仅强度比金属的低,而且其齿轮也可能会很快就损坏。
图5:伺服附件细节。确保三角臂固定在适当位置。
伺服支架分为三部分,使其更易于打印。假设零部件是用丙烯晴丁二烯苯乙烯(ABS)打印的,那么可以使用丙酮来稍微溶解ABS,然后将这三部分粘在一起,再使其变干。或者,如果您有条件使用更高质量的3D打印机,也可以一次性打印出整个部件。
图6:伺服支架组装细节
六足机器人的剩余部分就没有那么复杂了:机身身体由两块板组成,我们可以在其上安装所需的所有电子设备、电池和传感器。您可以在打印之前设定好用于安装电子设备的孔,也可以在打印之后再钻孔。所有零部件和打印说明均可在 Github上获取。
图7:组装好的身体:“A”为上板,“B”为底板。您还可以看到安装在伺服上的超声波传感器。
成功!到这里,您已经完成了机器人的组装,完成了本教程中最困难的部分。如果出现了什么问题,请不要担心,再次进行尝试。如有必要,请尝试对打印件进行微调,然后查看是否有效。
接线
到目前为止,这是最简单的部分了,因为我们将使用 Adafruit PWM扩展板来完成大部分工作。我们把扩展板连接到 Arduino,然后把伺服连接到扩展板。如果您使用的模块无法直接连接到 Arduino,只需要将SDA、SCL以及 V+连接到 Arduino相应引脚即可(详细信息请参见下图)。
您可能已经注意到了,这里有一个放置电容器的位置,但是却没有电容器。不用担心,这是有意为之!当许多伺服同时运转时,电流峰值将达到几安培。电容器将用来消除这些尖峰。您可能需要这种电容器来确保所有伺服的电源稳定。对于这种目的,使用电解电容器是最合适的,但是对电容值的选择更多的是凭借猜测,而不是确切的科学计算。通常来说,电容值越大越好。电容器的电压应略高于电池电压,因此,如果使用6V电池为所有伺服供电,那么6.3V 4700µF应该可以满足需求。
图8:接线图
在扩展板上,您还会注意到有一个单独的电源端子。那是因为 Arduino本身无法提供足够的电流来一次运行一个以上或两个以上的伺服,需要将电池连接到此端子以及 Arduino电源输入端(VIN和GND引脚)。
就是这样,基本的接线已经完成!如果需要,您还可以添加更多模块和传感器,例如超声波测距仪。
图9:接线细节:建议将所有连接到同一条腿上的伺服的电缆困扎在一起。这样,您将就知道哪条电缆通向哪个伺服。而且,这样看起来也会比一团缠结的线缆更美观一些。
图10:带有 HC-SR04超声波传感器的接线图
在本教程中,我将添加一个超声波传感器,以使机器人能够在附近有障碍物的情况下移动。我之所以选择 HC-SR04,是因为它们非常便宜,并且易于与 Arduino一起使用。而且,这种特定传感器的形状类似于眼睛,您可以借此来分辨出机器人在看什么!
我将传感器安装在一个额外的伺服上(有关安装细节请参见图7)。对该传感器进行接线也非常简单,只是请注意不要将VCC引脚直接连接到电池上!如果您使用的是6V电池,这样连接可能会损坏传感器。将VCC引脚连接到 Arduino 5V输出端,并将GND连接到GND。您可以将TRIG和ECHO引脚连接到剩下的任何数字引脚上,但要记得在代码中对它们进行适当设置。我将它们连接到引脚3(TRIG)和引脚2(ECHO)上,因为我想在需要串行端口的情况下保持引脚0和1断开。
结论
现在,您应该已经完成了所有硬件的组装。接通电源之前,强烈建议您对所建立的每个连接进行测试和确认。
希望您到目前为止没有遇到很棘手的问题。如果您对该设计有任何改进的建议,请在 Github上与我交流!请继续关注本项目的第二部分,我们将进入到下一阶段,进一步研究分析逆动力学,并且对这个神奇的 Arduino六角机器人(或者Ardupod )进行编程。
Arduino六足机器人第二部分:编程
这篇文章来源于DevicePlus.com英语网站的翻译稿。
在本项目的第二部分中,我们将继续进行项目中相对容易的内容—编程。对六足机器人进行编程通常有两种不同的方法。第一种是仅仅弄清楚机器人向前行走的一系列伺服运转。显然,这是一个艰难却鲜见成效的工作—您所设计的代码无法直接应用于另一台六足机器人上。所以第二种被称为逆运动学的方法应运而生。但是首先,我们需要改进板载微控制器。
硬件
- • Arduino Mega
- • Adafruit 16通道PWM扩展板(或模块;但是,此处强烈建议使用该扩展板,因为它的原型面积很小)
- • 12个带有金属齿轮的微型伺服(MG90S或其他同等规格产品)
- • 4.8V或6V电池(镍氢、锂离子等)
- • 60个M3螺栓+120个螺母和垫圈(仅用于身体,对于其他部件的安装您需要再另外添加)
- • 6个相同的圆珠笔弹簧
- • HC-SR04超声波测距模块(可选)
软件
- • Arduino IDE
- • Github – 您在这里可以找到所有用于打印的 Arduino源代码和3D模型
UNO -> Mega
在上一篇文章中,我们建议在本项目中使用Arduino UNO。但是,在使用UNO时我遇到了一个问题:它没有足够的SRAM内存来进行逆运动学模型正常运行时所需的所有计算。这些计算大多数是用浮点数来完成的。每个数字在使用时将占用4个字节的内存,是整型的两倍。虽然看起来不多,但是UNO只有2kB的RAM,其中一些还会被全局变量占用。如果我们为所有全局变量和其他局部变量保留0.5kB,那么将剩下1.5kB的可用内存,这仅能供384个浮点数占用。384可能看起来挺多,但是对于1K模型所产生的数据量是不够的(请阅读下面的“算法”部分找到相关原因)。所以我们必须想办法获取更大的内存。
实现该目的最简单的办法是将UNO更改为MEGA。MEGA和UNO是兼容的,所以对于原理图不用进行修改。另外,使用MEGA不仅可以为计算部分获取四倍多的RAM,还意味着将有八倍以上的闪存可用于我们的程序存储。我们很可能不会所有都用到,但是有更大的预留空间总是好的。以下是改进后的Fritzing原理图,如果您使用的是Arduino MEGA最新版本 (Rev 3),更换的过程很简单,跟断开UNO之后连接MEGA的过程一样。下面示意图以供参考。
图1:PWM扩展板改进后原理图
图2:PWM模块和HC-SR04超声波传感器改进后原理图
现在,我们来探究一些物理原理、所用到的大量数学知识以及少量代码。
逆运动学简介
可能有些人还记得,在高中的时候,物理课中有一部分内容叫做“运动学”。简单地说,这是力学领域中对一个目标对象(或一个点)运动的描述。这意味着在运动学中,您将使用数学公式和模型来对单个点的已知运动进行分析。顾名思义,逆运动学(IK)恰恰相反:通过一系列数学公式来反推并创建运动。
在机器人领域,通常使用的算法只能根据相应的端点运动来计算所有关节的运动。现在,您可以清楚地看到逆运动学在伺服运动编程部分的难题上所具有的优势——它是可以通用的。从理论上来说,仅一个算法就可以处理机器人所执行的任何运动。从使用者的角度来说,它非常易于使用—您只需要告诉机器人向左转90°,然后直行1米就可以了,而不必考虑每个伺服的位置。
模型
在以上段落中,一个词不断出现:一个(数学)模型。虽然听起来很难,但是对于六足机器人这个项目来说,模型非常简单:机器人能够机械性的所达到的任何位置都可以由一组七个点来定义。一个用于身体,另外六个用于腿部。如果您查看了AP_Utils库(可在 GitHub 上获取),特别是里面的AP_Utils.h,就会看到关于这些点的定义(包含在其他内容中):
struct body {
float x;
float y;
float z;
float facing;
};
struct leg {
uint8_t number;
bool move;
float phi;
float z;
};
您可以看到在AP_Utils类中它们被声明为私有结构。
body origin;
leg legs[6];
将这些结构私有化有以下两个原因:
- 用户不应具有随意修改这些值的权限。这些结构的存在是为了追踪机器人的当前位置,因此,只有当机器人真正产生运动的时候这些结构才会发生变化。假如用户想要更改当前的原点的 z 坐标,会导致IK模型发生不可预测的变化—这显然是不可取的。
- 通常,将共有函数和一个类中的变量数量控制到最低,是一种良好的编程习惯(尤其在C++中)。因此这样做可以提高安全性,并利于API的轻松实现。
如果需要,我们可以将这些点可视化。现在,我们的整个机器人由七个点来表示(图3)。
图3:IK模型的图形表示。简而言之,这就是六足机器人“认为”它所看起来的样子。红点是身体,蓝点是腿。
这些结构用于追踪所有腿部的位置以及机器人本身的位置。您可能注意到了,腿部的位置仅由两个坐标来定义:phi 和 z。这是因为每条腿只有两个自由度,因此只能沿着两个轴进行移动。现在可以通过身体的x、y 和 z 坐标来对所有位置进行定义。每条腿的 phi 和 z 坐标的范围是-1到1,并且仅确定了腿相对于身体的位置。尽管现在来看这种复杂性似乎是不必要的,但是实际上这比每次运动后计算每条腿的 x、y 和 z 坐标容易得多。phi 坐标表示水平运动,z表示垂直运动。
图4:带有phi轴和z轴的腿部细节
算法
现在,我们对于机器人有了足够简单的数学表达,但是还没有用它来做任何事。下一步就是研究如何通过仅仅修改该模型来实现伺服的运转。我们需要完成的程序是将输入作为一组点坐标,并将其转换为伺服的运行。
这时候另一个问题就出现了,而这次,仅仅替换成另一个Arduino无法解决。当启动伺服时,我们可能需要使大部分伺服同时运转。但是,Arduino(以及所有与此相关的AVRs)一次只能执行一项任务。这意味着如果我们如果想平稳地运转伺服,就需要一个一个进行启动。如果仅仅将伺服从一端直接运转到另一端,整个过程将非常不稳定。
解决该问题的一种方法是事先计算好所有伺服的位置,然后迭代这些数据,并对所有伺服进行设置。因为Arduino MEGA的时钟频率是16MHz,所以所有伺服虽然在实际过程中以很小的增量进行离散化运转,但是整体表现出来的运行过程是连续流畅的。尽管它们只是静态图像的集合,但是这和视频中所产生的连续运动的效果一致。人脑无法对视觉信息进行快速处理。如果我们在每一次位置变换之后添加一个50毫秒的延迟,则很明显,伺服运转实际上是由小的增量所组成的。
这也是我们必须更换Arduino的原因。如果我们想要运行每一个伺服,那么我们需要大量的内存来存储刚刚所计算出的坐标。如果我们运转所有的伺服,我们将需要600个浮点数来存储运动坐标,因为每个伺服都至少需要50个位置才能产生平滑连续的运转效果。600个浮点数大约是 2.3 kB的RAM—这已经超过了UNO的容量。
在AP_Utils库中,将位置转换为伺服运转状况的是traceLeg()
和 setLegs()
函数。traceLeg()
函数仅进行计算:当提供了目标末端的phi
和 z
坐标时,它将以坐标数组的形式创建一个路径。路径可以具有多种形状,当前支持的是线形(从一个点到另一个点的简单直线)、圆弧和椭圆弧。后两种路径可以使步行变得更加容易。第二种函数 setLegs()
将根据 traceLeg
的结果来移动所有指定的支腿,但是,所有这些对常规用户是隐藏的。整个方案的重点是尽可能地方便用户使用。最终用户将无需直接设置 setLegs()
,而仅需调用与行走直接相关的函数即可。
现在我们开始进入IK
编程的最后一步,即真正的行走。我们已经完成了所有基础工作:我们创建了一个模型来对所有事物进行追踪,我们可以运行多个伺服,甚至可以使伺服的运转变得相对平滑连续。在以下内容中,支腿的编号与下图中的编号相对应:
图5:支腿编号
该编号系统同时与您在库中找到的代码一致。
我们先从简单的操作开始:在场地上转向。通常,在为支腿设定新的位置时,您必须保证其中三条腿在地面上。这背后的原因很明显—除非您可以非常快地移动支腿,不然机器人将失去稳定性并跌倒。我们可以分几步使机器人转向:
1. 将支腿0、2和4移动到phi 坐标最大值处(最大水平角)。
图6:转向步骤1(支腿0、2和4)
2. 对支腿1、3和5进行相同操作。
图7:转向步骤2(支腿1、3和5)
3. 身体转向。这一步是通过沿与步骤1-3中相反的方向运行所有水平方向的伺服来完成的。因为所有的支腿都在地面上且不能移动,所以可以移动的只有身体。
图8:转向步骤3
对这些步骤进行重复执行后,机器人可以转弯80°。当然,只要不是在过程中一直保持 phi 轴最大坐标位置,可以实现小于该角度的转向。得益于 traceLeg() 函数背后的巧妙算法,我们不必计算支腿的任何 z 坐标值—这些计算会自动进行,并形成圆或椭圆的形状。您可以在以下视频中观察到这一过程。
最后一步是行走。具体来说,我们希望它至少能向前行走。六足机器人的行走算法有很多种,但大多数算法都基于有三个自由度的支腿。我们的支腿只有两个自由度,因此我们必须自己进行一些设计。我所提出的方法虽然没有达到预期的速度,但是这种方法是最易于编程的,并且易于观察过程中的现象。
1. 首先,支腿0和3向前移动
图9:行走步骤1(支腿0和3)
2. 然后,支腿2和5向相同方向移动
图10:行走步骤2(支腿2和5)
3. 对支腿1和4进行相同操作
图11:行走步骤4(支腿1和4)
4. 现在,身体移动向前,开始重复执行整个过程。
图12:行走步骤4
您可以在以下视频中观看整个运动:
基本避障功能
您可能已经注意到了,库中有一部分专门用于SR04超声波测距仪。这是为了获取有关机器人所处环境的一些信息。当然,一个固定不动的传感器是不够的,因此在上一篇文章中我们在一个额外的伺服上也安装了一个传感器。
我相信大多数尝试制造六足机器人的人对超声波测距仪的工作原理是有一定程度了解的。对于与该传感器的接口我建议您使用 AP_Utils::sr04_median
函数。它可以提供库中所有SR04函数最准确的结果。您甚至可以输出数据的单位,目前可以支持毫米、厘米和米!
重要提示: 请注意,您需要Adafruit PWM驱动程序库来使AP_Utils运行,您可以点击此处 下载。下载完成后,和其他Arduino库一样对其进行安装。
以下是一个非常简单的“自主”模式的示例,使用了到目前为止我们所讨论的所有内容:行走、转向和从SR04中读取距离。如果您认真阅读了这篇文章,那么应该能完全理解以下代码中最重要部分的内容。有关所有函数的更多细节,请参考库文件夹中或 GitHub 页面上的 README.md文件。
Arduino代码:
#include <AP_Utils.h>
//define the pins that the SR04 is connected to
#define TRIG 3
#define ECHO 2
//create an instance of AP_Utils class
AP_Utils ardupod;
//you will have to supply your own offsets here
//see examples/calibration.ino for details
int offsets[16] = {5, 0, 0, -7, 10, -3, 6, -4, 3, -5, 10, -3, 0, 0, 0, 0};
void setup() {
//reset the robot
ardupod.begin(offsets);
}
void loop() {
//take one step directly forward
ardupod.walk(0, 1);
//if an obstacle is closer than 20 cm, we have to turn
if(sr04_median(TRIG, ECHO, CM, 100, 500) < 20.0) {
//turn 90 degrees to the right
ardupod.turn(90);
}
}
结论
恭喜您完成了这个最具挑战性的项目之一!做得很好!在尝试使您自己的Ardupod行走之前,请确认同时运行示例文件夹中的 calibration.ino 和 servo_test.ino。这对于正确设置所有伺服至关重要,这样伺服才不会被损坏!在下一篇文章中,我们可能对此项目进行最后一次探索,以对一些机械性能较差的点进行改善,以及,更重要的是,增加一些改进的功能,例如远程控制。
Arduino Hexapod 第 3 部分:远程控制
在本系列的第三部分也是最后一部分中,我们将添加机器人的最后一部分:遥控器。此外,对支腿进行了微小的改进,因此它们在基材的任何表面上都更加稳定。首先,我们将稍微修改一下腿部机制,然后将 HC-05 蓝牙连接到 Arduino 进行无线控制。最后,我们将编写一个处理应用程序,这样我们就不必为 ArduPod 的每次移动都使用书面命令。
如果您是这个项目的新手,请在继续之前参考该项目的第 1 部分和第 2 部分:Arduino Hexapod PART 1- Mechanics and Wiring和Arduino Hexapod PART 2: Programming。
硬件
- 第 1 部分中的 ArduPod
- HC-05蓝牙模块
- 1 kΩ 电阻和 1.8 kΩ(或 2.2 kΩ)电阻
软件
- Arduino IDE
- Processing 3.2.3
- GitHub – 包含最新的源代码
- 发布 1.0.0 – 或者,您可以在此处下载 v1.0.0 的源代码。万一 GitHub 上的代码获得重大的 API 中断更新,这些应该仍然可以按照此处描述的方式工作
工具
- 烙铁
改善腿部
我个人在使用六足机器人时遇到的最大问题是腿在光滑的表面上真的很不稳定。这通常可以通过在腿上添加某种防滑材料来轻松解决,但是接触地面的表面太小。使腿部接触地面的区域更大将有助于防止滑倒并提高整体腿部稳定性。
图 1. 旧腿(左)和新腿(右)
在上图中,您可以看到腿部添加了一种底部支撑。就像其他部件一样,这是在使用黑色 ABS 的 3D 打印机上打印的。该模型可以与我的GitHub 上的其余部分一起找到。
图 2. 添加到腿部的新部件。注意底部的深绿色防滑层。
现在我们可以在脚上添加防滑层。我用了一个绿色凝胶垫。即使在非常轻的负载下也不会滑动。如果您无法获得这种确切的材料,则几乎没有其他选择(例如橡胶)。尝试看看哪一个最适合您的机器人。然后从材料上剪下六个圆圈并将它们粘在脚上,我们就完成了!
我做的下一个改进比脚复杂一点。在目前的系统中,舵机只在一个地方连接到腿部。这会在结构中产生一个薄弱点,该薄弱点必须承受大部分载荷,并且可能在某个时候断裂。在图 3 中,您可以看到当前的附件系统以及旁边的新附件系统。
图 3. 旧附件系统(左)和新附件系统(右)
请注意,新部件允许将伺服器安装在两个位置:在轴上(与以前一样)和伺服器的另一侧。当带有旋钮的小垫子粘在舵机上时,它将为舵机提供额外的支撑。现在伺服器连接在两个点上,在它们之间分配负载。结果是更好的运动控制。
无线Arduino
既然我们已经把腿放开了,让我们连接 HC-05 蓝牙模块,它可以无线控制机器人。由于所有控件都已由 Arduino 处理,因此我们的主要任务是向其发送命令。
关于如何与 Arduino 进行无线通信有几个主要选项:
RF modules
射频模块——这是最基本(也是最便宜)的无线通信方式。通常,它们在单个无线电频段(433、868 或 915 MHz)中运行,并且需要从用户端进行相当多的设置。它们的主要优点是射程远(可达数百米)和相对较低的功耗。- LoRa – LoRa 模块与上述 RF 模块类似,但使用特殊调制以在相同功耗的情况下实现更高的范围(可达公里)。当然,这是以非常慢的传输速度为代价的,最多只能以每秒数百位来衡量。
- WiFi - WiFi 模块是允许 Arduino 连接到 Internet 的快速简便的方法,但是,范围通常相当有限。此外,它们的功耗可能非常高。
- GSM – 这是使您的手机正常工作的技术。GSM 模块比其他选项有很大的优势:只要有信号就可以通信,即使 Arduino 和目标 PC 相距数百公里。GSM 最大的缺点是它需要大量的电力——在某些条件下,电流消耗可以上升到几安培,因此很难仅使用电池供电。
- ZigBee 技术——XBee 模块通常比这里的其他选项更昂贵,但它们很容易与 Arduino 连接。它们是作为蓝牙的替代品而开发的,它们的通常范围可达 75 m。
- 蓝牙——这是我决定在这个项目中使用的。蓝牙非常易于使用,在这种情况下,它的有限范围并不是什么大问题:我们真的不希望 ArduPod 进行一次重大冒险并开始探索距离计算机几十米以外的区域。此外,大多数智能手机都有蓝牙,如果您在任何时候决定编写智能手机应用程序,它可以很容易地完成。
所以,我们将在这个项目中使用蓝牙。我使用了 HC-05 蓝牙模块,主要是因为它是市面上最实惠、最常见的一款。由于该模块的作用类似于串行 COM 端口,因此将 HC-05 连接到 Arduino 非常容易,如下面的Fritzing 原理图所示。
图 4. HC-05 蓝牙模块与 Arduino Mega 接线图
图 5. 将 HC-05 蓝牙模块连接到 Arduino Mega。
该模块由 Arduino 供电。HC-05 TX 引脚直接连接到 Arduino 上的 RX1 引脚。然而,由于 HC-05 逻辑电平为 3.3 V,而 Arduino 以 5 V 运行,HC-05 RX 引脚上必须有一个简单的分压器来降低电压。R1 的值应为 1 kΩ,R2 的值可以为 1.8 kΩ 或 2.2 kΩ。我使用了 2.2 kΩ,因为我找不到任何 1.8 kΩ 电阻器,但是该模块应该可以与它们中的任何一个一起正常工作。
此时,Arduino 不知道它是通过蓝牙模块进行通信的。从它的角度来看,这与通过电缆连接时的情况完全相同。这就是为什么我们不需要在 Arduino 上进行任何设置,因为模块会处理所有事情——至少在最常见的情况下是这样。
下一步是设置HC-05蓝牙模块。我使用的PC没有内置蓝牙接口,所以我必须使用USB蓝牙适配器。
对于 Windows 10,请参阅之前的教程,其中提供了将 HC-05 连接到 PC 的分步指南: 制作您自己的Arduino RFID 门锁- 第 2 部分;第一步:连接蓝牙)
首先,我们必须将 PC 与蓝牙模块配对。
- 将适配器连接到 PC,完成驱动程序安装后,在控制面板中找到“设备和打印机”窗口。然后,连接 HC-05 为 Arduino 加电。HC-05 上的红色 LED 将开始快速闪烁。这意味着 HC-05 当前未连接到任何其他设备。
- 在“设备和打印机”中,单击“添加设备”,您的计算机应该会自动找到 HC-05。单击图标,当提示“选择配对选项”窗口时,选择中间的一个(“输入设备的配对代码”)。HC-05 的默认配对代码是 1234。这并不是那么安全,但是,我们可以随时更改代码。此外,控制六足机器人实际上需要多少安全性?
- 成功添加设备后,HC-05 上的 LED 现在应该每两秒闪烁一次 - 这意味着它已连接到另一个设备。
此时,最好验证一切是否正确连接。启动 Arduino IDE,并上传以下草图:
void setup() {
Serial1.begin(9600);
while(!Serial1);
Serial1.println("Hello world!");
}
String input;
void loop() {
if(Serial1.available() > 0) {
input = Serial1.readString();
Serial1.println(input);
}
}
上传完成后,回到“设备和打印机”,找到我们之前与PC配对的HC-05模块。右键单击 HC-05
图标并转到“硬件”选项卡。在那里,您会找到分配给模块的 COM 端口号 Windows。这将是我们用来与 ArduPod 通信的 COM 端口。返回 Arduino IDE
,在 Menu > Tools > Ports
中选择正确的 COM 端口并启动串行监视器。输入几个字符,然后按 Enter。这些字符将被发送到您刚刚指定的 COM 端口,并应作为 Arduino 的响应返回。
到目前为止一切正常吗?很好!现在我们已经完成了“困难”的事情,让我们转向更有趣的事情:在 Processing 中编写一个图形应用程序。
Processing
由于您正在阅读本文,我假设您已经对处理语言有基本的了解。尽管 Processing 看起来与 Arduino 语言非常相似——即使设置和循环/绘制主要功能是相同的——但它们并不相同。Arduino 语言几乎与 C++ 相同,而 Processing 基于 Java。因此,即使语法相似,两者之间也存在重大差异。我将在下面尽我所能描述我创建的应用程序。
显然,我们希望应用程序有一个漂亮的图形用户界面 (GUI)。由于 Processing 主要关注绘制形状(因此主循环函数的名称 - draw),这对于图形设计师来说真的很容易。然而,我在这个领域的技能几乎不存在,所以我将求助于使用库来帮助我创建一个看起来很酷的 GUI。
有一些处理库提供不同的设计,但我个人最喜欢的是controlP5库。您可以查看此网站,详细了解有关图书馆的更多信息。此外,该库充满了几乎所有内容的示例。您可以在该站点上找到的另一个有用的东西是完整的 JavaDoc 参考。网站上的下载版本有点过时,所以我强烈建议您使用处理库管理器。在撰写本文时,我们将使用最新的处理版本,Processing 3.2.3 。该应用程序以及源代码可在我的GitHub 上找到。
现在让我们来看看应用程序的实际外观。
图 6. ArdupodRemote Processing 应用程序
嗯,这是相当多的控制,不是吗?左边有一个灰色的大神秘盒子,有很多按钮可以按下,右边有一个奇怪的东西,看起来有点像雷达。如您所见,我用红色数字标记了所有部分,这就是每个控件的作用:
**串行输出:**这是您了解实际情况的主要信息来源。串行端口上显示的所有内容以及来自应用程序本身的通知都将写入此处。
**串口输入和命令提示:**如果要直接向串口发送东西,可以在这里输入,回车发送。这主要用于调试应用程序,但如果您绝对需要直接向机器人发送内容,它仍然存在。
**超声波扫描仪:**我个人认为这是最酷的功能。当您按下“扫描”按钮(数字 7)时,超声波传感器将旋转 180 度并在每一度进行距离测量。距离数据被发送到应用程序,然后可以可视化。
图 7. 示例扫描输出。扫描的区域是一条狭窄的走廊。
即使没有相机,这是了解周围环境的一种快速简便的方法。
**手动传感器转动:**不言自明;此滑块允许您将带有超声波传感器的伺服设置到特定位置。
**距离输出:**每次进行距离测量时,都会在此处显示结果。
**测量按钮:**按下时,传感器将进行一次距离测量并将其显示在距离输出字段中。
**扫描按钮:**如上所述,这将开始对周围区域进行超声波扫描。
**COM 端口选择:**启动应用程序后,您必须选择适当的 COM 端口以用于所有通信。所有可用的 COM 端口都将显示在此处。
**连接按钮:**选择正确的 COM 端口后,按此按钮进行连接。如果出现问题,将在串行输出区域打印错误以帮助您修复错误。
**断开连接按钮:**如果您出于某种原因需要从端口断开连接,这是适合您的按钮。
**运动控制:**这是应用程序存在的实际原因。W 前进,S 后退,A 和 D 左转和右转。就这么简单!这些按钮可以在键盘上单击或按下。单击时,机器人将朝适当的方向迈出一步。当您按住键盘上的键时,机器人将继续朝该方向移动,直到您松开当前按钮或按下新按钮。
正如您可能已经猜到的那样,这个应用程序比它真正需要的复杂得多。我根本无法逐行解释所有内容,因此我们将看看代码中最重要的部分:控制事件处理、串行通信和 Arduino 端。
控制事件处理
在使用 GUI 编程应用程序时,我们需要问的第一件事是“单击按钮后会发生什么?” 幸运的是,controlP5 库为我们处理了大部分事情。让我们看一下下面代码中的一个简单场景:
import controlP5.*;
ControlP5 cp5;
void setup() {
size(400,400);
cp5 = new ControlP5(this);
cp5.addButton("click me!")
.setValue(0)
.setColorForeground(color(215, 0, 0))
.setColorBackground(color(175, 0, 0))
.setColorActive(color(255, 0, 0))
.setPosition(100,100)
.setSize(200,200)
;
}
public void controlEvent(ControlEvent theEvent) {
if(theEvent.getController().getName().equals("click me!")) {
println("Why would you trust a big red button?!");
}
}
void draw() {}
图 8. controlP5 示例
首先,我们必须导入库并创建controlP5类的实例。然后,在设置函数中,我们创建一个名为“click me!”的新按钮。最后一部分是controlEvent函数。每次任何 controlP5 元素创建事件时都会调用此函数——在我们的例子中,每次单击按钮时。然后我们可以检查是哪个元素导致了这个事件,如果是我们的“点击我!” 按钮,它将打印一些文本。controlP5 库充满了有关如何使用它提供的许多控制元素的示例,因此我们将快速浏览一下远程控制应用程序中的实际内容。
基本事件处理与上面的示例完全一样——使用controlEvent函数。除此之外还有两个函数*——keyPressed和keyReleased*,它们处理键 W、A、S 和 D 的输入,以允许使用键盘进行移动控制。您可能会注意到,与示例不同的是,在setup函数中没有设置任何控制元素。所有这些都移到了名为guiElements的第二个选项卡中,并使用setupGui函数调用。因此,主ardupodRemote选项卡中的代码较少。通常,将处理不同事物的代码块分开是一种很好的编程实践,因为这样更容易阅读和理解代码。
现在我们对图形和控件的工作原理有了基本的了解,我们可以尝试弄清楚如何理解将通过串行端口传输的所有数据。
串行通信和状态码
我们已经在双方都设置了蓝牙,但我们仍然需要创建某种“协议”供双方遵循,并且我们需要它尽可能简短和快速。由于所有通过串口进来的数据在两边都被解释为字符串数据类型,我创建了一个非常简单的“数据包”结构。“in”数据包(Arduino 发送到 PC 的数据包)的结构如下所示:
XY有效载荷
前两个字符X和Y是该数据包的状态代码,它们让应用程序知道有效负载包含哪些类型的信息。例如,如果应用程序收到*“82Starting PWM …”数据包,它将在串口输出框中写入以下内容:“[INFO] [SETUP] Starting PWM …”*。当前实现的所有代码如下表所示。
0 | |
---|---|
1 | [回声] |
2 | [设置] |
3 | [痕迹] |
4 | [SR04] |
5 | [脉宽调制] |
6 | [错误] |
7 | [警告] |
8 | [信息] |
9 | > |
10 | [命令] |
11 | [应用程序] |
请注意,在应用程序中,代码 40 保留用于扫描数据,代码 41 用于单次距离测量。
“输出”数据包(应用程序发送给 Arduino 的数据包)的结构被简化了一点:
Xpayload
和以前一样,第一个字符X将决定如何处理有效负载。然而,这一次,我们将只使用几个命令。
t | 将传感器转到有效载荷中指定的位置 |
---|---|
m | 测量距离 |
n | 开始扫描 |
w[s] | 走/向前走 |
a[s] | 转/左转 |
s[s] | 走/后退 |
d[s] | 右转/右转 |
Arduino方面
到目前为止,我们设法将蓝牙连接到 Arduino 和 PC。我们还编写了一个带有酷炫 GUI 的应用程序,并创建了一个与 Arduino 通信的协议,但仍然缺少一些东西:我们可能正在发送数据,但 Arduino 还没有收听。我们需要 Arduino 运行一个程序,该程序将定期检查串行端口,如果有可用数据,则对其进行处理。让我们看一下我们之前用来验证蓝牙连接的草图。
void setup() {
Serial1.begin(9600);
while(!Serial1);
Serial1.println("01Hello sir!");
}
String input;
void loop() {
if(Serial1.available() > 0) {
input = Serial1.readString();
switch(input.charAt(0)) {
case ‘n’:
//ultrasonic scan
case ‘m’:
//measure distance
//and so on...
}
}
}
一旦我们在输入变量中有数据,我们就可以用它做各种各样的事情。例如,如果我们想检查刚刚到达的命令类型,我们可以使用input.charAt(0)。此内置函数将返回字符串input的第一个字符,该字符将对应于上表中的一个命令。
请注意,通常,每次您想将新草图上传到 Arduino 时,您都必须断开 HC-05 模块,但是,由于我们使用的是 Arduino Mega,我们总共有 4 个独立的硬件串行端口可用!因此,我们只需将蓝牙连接到其余蓝牙之一,我们就可以同时使用它们。
要记住的另一件事是,通过蓝牙将 Arduino 连接到 PC 可能并不总是重置 Arduino,这与通过 USB 连接不同。要正确启动,您必须手动按下 Arduino 上的 RESET 按钮!
结论
Hexapod 是一个相当复杂的项目。与往常一样,还有改进的余地。目前,船上唯一的传感器是超声波测距仪,但由于 Arduino Mega 拥有如此多的自由处理能力,我们可以添加其他传感器以获得更高级的功能。
就是这样——你完成了 ArduPod 的最后一个教程!三部分教程应该尽可能全面。如果您有任何问题或改进建议,请随时在我的GitHub 上分享您的想法。您可以转到 ArduPod 存储库中的“问题”选项卡并打开一个新问题。当您参与其中时,如果您喜欢这个项目,您可以在此处留下一颗星。当然,您决定构建自己的 ArduPod,记得与世界分享您的创作!
边栏推荐
- LeetCode 1598. Folder operation log collector
- 如何解决ecology9.0执行导入流程流程产生的问题
- Start from the bottom structure and learn the introduction of fpga---fifo IP core and its key parameters
- FPGA内部硬件结构与代码的关系
- 7.5 decorator
- Room cannot create an SQLite connection to verify the queries
- Yolov5、Pycharm、Anaconda环境安装
- 2022.7.5-----leetcode. seven hundred and twenty-nine
- Classical concurrency problem: the dining problem of philosophers
- Notepad + + regular expression replace String
猜你喜欢
What are the functions of Yunna fixed assets management system?
Choose to pay tribute to the spirit behind continuous struggle -- Dialogue will values [Issue 4]
电机的简介
免费的聊天机器人API
LeetCode 1189. Maximum number of "balloons"
FFT 学习笔记(自认为详细)
OpenCV经典100题
Room cannot create an SQLite connection to verify the queries
Gavin teacher's perception of transformer live class - rasa project actual combat e-commerce retail customer service intelligent business dialogue robot system behavior analysis and project summary (4
AtCoder Beginner Contest 258【比赛记录】
随机推荐
Single merchant v4.4 has the same original intention and strength!
Hudi of data Lake (1): introduction to Hudi
MySQL functions
《编程之美》读书笔记
Uniapp development, packaged as H5 and deployed to the server
Extracting profile data from profile measurement
Yolov5、Pycharm、Anaconda环境安装
Problems encountered in the database
Classic CTF topic about FTP protocol
Power Query数据格式的转换、拆分合并提取、删除重复项、删除错误、转置与反转、透视和逆透视
How much do you know about the bank deposit business that software test engineers must know?
Huawei equipment configuration ospf-bgp linkage
FFT 学习笔记(自认为详细)
NSSA area where OSPF is configured for Huawei equipment
2022.7.5-----leetcode. seven hundred and twenty-nine
【DesignMode】组合模式(composite mode)
Spark-SQL UDF函数
Global and Chinese market of water heater expansion tank 2022-2028: Research Report on technology, participants, trends, market size and share
Date类中日期转成指定字符串出现的问题及解决方法
OpenCV经典100题