带Arduino和XBees的无线遥控机器人

γ
贡献者: 博博霍
喜爱的 最喜欢的

实验3:无线控制机器人

介绍

现在我们可以无线移动我们的机器人了,我们将需要额外的命令来转弯和倒车驾驶。

需要零件

您需要从所需材料中获得以下零件:

  • 2x XBees(配置为Series 1固件)
  • 1根Cerberus电缆(或1根Micro-B USB和1根Mini-B USB电缆)
  • 带Redbot主板的1X组装式阴影机箱
  • 4X AA电池
  • 1个组合式无线操纵杆
  • 1X锂电池

3.1:带SAMD21的全远程控制

在这部分实验中,我们将重复2.1中的步骤,以发送反向转弯或行驶的命令。

硬件连接

通过USB电缆将控制器重新连接到计算机。

Micro-B USB电缆插入无线操纵杆

打开素描

将以下代码复制并粘贴到Arduino IDE中。记住选择SAMD21 DEV突破对于控制器,选择它枚举的COM端口,将无线操纵杆开关拨到打开位置,然后点击上传。

语言:c/*3_1_full_remote_control_samd21.ino full remote control samd21示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Co英国威廉希尔mmons属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行任何您想要的操作,可用于任何用途。请将此许可证归为属性并保留。这是SAMD21无线操纵杆的示例代码。通过串行监视器输入的任何字符或满足条件语句时,都将发送到硬件UART管脚。假设您在同一个通道上有一对XBees Series 1模块(或配置了802.15.4协议的Series 3模块),一个字符将在XBees之间无线传输。然后,接收XBee将把字符传递给ATMega328P微控制器,使机器人向前移动。按下D2(如果您在右侧焊接了操纵杆或按钮),将检查左侧的操纵杆。移动操纵杆时将传输一个字符。向上=右前=右前转向向下=左后=左前转向中间=未按下D2时滑行,将发送一个字符以停止电机。需要对Redbot进行编程以读取这些值。注意:对于某些XBEE系列3模块,您可能需要将A5连接到无线操纵杆上的XBEE系列3的重置触针。有关详细信息,查看xbee3_reset()函数。*/define forward_reverse_joystick a3//用于左操纵杆Y组件的销define turn_joystick a2//用于左操纵杆X组件的销t prev_buttons accelerate_state;//存储按钮按下当前按钮加速状态的值;//值存储按钮的当前状态按define accelerate_button 2//右触发器使用的pin//我们将在此处存储模拟操纵杆值Int16_t forward_reverse_stick_value;Int16_t turnstick_value;char c_data;//通过串行监视器发送值进行调试//led检查led是否初始化。const int status_led=13;//某些Xbee系列3模块需要define Xbee_reset A5void setup()serialusb.begin(9600);//初始化串行监视器进行调试//如果要等待串行监视器打开,请取消对此的注释。[同时]!SerialUSB);//等待串行监视器打开serialusb.println(“无线操纵手柄控制器初始化”);序列1.开始(9600);//以9600波特的xbee3_reset()与xbee开始串行通信;//如果xbee3初始化有问题,硬件重置PINMODE(加速按钮,输入插拔);//启用加速按钮D2的上拉电阻//状态LED,查看控制器是否正在初始化PINMODE(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serialusb.println(“无线操纵杆控制器的XBEE准备好通信”);delay(10);//end setupvoid loop()//初始化变量以读取按钮current_buttonAccelerate_state=digitalread(Accelerate_button);/***按钮1状态-低或0表示按下-高或1表示未按下****///存储值读取操纵杆前进\后退\斗杆\值=模拟读取(前进\后退\操纵杆);旋转杆_值=模拟读数(旋转操纵杆);//send commands via serial monitor for testing here if(serialusb.available())c_data=serialusb.read();//take character from serial monitor and store in variable serial1.print(c_data);//send to xbee//echo back what was sent to serialusb.println(“sending character here,“”;serialusb.println(c_数据);}if(当前_按钮Accelerate_state==low)serialusb.println(“已按下Accelerate按钮!”);if(正向_反向_Stick_Value>1000)serialusb.println(“正向”);serial1.print('a');//通过同一频道上的XBEE向Redbot传输数字写入(状态_LED,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,可以将其注释掉;否则,如果(Turnstick_value<20)serialusb.println(“turn right”);serial1.打印(“b”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,可以将其注释掉;否则,如果(正向反向斗杆值<20)serialusb.println(“反向”);serial1.print('c');数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,则可以将其注释掉;否则,如果(转向杆_值>1000)serialusb.println(“左转”)。序列1.打印(“d”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,则可以将其注释掉。数字写入(状态指示灯,高);//打开状态指示灯serial1.print('j');}//在此处调试左侧模拟操纵杆//边界根据操纵杆的读取值而变化//您可能需要调整要校准的条件语句中的值//需要编写附加条件语句以旋转//并反转serialusb.print(“Forward_Reverse_Stick_Value=”);//~ 1023,~7-9下serialusb.println(正向\反向\棒值);serialusb.println(“turnstick_value=”);//左1023,~5-6右serialusb.println(转盘_值);}else//current_buttonAccelerate_state==high//如果不向驱动器发送命令,自动让机器人停止移动serialusb.println(“停止”);数字写入(状态指示灯,高);//打开状态指示灯serial1.print('k');}上一个按钮加速状态=当前按钮加速状态;//保存当前状态延迟(100);//增加LED反馈的短延时,如果这会影响数字写入的性能(状态指示灯,低);//关闭状态LED//结束loopvoid xbee3_reset()//硬件重置/*-xbee系列3硬件参考手册-PG 31电源设计建议VCC和GND之间的去耦电容器。使用10uF电容器测试,不使用。这是不必要的。-第60页:褐色检测。这是必需的。在XBEE的重置和A5之间添加跳线https://www.digi.com/resources/documentation/digidocs/pdf s/90001543.pdf-通过接地重置插脚来实现XBEE系列3的电源循环,以避免斜坡上升和变暗检测中的连续性https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2017/06/14/rmu-e203_Avdd_Ramp-j176-min强制复位时间:EFM32设备=50ns;EFM32PG/JG:Pearl and Jade Gecko=100ns https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2016/07/22/minimum_reset_holdt-pgld*/pinmode(xbee_reset,输出;数字写入(xbee_重置,高);延迟微秒(1);数字写入(xbee_重置,低);延迟微秒(1);数字写入(xbee_重置,高);/*//软件重置//软件重置不适用于XBEE系列3…需要硬件重置延迟(500);//等待XBEE系列3在硬件重置系列1之后启动。写入(“++“”;//输入命令模式延迟(500);//当XBEE进入命令模式serial1.write(“atfr”);//at命令软件重置serial1.write(“\r”);//carrial返回serial1.write(“\n”);//new line*/

需要注意的代码

要添加更多命令,我们只需添加更多IF-()检查右操纵手柄位置的说明,下来,和左边的位置。如果操纵杆处于上述任何位置,发送命令将Redbot向前移动到右侧,反转,向左转,分别。如果操纵杆在中间,我们将发出命令让Redbot海岸稍作改善。否则,当我们不按下D2时,我们将不断发送命令让Redbot停止。

3.2带ATMEGA328P的全机器人控制

在这部分实验中,我们将重复2.2中的步骤,在移动机器人之前接收命令。不是直接向前开,机器人现在可以转动了,反之。

硬件连接

通过USB电缆将Redbot重新连接到计算机。

Mini-B USB电缆插入Redbot

打开素描

将以下代码复制并粘贴到Arduino IDE中。记得,我们需要选择Arduino/Genuino乌诺对于Redbot主板,选择它枚举的对应COM端口,将电源开关拨到接通位置。一旦调整了这些设置,你可以点击上传按钮。

语言:c/*3_2_full_robot_control_atmega328p.ino full robot control atmega328p示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Co英国威廉希尔mmons属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行任何您想要的操作,可用于任何用途。请将此许可证归为属性并保留。远程控制Redbot的第一步是在系链设置中首先将其从串行监视器中驱动出来。这是带有ATMEGA328P的Redbot主板的示例代码。上传这个草图之后,使用USB电缆将Redbot与计算机保持连接。将开关翻到各自的侧面:电机=>运行和电源=>打开。您还需要将UART翻转到Xbee_sw_串行端。假设您在同一个通道上有一对XBee1s(或配置了802.15.4协议的3),一个字符将在XBees之间无线传输。从连接到软件串行定义的插脚的XBEE接收到的任何字符都将传递到串行监视器。对于故障排除,通过串行监视器发送的任何字符都将被回送。尝试测试控制器,看看机器人是否会向前移动或通过串行监视器发送以下字符。A=前进B=前进右转C=后退D=前进左转J=滑行K=发送前进命令时,如果电机不前进,则停止,只需翻转接线即可。您可以调整代码,但这需要调整多行代码。这并不像无线操纵杆例子和Redbot实验9中使用的例子那样,解释了马达的强度。警告:上传到Redbot主板时,请确保将开关切换到xbee-sw-u串行。您在上传代码时会遇到问题,可能会损坏您的xbee.*/包括
          
           //包括Redbot库RedbotMotors电机;//生成redbotchar c_数据的实例;//保存从Xbee到Arduino的输入数据的变量//我们将使用Redbot SoftwareSerial与Xbee进行通信:/,用于ATMEGA328P的//Xbee的DOUT(TX)连接到插脚14(Arduino的软件Rx)//Xbee的DIN(Rx)连接到插脚15(Arduino的软件Tx)包括
           
            RedBot软件系列RedBotXBee;//创建软件串行实例,修改后的软件串行库中已经定义了管脚//led,用于检查LED是否已初始化。const int status_led=13;void set up()//将两个端口都设置为9600波特。这个值对于xbee来说是最重要的。确保波特率与xbee的配置//设置匹配。redbotxbee.begin(9600);//初始化sw for xbee以接收串行串行。begin(9600);//初始化hw以调试串行监视器//状态LED以查看redbot是否正在初始化pinmode(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serial.println(“Redbot初始化!”);//end setupvoid loop()if(redbotxbee.available()serial.available())if(redbotxbee.available())c_data=redbotxbee.read();//将接收到的值从xbee存储到变量else if(serial.available())c_data=serial.read();//将接收到的值从串行监视器存储到变量serial.println(“字符收到,“”;serial.write(c_data);//发送到serial monitor serial.println();数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果它影响性能,则可以将其注释掉,如果(c撊data='a')serial.println(“drive forward”);redbotxbee.write(“a”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(255);//forward else if(c_data==“b”)serial.println(“turn right”);redbotxbee.write(“b”);数字写入(状态指示灯,高);//打开状态LED电机。左电机(-200);//打开左电机电源(motor power=)电机。右电机(100);//打开右侧电机电源(motor power=)else if(c_data='c')serial.println(“reverse”);redbotxbee.write(“c”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(-255);//reverse else if(c_data='d')serial.println(“turn left”);redbotxbee.write(“d”);数字写入(状态指示灯,高);//打开状态LED电机。左电机(-100);//打开左电机电源(motor power=)电机。右电机(200);//打开右侧电机电源(motor power=)else if(c_data='j')serial.println(“coast”);redbotxbee.write(“j”);数字写入(状态指示灯,高);//打开状态LED电机。coast();}else if(c_data='k')serial.println(“stop”);redbotxbee.write(“k”);数字写入(状态指示灯,高);//打开状态LED电机。stop();}}//延时(100);//短暂暂停,这样我们就不会经常收到字符digitalwrite(状态指示灯,低);//关闭状态LED//结束循环
           
          

需要注意的代码

类似于3.1,我们再加一个IF-()如果字符与发送的内容匹配,则移动Redbot的语句。当我们收到向右转的指令时,我们会根据每个条件调整电机的功率和方向。反转,向左转,海岸,或者停止。


你应该看到什么

断开控制器和机器人与计算机的连接。按下D2并移动操纵杆。您应该看到Redbot相对于操纵杆的位置朝着方向移动!

无线控制器指挥机器人前进,向后的,左,正确