主要内容

Arduino®机器人的直线跟随器应用

这个例子展示了如何在Simulink®中创建一个直线跟随算法,以及如何在Arduino机器人上运行它。金宝app

介绍

金宝appSimu金宝applink Support Package for Arduino Hardware可以在Arduino Robot上创建和运行Simulink模型。该机器人有两块基于Leonardo (ATmega32u4)的主板:Arduino机器人电机板和Arduino机器人控制板。Arduino机器人控制板有模拟输入引脚、数字输入/输出引脚、PWM、键盘、电位器(POT)、指南针、蜂鸣器等外围设备。Arduino机器人电机板有模拟输入引脚、数字输入/输出引脚、PWM、电机驱动器、电机、车轮、微调电位器(TRIM)、红外传感器等外围设备。有关详情,请参阅Arduino机器人网站

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

这个例子演示了如何使用Simulink库和标准Arduino库中的模块访问Arduino机器人控制板的外围设备(键盘,蜂鸣器)。金宝app您将学习如何在Arduino机器人控制板和Arduino机器人电机板之间建立串行通信。

先决条件

如果您是Simulink的新手,我们金宝app建议您完成交互式Simulink教金宝app程,阅读“入门”部分金宝app仿真软件文档跑步金宝appSimulink入门示例

所需的硬件

要运行此示例,您将需要以下硬件:

  • Arduino机器人

  • USB电缆

  • 4节可充电镍氢AA电池

  • 9 v适配器

  • Track drawing on A0 white sheet with ~ 1.5”宽黑线(样品跟踪

介绍直线跟随器的应用

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

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

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

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

任务1 -创建一个Simulink子金宝app系统来读取Arduino机器人电机板上的红外传感器

在本节中,您将学习如何将IR传感器值解码为Simulink信号的5个维度,对应于Arduino机器人电机板上的IR传感器数量。金宝app所描述的逻辑在红外传感器子系统.Arduino机器人电机板的原理图可从网站的“原理图及参考设计”一节下载Arduino机器人网站.红外传感器的连接方式如下:

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

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传感器。金宝app

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

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

3.使用模拟输入阻止库:针对Ardui金宝appno硬件金宝app的Simulink支持包>通用读取对应MUX输出的引脚A2。输入引脚2和取样时间0.001。模拟输入块从红外传感器读取数据类型uint16的值,范围从0-10230 -白色1023-黑色).使用数据类型转换块将值转换为int16。将数据类型转换块的输出连接到外埠

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

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

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

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

任务2 -创建Simulink子系统金宝app来控制Arduino机器人电机板上的电机

在本节中,您将学习如何使用所需的扭矩Simulink信号,在Arduino机器人电机板上旋转2个电机,向前和反向方向。金宝app所描述的逻辑在电机子系统. 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。类似地,对于反向运动,必须将PWM信号仅应用于IN_A2和IN_B2,将零值应用于IN_A1和IN_B1。

下面的步骤展示了如何在Simulink中创建一个屏蔽子系统来控制电机。金宝app

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

2.脉宽调制存在于中的块库:针对Ardui金宝appno硬件金宝app的Simulink支持包>通用可用于发送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(输入 ) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

对于向前移动,请使用MUX块多路输入值和a常数数据类型为int16的值为0的块。

4.PWM块接受0-255 (uint8)的值。如果要反向移动,请使用腹肌块输出数据类型->int16,整数舍入模式->舍入,将负输入值转换为正,并将其与步骤3中使用的常量块进行多路复用,值为0。

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

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

7.对正确的电机重复步骤1-6中的整个逻辑。输入对应IN_B1, IN_B2的2个PWM模块的引脚10,9。

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

任务3 -用直线跟随算法建立Sim金宝appulink模型

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

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

每个传感器都有一个权重,当检测到更高的偏差时,每个传感器都有更高的值,以提供更高的控制信号。加权电流偏差由下式计算:

$$ Current\ deviation = frac{\sum_0^4\ sensor\ read \ (0/1)\ *\

当机器人以细黑线为中心时,IR2读数为0,IR0, IR1, IR3, IR4读数为1。

替换方程式中的值,电流偏差计算如下:

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

期望的偏差当机器人以一条细黑线为中心时,将常数值设为0。误差计算为$Error\ =\ Desired\ deviation - Current\ deviation$. 在这种情况下,当电流偏差为0时,误差为0,机器人可以直线移动。下表列出了所有可能错误的汇总列表:

  • *-除以零的情况

注意,正误差意味着Arduino机器人右转->左电机扭矩增加,右电机扭矩减少。Arduino机器人的负误差表示左转->左电机转矩减小,右电机转矩增大。

为了在Simulink中实现上面提到的线跟随逻辑,可以创建两个子系统:一个是使用IR传感器获取Arduino机器金宝app人的电流偏差,另一个是控制电机。中的实现示例可以看到直线跟随算法子系统的模型。

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

注意事项:

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

  • 使用获得

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

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

  • 开关块处理当前偏差计算中可能出现的被零除情况。

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

注意事项:

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

  • 状态流程图实现在三种不同的状态之间切换:GoStraight, TurnLeft, TurnRightTorque_direction

3.观察红外传感器子系统的优先级为1,电机子系统的优先级为5,以确保只有在获得机器人与红外传感器的电流偏差后才对电机施加控制动作。

4.在这个例子中,一个离散PID控制器块被用来得到基于误差的控制动作。您可能需要通过将Robot放置在轨道上迭代地调整P、I、D值。确保电池充足电以使车轮正常运转。

任务4-在Arduino机器人电机板上运行直线跟随器应用程序

在本节中,您将学习在Arduino机器人电机板上部署Simulink算法所需的步骤。金宝app

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

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

3.下一个点击部署到硬件按钮。

4.下载模型后,断开USB电缆与Arduino机器人电机板的连接。

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

6.环境光和轨道厚度等因素会影响机器人对黑线的跟踪能力。如果Arduino机器人不跟踪黑线。为了克服这些问题,可以通过调整离散PID控制器的P、I、D值,改变模型中的基转矩、红外传感器阈值,使机器人跟踪黑线。在Arduino机器人电机板上再次下载模型使用部署到硬件选择。重复,直到Arduino机器人正确地跟随黑线。

7.关闭机器人开关。

任务5-通过Arduino机器人控制板和Arduino机器人电机板之间的串行通信扩展模型

在本节中,您将学习如何建立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 | 5 _ _ _ _ _ _ _ _ _ _ _ _ _

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

通过按下Arduino Robot control Board上的按键,可以控制Arduino Robot Motor Board上轮子的移动,并根据Arduino Robot Motor Board收到的反馈信息在Buzzer上播放音调。两块板之间采用串行通信进行数据传输。

一)通过Arduino机器人控制板键盘发送串口命令:

您可以读取Arduino机器人控制板上按下的键。键5可用于在机器人的两种模式之间切换:直线跟随器模式和手动模式。根据选择的模式和按下的键,您可以向Arduino机器人电机板发送串行命令。下表总结了Arduino机器人控制板串行发送的数据:

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

1.打开Arduino机器人控制板模型. 要知道按下的键,可以使用模拟输入阻止库:针对Ardui金宝appno硬件金宝app的Simulink支持包>通用引脚编号0,采样时间0.004。

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

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

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

5.使用串行传输阻止库:针对Ardui金宝appno硬件金宝app的Simulink支持包>通用端口1发送命令到Arduino机器人电机板。串行传输块的初始值为1,表示默认的线跟随器模式。

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

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

1.打开Arduino机器人电机板模型. 从Arduino机器人控制板a接收串行数据串行接收阻止库:针对Ardui金宝appno硬件金宝app的Simulink支持包>通用端口1,采样时间0.002。注意,串行接收块比串行传输块有更高的采样率Arduino机器人控制板模型确保不丢失任何数据。

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

3.参见启用的子系统行跟随者模式有线跟随算法放置在里面。

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

5.根据Switch Case块选择的移动,串行传输块(端口1)将反馈发送给Arduino机器人控制板。值1、2和0作为反馈发送。值1对应逆时针或顺时针移动选择。值2对应向前或向后移动选择。值0对应停止的默认移动。

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

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

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

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

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

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

3.脉冲发生器模块用于产生50 Hz和125 Hz频率。一个常量块用于0hz。

4.这些色调被合并使用合并块并作为输入数字输出阻止库:针对Ardui金宝appno硬件金宝app的Simulink支持包>通用.“蜂鸣器”对应的Pin码设置为5。

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

任务6 -在Arduino机器人控制板和Arduino机器人电机板上运行各自的模型

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

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

2.Arduino机器人控制板模型,选择五金板为Arduino机器人控制板仿真>模型配置参数>硬件实现.选择COM端口手动或自动,同时保持其余设置为默认。然后点击部署到硬件按钮。

3.下载模型后,断开USB电缆与Arduino机器人控制板的连接。

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

5.Arduino机器人电机板模型,选择五金板为Arduino机器人电机板仿真>模型配置参数>硬件实现.选择COM端口手动或自动,同时保持其余设置为默认。然后点击部署到硬件按钮。

6.下载模型后,断开USB电缆与Arduino机器人控制板的连接。

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

8.关闭机器人开关。

其他可以尝试的事情

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

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

  • 本例使用一个恒定的红外传感器阈值。尝试实现红外传感器阈值的动态计算,该阈值会因环境光线而变化。

  • 本例中使用恒定的基本扭矩值。尝试动态调整基本扭矩。例如,通过增加直线运动的基本扭矩,可以使机器人走得更快。为确保转弯更平稳,可以减小基本扭矩。

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

总结

这个例子展示了如何创建一个线条跟随应用程序,并在Arduino机器人上运行它。这个例子为Arduino机器人提供了一个基本的线跟随算法。看看你是否可以修改现有的算法或实现一个新的算法,使你的机器人跟踪黑线更快,不管在轨道设计中的任何十字路口或锐角转弯,都遵循这条线。

在本例中,您已经学习了如何使用Simulink Support Package for Arduino Hardware中的模块访问Arduino机器人电机板、Arduino机器人控制板的不同外围设备。金宝app金宝app学习了Arduino机器人控制板与Arduino机器人电机板之间的串行通信。

使用Simulink库和Simulink Support Package中的模块访问Arduino机器人不同外设的技术可以扩展到其他基于Arduino的板上。金宝app金宝app