电源设计技术信息网站

FAQ   订阅电子杂志   English   繁體中文   日本語   한국어

下载中心

TECH INFOArduino入门指南

Arduino六足机器人第三部分:远程控制

这篇文章来源于DevicePlus.com英语网站的翻译稿。

arduino hexapod

在本系列的第三部分也就是最后一部分,我们将为机器人添加最后一个部件:遥控器。此外,我们对支脚进行了一些细微的改进,使它们能够在任何类型的基底表面都能更加稳定。首先,我们会介绍经过细微修改的支腿机制,然后将HC-05蓝牙连接到Arduino以实现无线控制。最后,我们将编写一个Processing应用程序,这样我们就不必为ArduPod的每次移动使用书面指令了。

如果您第一次知道该项目,请先参考本项目的第一部分和第二部分,然后再进行下一步的操作:Arduino六足机器人第一部分—机械与布线 以及 Arduino六足机器人第二部分:编程

硬件

  • 第一部分获得的六足机器人
  • HC-05 蓝牙模块
  • 1 kΩ 电阻和 1.8 kΩ (or 2.2 kΩ) 电阻

 

软件

  • Arduino IDE
  • Processing 3.2.3
  • GitHub – 包含最新源代码
  • Release 1.0.0 – 或者,您可以在此处下载v1.0.0的源代码。如果GitHub上的代码有重要的API破坏性更新,这些代码仍然可以像本文描述的那样运行。

 

工具

  • 烙铁

 

改善支腿

我自己制造六足机器人的时候,面临的最大难题是支腿在光滑表面上很不稳定。通常,在支腿上添加某种防滑材料就可以很轻松地解决这个问题。但是,这个机器人的支腿与地面间的接触面积太小了。增大支腿与地面的接触面积对防滑效果大有帮助,同时还能改善支腿的整体稳定性。

 

arduino hexapod

图1:旧的支腿(左)和新的支腿(右)

在上图中,您可以看到支腿的底部增加了一个支撑零件。与其他零件一样,该零件也是使用黑色ABS材料通过3D打印机制造的。在我的GitHub上可以找到其他零件的模型。

 

arduino hexapod

图2:添加到支腿上的新零件。请注意底部的深绿色防滑层

现在我们可以在支脚底部添加防滑层了。我用了一块绿色的凝胶垫。这种材料即使在非常轻的负载下也不会发生打滑。如果您无法获取这种材料,其他选择就非常少了(比如橡胶)。可以试试看哪种材料最适合您的机器人。然后从材料上切下六个圆圈,将这些圆圈粘在脚上,这一步就完成了!

我要做的下一个改进比支脚要复杂一些。在当前系统中,伺服只在一个地方与支腿连接。这会使结构中产生一个薄弱点,该薄弱点将会承受大部分的负载,这可能导致在某个时刻发生断裂。在图3中,您可以看到当前的附着系统和旁边新的附着系统。

 

arduino hexapod

图3:旧的附着系统(左)和新的附着系统(右)

我们注意到所添加的新零件使伺服可以在两个位置进行连接:轴上(之前的连接点)和伺服的相对侧。将带有旋钮的小垫子粘贴到伺服上可以为伺服提供额外的支撑。现在,伺服连接在两个位置上,负载分配在这两点之间。这样就可以进行更好的运动控制。

无线 Arduino

现在我们已经解决了支腿的问题,可以来连接HC-05蓝牙模块了,通过该模块可以对机器人进行无线控制。由于所有的控件都由Arduino来操控,我们的主要任务是向其发送指令。

与Arduino之间进行无线通信的方法主要有以下几种:

  1. 1.RF 模块 – 这是最基本的(也是最便宜的)无线通信方式。通常,它们在单个无线电频带(433, 868 或915 MHz)中运行,并且需要在用户端进行一些设置。RF模块的主要优点是通信距离远(可达数百米)和功耗相对较低。
  2. 2.LoRa – LoRa模块类似于上述RF模块,但使用了特殊的调制方式,使其在相同功耗的前提下可以实现更大范围的通信(可达几千米)。当然,代价是传输速度极慢,最大传输速度仅为每秒几百位。
  3. 3.WiFi – WiFi 模块是使Arduino可以连接到网络的快速简便的方法,但是范围通常相当有限。而且,该模块的功耗会很高。
  4. 4.GSM – 这是使您的手机可以正常工作的技术。GSM模块相对于其他选项具有很大的优势:只要有信号就可以实现通信,即使Arduino和目标PC相距数百公里。GSM的最大缺点是它需要大量电源—在某些情况下,电流消耗可能会上升到几安培,这时仅使用电池就很难完成供电了。
  5. 5.ZigBee 技术 – XBee模块通常比此处提到的其他模块要贵,但是它们很容易与Arduino交互。这些模块是作为蓝牙的替代产品而开发的,通常来说通信距离可达75米。
  6. 6.蓝牙 – 这就是我在本项目中最后决定使用的模块。蓝牙非常易于使用,在本项目中,范围有限并不是什么大问题:我们没有打算让ArduPod去跑到距离计算机几十米以外的地方进行一次大型探险。并且,大多数智能手机都具有蓝牙功能,如果您打算编写一个智能手机应用程序,那么通过该模块就可以轻松完成。

 

因此,我们将在该项目中使用蓝牙模块。我使用HC-05蓝牙模块,主要是因为它是最便宜、最常见的模块。由于该模块的作用就像一个串行COM端口,因此HC-05与Arduino的连接非常容易,如下面的Fritzing示意图所示:

 

arduino hexapod

图4:HC-05蓝牙模块和Arduino Mega的接线图

 

arduino hexapod

图5:将HC-05蓝牙模块连接到Arduino Mega

该模块由Arduino供电。HC-05的TX引脚直接连接到Arduino上的RX1引脚。但是,因为HC-05的逻辑电平为3.3V,而Arduino在5V下运行,所以HC-05的RX引脚上必须有一个简易分压器来降低电压。R1的值应为1 kΩ,R2的值可以为1.8 kΩ或2.2 kΩ。我使用2.2 kΩ的电阻,因为找不到阻值为1.8 kΩ的电阻,但是对于该模块,使用两种电阻的任何一个都可以正常工作。

目前,Arduino还不知道它正在通过蓝牙模块进行通信。从Arduino的角度来说,这跟通过电缆连接完全相同。这就是为什么我们不需要在Arduino上进行任何设置,因为该模块自行处理所有事情—至少在最常见的情形下是这样。

下一步是设置HC-05蓝牙模块。我使用的PC没有内置的蓝牙接口,因此必须使用USB蓝牙适配器。

对于Windows 10,请参考以前的教程,该教程提供了有关将HC-05连接的PC的分步指南:制作自己的Arduino RFID门锁—第二部分; 步骤1:连接蓝牙

首先,我们必须将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图标,然后点击“硬件”选项。在这里,您会找到Windows分配给该模块的COM端口编号。这将是我们用于与ArduPod通信的COM端口。返回Arduino IDE,在菜单>工具>端口中选择正确的COM端口,然后启动串行监视器。输入几个字符,然后按下Enter键。这些字符将被发送到您刚刚指定的COM端口,并出现Arduino的响应。

到目前为止一切正常吗?很好!现在我们已经完成了“困难”的部分,让我们进行一些有趣的部分:在Processing中编写图形应用程序。

Processing

我假设正在阅读本文的您已经对Processing的语言有基本的了解。虽然Processing的语言与Arduino语言非常相似 – setuploop/draw这些主函数都相同—但是它们还是不同的。Arduino语言几乎与C++相同,而Processing是基于Java语言。因此,虽然语法相似,两者之间还是存在重大差异。下面,我会尽我所能地把我所创建的应用程序描述出来。

 

显然,我们希望该应用程序具有良好的图形用户界面(GUI)。Processing非常着重于绘图形状(因此主循环函数名称为 – draw),所以对于图形设计人员而言使用Processing很便捷。但是,我几乎不具有该领域的任何技能,因此我将通过使用库来帮助我创建外观精美的GUI。

 

Processing有几种库,可以提供不同的设计方案,但是我个人最喜欢的是controlP5库。您可以点击此处访问该网站,以详细了解该库的更多信息。另外,该库中几乎包含了所有示例。您可以在网站上找到另一个有用的东西是完整版JavaDoc参考。网站上的下载版本已经有些过时,因此强烈建议您使用Processing的库管理器。在编写程序时我们将使用最新版的Processing,即Processing 3.2.3。该应用程序以及源代码可在我的GitHub上找到。

现在,让我们来看一下应用程序的实际外观。

 

arduino hexapod

图6:ArdupodRemote Processing 应用程序

好吧,控件有点多是不是?左侧有一个大的灰色神秘盒子,有很多可以按下的按钮,而右侧则有点奇怪,看起来像是雷达。如您所见,我用红色数字标记了所有部件,这是每个控件的作用:

  1. 1.串行输出: 这是提供运行状况信息的主要来源。串行端口上显示的所有内容都会被写入这里,同时还有来自应用程序本身的通知。
  1. 2.串行输入和命令提示符:如果要直接向串行端口发送内容,可以在此处输入并按下Enter键发送。这主要在调试应用程序的时候用的,但是会保留在界面上,以防什么时候您极其需要直接向机器人发送某些内容。
  1. 3.超声波扫描仪:就我个人来说,这是所有功能中最酷的一个。当您按下“扫描”按钮(数字7)时,超声波传感器将旋转180度并在每个角度进行距离测量。距离数据被发送到应用程序,然后被可视化。

 

arduino hexapod

图7:扫描输出示例。扫描区域为狭窄的走廊。

即使没有相机,您也可以通过该功能快速简便地了解周围环境。

  1. 4.手动旋转传感器:不言自明,通过该滑块可以将带有超声波传感器的伺服设置到特定位置。
  1. 5.距离输出:每次进行距离测量,测量结果都会在此处显示。
  1. 6.测量按钮:按下该按钮时,传感器将进行一次距离测量并将其显示在距离输出区域中。
  1. 7.扫描按钮:如上所述,按下该按钮将开始对周围区域进行超声波扫描。
  2. 8.COM端口选择:启动应用程序后,您必须选择适当的COM端口以用于所有的通信。所有可用的COM端口将在此处显示。
  1. 9.连接按钮:选择正确的COM端口后,按此按钮进行连接 。如果运行出现问题,相关的错误将会被打印到串行输出区域,以帮助您进行修复。
  1. 10.断开连接按钮:当您出于任何原因需要从端口断开连接时,就可以按下此按钮。
  1. 11.移动控制:这是构建该应用程序的目的所在。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() {}

 

 

arduino hexapod

图8:controlP5示例

首先,我们必须导入库并创建controlP5类的实例。然后,在setup函数中,我们创建一个名为“click me!”的新按钮。最后一部分是 controlEvent函数。每当任何 controlP5的元素创建事件时(在我们的示例中,是每次单击按钮时),都会调用该函数。然后,我们可以检查是哪个元素导致了该事件的发生,如果是出于“click me!”按钮,那么将会打印出一些文本。controlP5库包含了有关解释如何使用其所提供的控制元素的示例,所以我们将会来简单了解一下远程控制应用程序中实际所包含的内容。

基本事件处理与上面的示例完全相同,都是通过controlEvent函数进行处理。除此之外,还增加了两个函数 – keyPressed 以及 keyReleased,用于处理键W、A、S和D的输入,以允许使用键盘进行移动控制。您可能会注意到,与示例不同,在setup函数中并没有设置任何的控制元素。所有的元素设置都被移到了第二个选项卡guiElements中,并通过setupGui函数进行调用。因此,在主选项卡ardupodRemote中的代码很少。通常,对不同的内容设计分隔的代码块是一种很好的编程习惯,因为这样更易于阅读和理解代码。

现在,我们对图形和控件的工作原理有了基本的了解,可以尝试解义那些将要通过端口传输的所有数据了。

串行通信和状态码

我们已经在两端都设置了蓝牙连接,但是还需要创建双方都遵循的某种尽可能简明快捷的“协议”。由于所有从串行端口传入的数据在两端都会被释义为字符串数据类型,因此我创建了一个非常简单的“数据包”结构。“输入”数据包(Arduino发送给PC的数据包)的结构如下所示:

 

XYpayload

 

前两个字符XY是该数据包的状态码,作用是让应用程序知道有效负载中所包含信息的种类。例如,如果应用程序接收到数据包“82Starting PWM … ”,它将在串行输出框中写入以下内容:“[INFO] [SETUP] Starting PWM … ”。下表列出了当前已经实现的代码:

 

0
1 [ECHO]
2 [SETUP]
3 [TRACE]
4 [SR04]
5 [PWM]
6 [ERROR]
7 [WARN]
8 [INFO]
9 >
10 [CMD]
11 [APP]

 

请注意,在该应用程序中,代码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中的变量,我们就可以使用它来进行所有操作了。例如,如果要查看刚刚到达的指令类型,我们可以使用input.charAt(0)。此内置函数将返回字符串输入的第一个字符,该字符将与上表中的指令之一相对应。

请注意,通常,每次要将新的草图上传到Arduino时,都必须断开HC-05模块的连接,但是由于我们使用的是Arduino Mega,就有了四个单独的硬件串行端口!因此,我们只需要将蓝牙连接到剩余的端口之一就可以同时进行这些操作了。

需要记住的另外一件事是,与使用USB的连接不同,通过蓝牙将Arduino连接到PC不会经常重置Arduino。为了正确启动,您必须手动按下Arduino的重置按钮!

结论

六足机器人是一个相当复杂的项目。与往常一样,该项目还有很大的提升空间。目前,唯一板载的传感器是超声波测距仪,但是由于我们使用的Arduino Mega还有很多闲置处理能力,我们可以添加其他传感器以获取更高级的功能。

对,您已经通过ArduPod的上一篇教程实现了!本教程分为三部分来尽可能全面地讲述所有内容。如果您有任何疑问或者改进的建议,请随时在我的GitHub上与我分享您的想法。您可以前往“Issues”区域创建一个新的问题。如果您已经进入到我的页面中并且喜欢该项目,可以留下一颗星。当然,如果您打算构建自己的ArduPod,请一定要与世界分享您的创造!

Jan Gromes
Jan Gromes

Jan目前就读于布尔诺理工大学电气工程专业,拥有多年Arduino和其他微控制器专业经验,尤其对机器人系统的机械设计感兴趣。

分享到社交媒体