本示例演示如何在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建议您完成交互式仿真软件教程金宝app,开始使用Simulink金宝app,金宝appSimulink入门视频。
要运行此示例,您将需要以下硬件:
Arduino机器人
数据线
4节可充电镍氢AA电池
9 v适配器
Track drawing on A0 white sheet with ~ 1.5”宽黑线
Arduino机器人的直线跟随机构如下图所示:
在此应用程序中,您需要获取Arduino机器人当前偏离黑线中心的偏差,以获取错误信号。根据错误信号,您将驱动Arduino机器人电机板上的电机采取纠正措施,并将Arduino机器人带回黑线的中心。
1.在检查Arduino Robot时,你会注意到Arduino Robot Motor Board上的红外传感器可以得到Arduino Robot的电流偏离黑线的中心。您将学习使用来自Simulink库和标准Arduino库的块从IR传感器读取值。金宝app
2.您将学习如何提供脉宽调制(PWM)信号,以控制连接到Arduino机器人电机板的电机,并旋转车轮以移动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数字输出隔库:Arduino金宝app硬件的S金宝appimulink支持包> Common将MUXA、MUXB、MUXC的Pin码分别填充为7、8、11。连接选择器字节的LSB(从AND操作获得)到对应于MUXA的数字输出块,中间位到MUXB, MSB到MUXC。
3.使用一个模拟输入块从库:Arduino金宝app硬件的S金宝appimulink支持包> Common读取与多路复用器输出相对应的引脚A2。输入管脚编号2和采样时间0.001。模拟输入块从红外传感器读取范围为0-1023的数据类型uint16的值(其中0 -白色和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中创建的所有块来创建一个子系统,它看起来如下所示:
在本节中,您将学习如何使用所需的扭矩Simulink信号使Arduino机器人电机板上的两个电机在正反方向旋转。金宝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.的脉宽调制块出现在库:Arduino金宝app硬件的S金宝appimulink支持包> 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块多路输入值和a常数数据类型为int16的值为0的块。
4.PWM块接受0-255 (uint8)的值。如果要反向移动,请使用腹肌整数舍入模式->舍入将输入的负值转换为正值,并使用步骤3中值为0的Constant块将其多重化。
5.使用带条件的Switch块u2 >阈值其中u2 ->输入,Threshold ->。如果条件满足,则选择正向移动多路复用值,否则选择反向移动多路复用值。
6.使用一个多路分配器将输出连接到对应于IN_A1, IN_A2的2个PWM模块。
7.对正确的电机重复步骤1-6中的整个逻辑。输入对应IN_B1, IN_B2的2个PWM模块的引脚10,9。
8.通过选择如下所示的所有块来创建一个子系统:
在本节中,线跟随器算法被实现为带有PID控制器的闭环控制系统直线跟随算法子系统.算法描述如下:
蓝点表示红外传感器(IR0 - IR4)。当Arduino机器人位于黑线中心时,IR2读数为黑色(~1023),IR0、IR1、IR3、IR4读数为白色(~0)。选择一个阈值将0-1023的范围转换为二进制值。当低于阈值(亮或白色背景)时为1,高于阈值(暗或黑色背景)时为0。
每个传感器都有一个权重,当检测到更高的偏差时,每个传感器都有更高的值,以提供更高的控制信号。加权电流偏差由下式计算:
当机器人以细黑线为中心时,IR2读数为0,IR0, IR1, IR3, IR4读数为1。
代入式中,计算出电流偏差如下:
的期望的偏差当机器人以一条细黑线为中心时,将常数值设为0。误差计算为.在这种情况下,当电流偏差为0时,误差为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控制器块用于根据误差获得控制动作。您可能需要通过将机器人放置在轨道上,反复调整P、I、D值。确保蓄电池充电足够,以使车轮正常运转。
在本节中,您将学习在Arduino机器人电机板上部署Simulink算法所需的步骤。金宝app
1.使用USB电缆将Arduino机器人电机板连接到主机。该电缆还将为该板供电。
2.在模型中,单击模拟>模型配置参数打开配置参数对话框。在打开的对话框中,选择硬件实现窗格中选择和Arduino机器人电机板作为硬件板从下拉菜单。您可以手动选择COM端口号或让它保持不变自动并将其余设置保留为默认值。然后单击应用>好吧A.预配置模型是为了你的方便。
3.在硬件选项卡中的金宝app模式部分中,选择机上运行然后单击构建、部署和启动.
4.下载模型后,断开Arduino机器人电机板上的USB线。
5.将机器人放在轨道上,打开Arduino机器人电机板上的机器人电源开关。模型在Arduino机器人电机板上运行,Arduino机器人开始移动。
6.环境光和轨道厚度等因素会影响机器人对黑线的跟踪能力。如果Arduino机器人不跟踪黑线。为了克服这些问题,可以通过调整离散PID控制器的P、I、D值,改变模型中的基转矩、红外传感器阈值,使机器人跟踪黑线。在Arduino机器人电机板上再次下载模型使用构建、部署和启动选择。重复,直到Arduino机器人正确地跟随黑线。
7.关闭机器人开关。
在本节中,您将学习如何在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机器人控制板串行发送的数据:
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU键键键压下的模式。键键键键键压下,移动移动,移动,移动,移动,移动,移动,移动,串行数据数据数据数据数据数据,移动,串行数据数据,数据,数据,数据,数据,数据,数据,数据,数据,移动,移动,移动,移动,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,数据,手动3前进4手动4顺时针5_ _ _ _ _ _
NA -不适用
1.打开Arduino机器人控制板模型.要知道按下的键可以使用模拟输入块从库:Arduino金宝app硬件的S金宝appimulink支持包> Common引脚编号0,采样时间0.004。
2.观察关键防反跳使用状态流程图验证按键是否保持按下0.016 s的逻辑。请注意,按键解除抖动时间可能因机器人硬件而异。
3.的modeSelect状态流程图检测是否按下键5,并从直线跟踪模式切换到手动模式,反之亦然。注意,默认模式是直线追随者。除5之外的任何按键对直线跟随模式没有任何影响。
4.的串行命令子系统决定以直线跟随器或手动模式发送的数据。在手动模式下,可以根据按键发送到Arduino机器人电机板的数据使机器人移动。
5.使用串行传输块从库:Arduino金宝app硬件的S金宝appimulink支持包> Common端口1发送命令到Arduino机器人电机板。串行传输块的初始值为1,表示默认的线跟随器模式。
6.注意,模拟输入键盘读块的优先级是1,串行传输块的优先级要低得多,比如10。这确保您在连续发送命令之前确定按下的键。
b)在Arduino机器人电机板上接收串口数据并发送反馈:
1.打开Arduino机器人电机板模型.从Arduino机器人控制板接收串行数据串行接收块从库:Arduino金宝app硬件的S金宝appimulink支持包> Common端口1,采样时间0.002。注意,串行接收块比串行传输块有更高的采样率Arduino机器人控制板模型以确保不遗漏任何数据。
2.观察决定模式用于确定Arduino机器人电机板所遵循的模式的状态流程图。默认模式为直线跟随。请注意,状态串行接收块的输出指示是否接收到任何新数据。状态流程图使用状态信息在相应的模式之间切换。
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)uuuuuuuuuuuuuu1 | 50 2 | 125 0 | 0 uuuuuuuuuuuuuuu_
3.脉冲发生器模块用于产生50 Hz和125 Hz频率。一个常量块用于0hz。
4.这些色调被合并使用合并块并作为输入数字输出块从库:Arduino金宝app硬件的S金宝appimulink支持包> Common.与蜂鸣器对应的引脚编号设置为5。
5.串行接收模块的优先级小于串行发送模块,蜂鸣器模块的优先级最小。
在本节中,您将学习在Arduino机器人控制板和Arduino机器人电机板上部署Simulink算法所需的步骤。金宝app
1.先用USB线将Arduino机器人控制板连接到主机。
2.在Arduino机器人控制板模型,选择五金板为Arduino机器人控制板下模拟>模型配置参数>硬件实现.选择COM端口手动或自动,同时保持其余设置为默认。在硬件选项卡中的金宝app模式部分中,选择机上运行然后单击构建、部署和启动.
3.下载模型后,断开Arduino机器人控制板上的USB线。
4.使用USB线将Arduino机器人电机板连接到主机。
5.在Arduino机器人电机板模型,选择五金板为Arduino机器人电机板下模拟>模型配置参数>硬件实现.选择COM端口手动或自动,同时保持其余设置为默认。在硬件选项卡中的金宝app模式部分中,选择机上运行然后单击构建、部署和启动.
6.下载模型后,断开Arduino机器人控制板上的USB线。
7.将机器人放在地面上,打开Arduino机器人电机板上的电源开关。模型在板上运行,Arduino机器人以Line Follower的默认模式启动。当你按5键时,它从线跟随器切换到手动模式,并按照手动模式下的默认动作停止。然后根据按1、2、3或4键,它可以逆时针、向后、向前或顺时针移动,只要按下键。一旦你释放了钥匙,机器人就会进入停止模式。按下键5,机器人切换到直线跟随模式。
8.关闭机器人开关。
通过使用一些示例输入来验证每个子系统的外设访问工作。例如,可以通过Constant块(值范围从-255到255)向子系统使用样本输入来控制电机,以查看轮子是向前旋转还是向后旋转。
调整PID控制器设置。提高机器人的移动速度和转弯速度。
本例使用恒定的红外传感器阈值。尝试动态计算红外传感器阈值,该阈值可能因环境光而变化。
本例中使用了一个固定值基转矩。尝试动态调整基础扭矩。例如,你可以通过增加直线运动的基础扭矩来让机器人跑得更快。为了确保更平稳的转弯,你可以降低基础扭矩。
尝试访问Arduino机器人控制板和Arduino机器人电机板上的其他外围设备。例如,探索从Arduino机器人控制板上的电位器发送串口命令到Arduino机器人电机板。