主要内容

Arduino机器人的跟踪者应用

这个例子展示了如何在Simulink®中创建一个直线跟随算法,以及如何在Arduino®Robot上运行它。万博1manbetx

简介

万博1manbet万博1manbetxx用于Arduino硬件的Simulink支持包使您能够在Arduino Robot上创建和运行Simulink模型。这个机器人有两个Leonardo (ATmega32u4)的板:Arduino机器人电机板和Arduino机器人控制板。Arduino机器人控制板有外围设备,如模拟输入引脚,数字输入/输出引脚,PWM,键盘,电位器(POT),罗盘,蜂鸣器等。Arduino机器人电机板具有外设,如模拟输入引脚,数字输入/输出引脚,PWM,电机驱动器,电机,车轮,微调电位器(TRIM),红外传感器等。有关更多细节,请参阅Arduino机器人网站

这个例子展示了如何创建一个Simulink模型,通过访问红外传感器和电万博1manbetx机,在Arduino机器人电机板上运行直线跟踪算法。您将学习如何使用来自Simulink库的块和来自Arduino硬件的Simulink支持包的标准Arduino库访问Arduino机器人电机板的外设。万博1manbetx万博1manbetx

本示例演示了如何使用来自Simulink库和标准Arduino库的块访问Arduino机器人控制板的外围设备(键盘,蜂鸣器)。万博1manbetx您将学习如何建立Arduino机器人控制板和Arduino机器人电机板之间的串行通信。

先决条件

如果您是Simulink的新手,我们万博1manbetx建议您完成交互式Simulink教万博1manbetx程开始使用Simulink万博1manbetx,万博1manbetxSimulink入门视频。

所需的硬件

要运行这个例子,你需要以下硬件:

  • Arduino机器人

  • USB电缆

  • 四节可充电镍氢AA电池

  • 9 v适配器

  • 轨道图纸在A0白色薄板上,约1.5"宽黑线

open_system (“arduinorobot_linefollower”

直线跟随器应用介绍

Arduino机器人的直线跟随机构如下图所示:

在这个应用程序中,您需要从黑线的中心获得Arduino机器人的当前偏差,以获得Error信号。根据错误信号,您将驱动Arduino机器人电机板上的电机采取纠正措施,并使Arduino机器人回到黑线的中心。

1.在检查Arduino机器人时,您会注意到Arduino机器人电机板上的红外传感器可用于获取Arduino机器人从黑线中心的电流偏差。您将学习使用来自Simulink库和标准Arduino库的块从IR传感器读取值。万博1manbetx

2.您将学习如何提供脉宽调制(PWM)信号来控制连接到Arduino机器人电机板的电机,并旋转轮子来移动Arduino机器人。

Task 1 -创建Simuli万博1manbetxnk子系统读取Arduino机器人电机板上的红外传感器

在本节中,您将学习如何将IR Sensor的值解码为一个维度为5的Simulink信号,该信号对应于Arduino机器人电机板上的IR传感器万博1manbetx数量。描述的逻辑在红外传感器分系统.有关Arduino机器人电机板的更多信息,请参阅Arduino机器人网站.注意IR传感器的以下连接:

5个红外传感器(IR0-IR4)连接到多路复用器(MUX)的输入通道上。MUX选择器MUXA、MUXB、MUXC分别连接到微控制器上的数字引脚7、8、11。微控制器一次只能读取一个红外传感器,通过提供3个数字信号(MUXA, MUXB, MUXC)在MUX的输出上选择所需的红外传感器信号。3个数字信号足以访问5个红外传感器。MUXA是LSB, MUXC是选择符字节的MSB。根据选择器字节,选择如下IR传感器:

MUXC | MUXB | MUXA |红外sensor_number  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0 | 0 | 0 | 0 0 0 | 0 | 1 | 1 | 1 | 0 | 1 2 0 | 1 | 1 | 3 | 0 | 0 | 4  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

所选红外传感器,出现在MUX输出上,连接到微控制器的模拟引脚A2。

下面的步骤将向您展示如何在Simulink中创建一个屏蔽子系统来读取IR传感器。万博1manbetx

1.使用一个常数块来决定要读取哪个红外传感器。取一个常量块库:Simulin万博1manbetxk >源代码并更新以下设置:恒定值->任意值从0-4,采样时间-> 0.002,输出数据类型-> uint8。0 ~ 4对应红外传感器编号。

2.将红外传感器编号转换为二进制值,以提供输入到MUXA, MUXB, MUXC对应的数字引脚使用按位运算符块。使用3按位运算符块与操作和值0x1, 0x2, 0x4分别为选择字节提供LSB到MSB。使用3数字输出街区库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common将MUXA、MUXB、MUXC的引脚编号分别填充为7、8、11。将选择字节的LSB(从AND操作获得)连接到MUXA对应的数字输出块,中间位连接到MUXB, MSB连接到MUXC。

3.使用一个模拟输入块从库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common读取与MUX输出相对应的引脚A2。输入Pin号2和采样时间0.001。模拟输入块从红外传感器读取数据类型为uint16的值,范围为0-10230 -白色而且1023 -黑).使用一个数据类型转换块将值转换为int16。将数据类型转换块的输出连接到外港

4.将数字输出块的优先级设置为1,因为在读取IR传感器值之前需要写入选择字节。将模拟输入块的优先级设置为任意值> 1,以确保它在选择器字节写入MUX后执行。要设置块的优先级,右键单击块>属性>常规>优先级。要了解更多关于块优先级及其对块执行顺序的影响,请参见指定块属性

5.使用一个对于迭代器子系统通过5个传感器进行循环。For Iterator子系统的输入是在步骤1中创建的常量块。Constant块的值为[0 1 2 3 4],表示所有5个传感器。使用外港for迭代器子系统的输出。

6.将步骤2-4创建的块放在For Iterator子系统中。的内部打开For Iterator子系统红外传感器分系统的设置选择器而且赋值块。Selector和Assignment块用于每次循环通过一个IR传感器编号,并将值分配给输出向量。

7.通过选择步骤6中创建的所有块来创建一个子系统,如下所示:

Task 2 -在Arduino万博1manbetx机器人电机板上创建Simulink子系统控制电机

在本节中,您将学习如何使用所需的扭矩Simulink信号,使Arduino机器人电机板上的两个电机向前和反向旋转。万博1manbetx描述的逻辑在汽车子系统.Arduino机器人电机板原理图显示了微控制器和电机驱动器之间的以下连接:

电机驱动器通过从微控制器获取输入来控制左右电机的速度和方向。注意,微控制器的数字引脚6,5,10,9连接到电机驱动器的IN_A1, IN_A2, IN_B1, IN_B2。电机驱动器的输入IN_A1、IN_B1分别对应左右电机的向前运动。IN_A2、IN_B2分别对应左右电机的反向运动。

脉冲宽度调制(PWM)信号可用于控制电机。从微控制器到电机驱动器的正输入对应电机的向前运动,而负输入对应电机的反向运动。对于两个电机的向前运动,您将PWM信号应用到IN_A1和IN_B1,将零值应用到IN_A2和IN_B2。类似地,对于反向移动,只对IN_A2和IN_B2应用PWM信号,对IN_A1和IN_B1应用零值。

下面的步骤向您展示如何在Simulink中创建一个屏蔽子系统来控制电机。万博1manbetx

1.使用一个轮廓尺寸块从微控制器获得左电机的输入。

2.的脉宽调制阻塞存在于库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common可用于发送PWM信号来控制电机。使用2个PWM块,输入IN_A1, IN_A2的引脚编号6,5。

3.输入值与IN1 (IN_A1/ IN_B1)、IN2 (IN_A2/ IN_B2)的关系如下:

输入| IN1 | IN2  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + 已经输入| 0负| 0 | | abs(输入 ) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

对于向前移动,使用aMUX块到多路输入值和一个常数数据类型为int16的0值块。

4.PWM块接受0-255 (uint8)的值。对于反向移动,使用an腹肌将负输入值转换为正输入值,并将其与步骤3中使用的值为0的Constant块相乘。

5.使用有条件的Switch块u2 >阈值其中u2 ->输入,Threshold -> 0。如果条件满足,则选择正向运动多路复用值,否则选择反向运动多路复用值。

6.使用一个多路分配器块,并将输出连接到IN_A1, IN_A2对应的2个PWM块。

7.对右马达重复步骤1-6的整个逻辑。输入引脚编号10,9对应IN_B1, IN_B2的2个PWM块。

8.通过选择所有的块来创建一个子系统,使其看起来如下所示:

open_system (“arduinorobot_linefollower /机器人/汽车”

任务3 -用直线跟随算法建立S万博1manbetximulink模型

本节将跟随线算法实现为一个PID控制器的闭环控制系统。描述的逻辑在跟随线算法子系统.算法描述如下:

蓝点代表红外传感器(IR0 - IR4)。当Arduino机器人在黑线的中心时,IR2读取黑色(~1023),IR0, IR1, IR3, IR4读取白色(~0)。选择一个阈值将0-1023的范围转换为二进制值。当低于阈值(明亮或白色背景)时为1,当高于阈值(深色或黑色背景)时为0。

给每个传感器一个权重,当检测到较大偏差时,越高的值越极端,提供越高的控制信号。加权电流偏差由下式计算:

$$当前\偏差= \frac{\sum_0^4\ sensor\ reading\ (0/1)\ *\
对应\重量}{number\ of\ sensors\ reading\ 0} $$

当机器人位于一条细黑线的中心时,IR2读取0,而IR0、IR1、IR3、IR4读取1。

代入式中的值,计算出电流偏差如下:

$ $目前\偏差= \压裂{(1 * 4)+ (1 * 2)+ (0 * 0)+ (1 * 2)+ (1 * 4)}{1}= 0 $ $

期望的偏差当机器人处于中心位置时,一条黑色细线被设为恒定值0。误差计算为$错误\ =\期望\偏差-当前\偏差$.这种情况下,当电流偏差为0时,误差为0,机器人可以直线运动。所有可能的错误汇总如下表所示:

  • * -除以零的大小写

注意,正误差意味着Arduino机器人>的右转,左电机转矩增加,右电机转矩减少。Arduino Robot的负误差意味着左转>左电机转矩减少,右电机转矩增加。

要在Simulink中实现上面提到的直线跟随逻辑,您可以创建两个子系统:一个子系统使用IR传感器获取Arduin万博1manbetxo机器人的当前偏差,另一个用于控制电机。的实现示例中可以看到跟随线算法子系统模型的。

1.往里面看电流偏差计算分系统.根据上述算法给出了机器人的电流偏离黑线中心的距离。

注意事项:

  • 红外传感器门限设置为恒定值600。

  • 使用获得

  • 整数溢出时饱和选项检查for Math函数块

  • 整数舍入模式作为为Product块,以确保当前偏差代表精确的整数值。

  • 开关块,以照顾可能的除以零情况下的电流偏差计算。

2.分析力矩估计子系统.它给出了左、右电机所需的转矩值(从-255到255)。

注意事项:

  • 机器人的基本扭矩设置为恒定值100。的数据类型设置为int16以匹配的数据类型Torque_correction

  • 状态流图实现在三个不同的状态之间切换:GoStraight, TurnLeft, TurnRight基于的值Torque_direction

3.观察到红外传感器子系统的优先级为1,电机子系统的优先级低得多,例如5,以确保只有在获得机器人从红外传感器的电流偏差后,控制动作才应用到电机。

4.在本例中,使用一个离散PID控制器块来根据错误获得控制动作。你可能需要通过将机器人放置在轨道上迭代地调整P, I, D值。确保电池有足够的电量让轮子正常运转。

Task 4 -在Arduino机器人电机板上运行线跟随器应用

在本节中,您将学习在Arduino机器人电机板上部署Simulink算法所需的步骤。万博1manbetx

1.用USB线将Arduino机器人电机板连接到您的主机。这条电缆也会为电路板供电。

2.在模型中,单击仿真>模型配置参数打开配置参数对话框。在打开的对话框中,选择硬件实现窗格选择和Arduino机器人电机板作为硬件板从下拉菜单。您可以手动选择COM端口号,也可以保留它自动并保持其余设置为默认值。然后单击应用> OK.一个预先配置的模型包括您的方便。

3.在硬件选项卡中的万博1manbetx模式部分中,选择在船上奔跑然后点击构建、部署和启动

4.下载完模型后,断开Arduino机器人电机板上的USB线。

5.将机器人放置在轨道上,并在Arduino机器人电机板上打开机器人电源开关。模型在Arduino机器人电机板上运行,Arduino机器人开始移动。

6.环境光线、履带厚度等因素都会影响机器人对黑线的跟踪能力。如果Arduino机器人没有跟踪黑线。为了克服这些问题,可以调优离散PID控制器的P、I、D值,并改变模型中的Base Torque、IR传感器门限的值,使机器人跟踪黑线。在Arduino机器人电机板上再次下载模型使用构建、部署和启动选择。重复这一步骤,直到Arduino机器人正确地沿着黑线移动。

7.关闭机器人开关。

Task 5 -利用Arduin万博1manbetxo机器人控制板和Arduino机器人电机板之间的串行通信扩展Simulink模型

在本节中,您将学习如何建立Arduino机器人电机板和Arduino机器人控制板之间的串行通信。您将学习如何解码Arduino机器人控制板上的键盘信号,以及如何使用它们作为Arduino机器人电机板上的控制信号。所描述的逻辑在Arduino机器人控制板模型而且Arduino机器人电机板模型

本例使用Arduino机器人控制板上的键盘和蜂鸣器外设向Arduino机器人电机板发送控制命令并对从Arduino机器人电机板收到的反馈作出反应。有关Arduino机器人电机板的更多信息,请参阅Arduino机器人网站.如图所示,键盘连接到Arduino机器人控制板的A0引脚上。键盘有5个按键控制一个分压器电路。按键后检测到的电压由微控制器上的10位(0-1023)模拟数字值表示。根据引脚A0处电压的数字表示,您可以知道按下的是哪个键。

A0_Digital_Value | Key _ _ _ _ _ _ _ _ _ _ _ _ _ 0-10 | 1 133-153 | 2 319-339 | 3 494-514 | 4 732-752 | _ _ _ _ _ _ _ _ _ _ _ _ _

Arduino机器人控制板原理图显示,蜂鸣器连接到数字引脚D5上。

您可以通过按Arduino机器人控制板上的一个键来控制Arduino机器人电机板上轮子的运动,并根据从Arduino机器人电机板上收到的反馈在蜂鸣器上播放声音。串口通信用于两块板之间的数据传输。

一)从Arduino机器人控制板键盘发送串行命令:

你可以在Arduino机器人控制板上看到按下的键。5键可用于切换机器人的两种模式:跟随线模式和手动模式。根据选择的模式和按下的按键,可以向Arduino机器人电机板发送串行命令。下表汇总了Arduino机器人控制板连续发送的数据:

模式|键按下| |串行数据移动  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 行追随者| NA |跟踪黑线中心| 1手动| | | 0停止没有手动| 1 |逆时针| 2手册| 2 | |落后3手册| 3 | |转发4手动顺时针| 4 | | 5  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
  • NA -不适用

1.打开Arduino机器人控制板模型.要知道按下的键可以使用模拟输入块从库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common引脚编号0,采样时间0.004。

2.观察关键防反跳逻辑,使用状态流图验证按键是否持续按下0.016秒。请注意,键反弹时间可能因机器人硬件的不同而不同。

3.的modeSelect状态流程图检测键5是否被按下,并从线路跟踪模式切换到手动模式,反之亦然。注意,默认模式是直线跟随。除5以外的任何按键都不会对Line Follower模式产生任何影响。

4.的串行命令子系统确定要以直线跟踪器或手动模式发送的数据。在手动模式下,可以根据按键向Arduino机器人电机板发送的数据来移动机器人。

5.使用串行传输块从库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common使用端口1将命令发送到Arduino机器人电机板。Serial Transmit块的初始值为1,表示Line Follower模式为默认模式。

6.注意,模拟输入键盘读取块的优先级是1,串行传输块的优先级要低得多,比如10。这确保您在连续发送命令之前确定按下的键。

b)接收Arduino机器人电机板串行数据并反馈:

1.打开Arduino机器人电机板模型.从Arduino机器人控制板接收串行数据串行接收块从库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common使用端口1和采样时间0.002。控件上的“串行接收”块的采样率高于“串行发送”块Arduino机器人控制板模型以确保不遗漏任何数据。

2.观察决定模式用于确定Arduino机器人电机板遵循的模式的状态流程图。默认模式为“跟随线”。请注意状态Serial Receive块的输出指示是否接收到任何新数据。状态流图使用状态信息相应地在模式之间切换。

3.参见启用的子系统跟随线模式其中包含行跟踪算法。

4.的手动模式启用的子系统使用开关情况块。从Arduino机器人控制板接收到的数据从Case子系统中选择相应的移动。默认的移动是停止,即左电机输入和右电机输入都是0。

5.根据Switch Case块所选择的移动,Serial Transmit块(带有端口1)将反馈发送到Arduino机器人控制板。值1、2和0作为反馈发送。值1对应逆时针或顺时针移动选择。值2对应向前或向后移动选择。0表示“停止”的默认移动。

6.Switch Case块的优先级(1)高于Serial Transmit块的优先级(20)。

7.你可以看到跟随线模式手动模式子系统将左电机和右电机的转矩作为输出。这些输出使用合并块,并作为电机子系统的输入。串行接收块的优先级高于电机子系统。

c)在Arduino机器人控制板上连续接收反馈:

1.打开Arduino机器人控制板模型.的串行接收端口为1,采样时间为0.002的块接收来自Arduino机器人电机板的反馈。

2.的确定基调状态流图使用串行接收块接收到的数据来确定要播放的音调。以下是接收到的数据和所选音调的摘要:

数据收到|基调(Hz ) _ _ _ _ _ _ _ _ _ _ _ _ _ 1 | 2 | 125 0 | 0  _ _ _ _ _ _ _ _ _ _ _ _ _

3.脉冲发生器块用于产生50hz和125hz的频率。常量块用于0赫兹。

4.这些音调使用合并块合并并作为输入数字输出块从库:Simulin万博1manbet万博1manbetxxk支持包Arduino硬件> Common.引脚编号设置为蜂鸣器对应的5。

5.串行接收块的优先级低于串行发送块,蜂鸣器块的优先级最低。

Task 6 -在Ardu万博1manbetxino机器人控制板和Arduino机器人电机板上运行Simulink模型

在本节中,您将学习在Arduino机器人控制板和Arduino机器人电机板上部署Simulink算法所需的步骤。万博1manbetx

1.首先用USB线将Arduino机器人控制板连接到您的主机。

2.在Arduino机器人控制板模型,选择“硬件板”为Arduino机器人控制板仿真>型号配置参数>硬件实现.选择“手动”或“自动”COM端口,保持其他设置为默认值。在硬件选项卡中的万博1manbetx模式部分中,选择在船上奔跑然后点击构建、部署和启动

3.下载完模型后,断开Arduino机器人控制板上的USB线。

4.用USB线将Arduino机器人电机板连接到您的主机。

5.在Arduino机器人电机板模型,选择“硬件板”为Arduino机器人电机板仿真>型号配置参数>硬件实现.选择“手动”或“自动”COM端口,保持其他设置为默认值。在硬件选项卡中的万博1manbetx模式部分中,选择在船上奔跑然后点击构建、部署和启动

6.下载完模型后,断开Arduino机器人控制板上的USB线。

7.将机器人放在地面上,打开Arduino机器人电机板上的电源开关。模型在板子上运行,Arduino Robot以默认的Line Follower模式启动。当您按下5键时,它从直线跟踪器切换到手动模式,并按默认动作在手动模式下停止。然后根据按键1、2、3或4,只要按下键,它就会逆时针、向后、向前或顺时针移动。一旦你松开钥匙,机器人就进入停止模式。按下5键,机器人切换到直线跟随模式。

8.关闭机器人开关。

其他可以尝试的事情

  • 通过使用一些示例输入,验证每个子系统的工作情况,以实现外设访问。例如,您可以使用通过Constant块(值从-255到255)到子系统的样例输入来控制电机,以查看车轮是向前旋转还是向后旋转。

  • 调整PID控制器设置。提高机器人的移动速度和急转弯的能力。

  • 本例使用恒定的红外传感器门限值。尝试实现红外传感器门限的动态计算,门限可能因环境光而变化。

  • 在这个例子中使用了一个恒定的Base Torque值。试着动态调整基础扭矩。例如,你可以通过增加直线运动的基础扭矩来让机器人走得更快。为了确保更平稳的转弯,你可以降低基础扭矩。

  • 尝试访问Arduino机器人控制板和Arduino机器人电机板上的其他外设。例如,探索从Arduino机器人控制板上的电位器向Arduino机器人电机板发送串行命令。