基于Arduino的移动机器人实训平台设计

2020-03-09 12:22胡天林李继芳罗锦才谢路生陈志伟
实验技术与管理 2020年12期
关键词:管脚移动机器人舵机

胡天林,李继芳,罗锦才,谢路生,陈志伟

(厦门大学 航空航天学院,福建 厦门 361005)

厦门大学自2004 年秋季开始推行第三学期制,鼓励理工科专业在五周的集中时段内,开展通识类实践课程。移动机器人实训课程为其中内容之一,定位是让学生系统地了解移动机器人的基础知识。对应的实训平台涉及电源、传感器、电机驱动、编程语言、控制算法等方面,开放性好,具有丰富的软硬件接口。学生可以通过工程仪表进行电信号的测量,验证控制效果,从而实现知行合一。平台强调“系统”意识,刻意降低了编程语言可能导致的门槛[1]。采用开源的Arduino 作为控制平台[2],学生可以在各种开源社区分享与交流创意。

1 功能模块的设计

移动机器人实训平台的系统构成如图1 所示。主控系统是Arduino UNO,芯片采用Mega328P,其数字I/O 有0—13 等14 路通道,模拟I/O 有A0—A5等 6 路通道。传感器包括编码器、红外光电、超声波、摄像头、惯性传感器MPU6050 等。人机交互通过按键、OLED 显示屏等实现。由于Arduino UNO的管脚资源有限,在方案设计时将按键与电阻串联,再将多个按键电阻组合进行并联,由模拟I/O 获得各按键所对应的模拟值,从而有效地扩展了键盘。舵机使机器人转向,可以直接通过脉宽调制(PWM)信号控制。电机驱动器采用全桥集成电路A4950,其工作电压可达40 V,峰值电流范围是–3.5~3.5 A。电机采用直流有刷电机,额定电压12 V、额定功率15 W、额定转矩2.6 kg·cm,带减速箱的空载转速是330 r/min。系统配置了电源管理系统,为各模块提供稳定的电源,并具有低压、过流报警功能。在机械结构上,机器人底盘采用4 轮结构,包括后端2 个动力轮和前端2 个可操纵轮[3],可操纵轮由舵机控制实现转向。

图1 实训平台系统框图

2 电源

系统由18650 型锂离子电池供电。每节电池的标称电压值是3.7 V,将3 节电池串联,总电压范围为10.5~12 V,串联后的电压可直接提供给电机驱动器。电池的电压会因负载的变化而波动,也会随着使用而降低。但控制芯片等的电源要求稳定可靠,因此要进行直流-直流(DC-DC)转换。在图 2 中,通过LM2596-ADJ 实现电池电压到6 V 的DC-DC 转换[4-7]。LM2596-ADJ 是开关式电压调节器。当LM2596-ADJ(以下称U2)的内部开关管导通时,工作电压(图2中的BAT_12V)由脚1 通过导通的开关管,从脚2 给电感H2 与电容C8 充电,也给负载供电。此时,H2 和C8储能,D2 截止。当U2 内部开关管截止时,脚2 不再输出,但电感的磁场能会转换成电能,H2 维持负载的电流,再经过D2 形成回路,此时D2 是导通的;在 H2 放电有电流回路的同时,C8 也在放电。负载和电容的电位将略下降,经过R10 和R11 的分压后,经U2 的脚4 反馈,与基准电压比较。当低于基准电压时,U2 内部开关管再次导通,开始下一个循环。在电路中设计有T3 测试点,供调试观测用。

图2 DC-DC 6 V 电路原理

根据LM2596-ADJ 的手册,图2 中的Vout与R10、R11的关系如式(1)所示。VREF为1.23 V。因此只要调节电位器R10,便可以得到6 V 的工作电源。

3 电机驱动

小型移动机器人多采用直流有刷电机或无刷电机。有刷电机的磁极不动、线圈旋转。有刷电机要持续转动,需要线圈电流及时换相,而这是由跟随电机转动的换相器与电刷的接触切换来完成的。

电动机转速n的表达式[8]为

式中:n为转速,单位为r/min;U为电枢端电压,单位为V;I为电枢电流,单位为A;R为电枢电路总电阻,单位为Ω;Φ 为每极磁通量,单位为Wb;K为电动机结构参数。

根据式(2),改变U将改变电机的转速。本教学平台将基于此模型进行电机的调速控制。

3.1 PWM 控制

PWM 指的是微处理器通过对脉冲宽度的控制,实现模拟量的输出。图3(a)是PWM 控制的单管电路模型,Us是电源电压,UM是加载到电机上的等效电压,Ui是控制信号。图3(b)示意了Ui和UM的控制原理。t1和t2分别为控制信号高电平和低电平的时间,T是周期。图3 是半桥电路,仅用于表述控制原理。实际的驱动器A4950 是全桥电路。

图3 PWM 控制原理图

式(3)中,α是占空比,体现了高电平时间占整个周期的时间比例。可以推导出UM的表达式如式(4)所示。可以看出,当控制信号的周期确定时,调节占空比α即可改变控制电压,从而实现调速。

3.2 A4950 驱动器

一般来说,控制器的I/O 管脚仅产生控制信号,驱动功率有限,不足以直接驱动电机,因此常通过功率管或集成电路来驱动电机。本文选用全桥电路A4950[9]。A4950 的LSS 端可以选择接电源地,也可以接大功率的小电阻,通过电流采样可以实现功率监测,也可以进一步做电流环控制。表1 是A4950 的控制逻辑真值表。其中,H 表示高电平;L 表示低电平;Z 表示高阻抗。IN1 和IN2 是A4950 的输入;OUT1和OUT2 是A4950 的输出,加载在电机的电源工作端。控制器产生的脉宽调制信号加载至IN1 和IN2 等2 个管脚,即可实现电机的方向和速度控制。

表1 A4950 控制逻辑真值表

在进行印制电路板(PCB)设计时,可以在A4950芯片的下方覆铜,并设置过孔以加快散热。

4 速度环的控制与实现

实际的电机工作过程远比节3 要复杂。如果要准确控速,就要实时采样电机的转速,与期望速度对比,通过闭环控制实时改变占空比。

4.1 编码器

调速首先要测速,大多使用编码器。编码器是一种将角位移或者角速度转换成一连串数字脉冲电信号的旋转式传感器[10-12]。编码器内部有码盘。在码盘圆板上等分地开通若干个小孔,两边分别装配有光源和光敏元件。码盘随工作轴旋转,光源发射的光或通过小孔或被挡住,光敏元件可检测出对应信号,再经过整形放大,可以输出脉冲信号。脉冲数反映了转过的角度,脉冲的频率表征了角速度。为了判断转向,一般会至少输出两组存在一定相位差的A 和B相信号。

4.2 Arduino 测速实现

图4示意了增量式编码器A、B相与正反转的关系。在图4(a)中,A 相滞后B 相,假设为正转;图4(b)中,A 相超前B 相,假设为反转。正转与反转是相对的。

图4 A、B 相时序与正反转的对应关系

根据图4 的时序图,可以得到表2 的脉冲计数方式。

表2 A、B 相的信号与脉冲计数方式

Arduino 可通过函数attachPinChangeInterrupt(pin,Function,Mode) 实现计数。其中pin 指的是管脚编号;Function 是中断函数的名称;Mode 是中断触发模式,共有LOW(低电平触发)、CHANGE(电平变化即触发)、RISING(上升沿触发)、FALLING(下降沿触发)4 种方式。例如,attachPinChangeInterrupt(L_M_Encoder,Read_L_M_Encoder(),CHANGE),表示当管脚L_M_ Encoder 的电平发生变化(上升沿或者下降沿)时,调用Read_L_M_Encoder()函数。在Read_L_M_Encoder()的函数中,应根据表2,进一步判断B 相的电平状态,由此决定脉冲计数的方式。脉冲计数值的符号反映了正反转。

4.3 PID 闭环控制

式(5)是数字型位置式PID 算法。该算法在具体实现时需累加 ()e j,会占用较多的存储单元,且不便于编写程序。

将式(5)减去式(6),得到增量式PID 算式(7)。可以看出,该算法具有递推使用、编程简单、占用存储少、计算快等优点[13]。

比较式(7)和(5),可以发现,增量式算法(式(7))中Kp的作用变成了微分,类似位置式算法(式(5))的Kd;增量式算法(式(7))中的Ki的作用是比例,类似位置式算法(式(5))的Kp。后面的分析中要注意。

根据式(7),可以建立关于PWM 占空比给定值的增量式公式。拟用PD 控制,代码实现如图5 所示。其中,Pwm_Value 是经PD 计算后的关于PWM 占空比的给定值;Error 和Last_Error 分别是关于速度的设定值与实际值的本次偏差和上次偏差;Speed_Kp 与Speed_Ki 是PID 算子。在程序的末尾,对PWM 占空比设定值作了限幅。通过定时器MsTimer2,以5 ms为周期,进行速度的采样和PID 算法控制。为了评价控制效果,在下位机中,通过Serial.print()函数发送采样的速度实际值。通过MATLAB 对数据做均值滤波处理,控制效果如图6 所示。

图5 PWM 占空比给定值增量公式的代码实现

由图6 中可以看出,当Kp=0 和Ki=3.0 时,响应一直在震荡;加入微分抑制即将Kp调整为4.5,在2到3 个波后,响应基本稳定在可接受的静差内,稳态误差控制在5%内。

图6 观测PID 控制效果

5 舵机的控制与实现

舵机由减速器、输出轴、电机、电位器、控制器、驱动器等组成。电机与减速器通过齿轮连接,输出轴连接减速器与舵面负载。控制器通过安装在输出轴上的电位器反馈舵机的位置信号,形成舵机系统闭环。舵机是一种角度的位置伺服机构[14]。舵机的输入信号一般是周期固定为20 ms 的PWM 信号,高电平时间为0.5~2.5 ms,即占空比为2.5%~12.5%,基本上线性对应了从0~180°的旋转角度范围。Arduino 提供了舵机系统函数attach(int pin,int min,int max)和write(int value)。前者函数主要用于设定控制舵机的信号管脚。参数pin 传递引脚编号,对于Arduino UNO,只能选择9 或者10 号管脚;参数min 传递最小脉冲宽度;参数max 传递最大脉冲宽度。参数min 和max起限幅作用。该函数返回值是引脚编号,如果失败则返回0。后者函数用于设置舵机的旋转角度。图7 是示波器对控制信号的测试波形,可以看出对应90°时,实测脉宽为1.50 ms,信号频率是50 Hz。在实际使用中,由于舵机电位器的线性度可能不好或者比例电路有误差,需要根据实际情况进行控制脉宽的调整。

图7 示波器对控制信号的测试波形

6 结语

本文设计了一种于Arduino 的移动机器人实训平台,包括电源、驱动、传感器、编程语言、算法控制等各个基础知识模块。针对每一模块都可以围绕需求、方案、原理、实现、测试等开展教学。基于该平台,可设计24 学时的基础课程和48 学时的进阶课程。教学课程内容全面,通过丰富的软硬件接口,可灵活增加各种传感器或者执行器;教学方式有趣,有效地调动了学生的学习热情。

猜你喜欢
管脚移动机器人舵机
移动机器人自主动态避障方法
面向DSP+FPGA通用处理架构检测的硬件系统设计
含齿隙弹载舵机的全局反步模糊自适应控制
一种异步FIFO的Read/Write Data Flow Through功能测试方法∗
基于dsPIC单片机的飞艇舵机控制实现
基于Twincat的移动机器人制孔系统
基于高速同步485总线通信的多通道舵机控制器设计
基于图像处理的异型电子元器件管脚偏移误差检测方法研究
基于云模型的舵机同步控制
极坐标系下移动机器人的点镇定