基于STM32的智能物料搬运小车*
2022-08-15白焕鑫刘文飞薛茜艺
白焕鑫,刘文飞,孟 鑫,薛茜艺
(台州学院航空工程学院,浙江 台州 318000)
随着中国工业化进程不断深入,工业生产中的物料搬运工作逐渐趋于自动化、信息化、智能化,在一些高精度、高网络化、高风险的作业环境中,智能物流小车已逐渐取代人工搬运。2021年第七届浙江省大学生工程训练综合能力竞赛要求设计并制作一台通过扫描二维码领取搬运任务,在指定的工业场景内行走与避障,并按任务要求将物料搬运至指定地点并精准摆放的智能物料搬运小车。
1 总体方案设计
浙江省大学生工程训练综合能力竞赛要求设计的智能小车需具有定位、移动、避障、读取条形码及二维码、物料位置和颜色识别、物料抓取与载运、上坡和下坡、路径规划等功能。
根据此要求,对小车各功能模块进行设计,主控采用嵌入式方案,其上带有电机驱动电路以及任务内容显示装置(OLED);由于机械臂夹取部分需要现场制作,因此机械臂应结构简洁,易于加工。车轮选择普通海绵内胆轮,上料与下料使用五自由度机械臂,树莓派搭载摄像头获取物料搬运顺序、物料颜色与形状信息,姿态传感器实现小车的全局定位;寻迹模块实现自主移动与路径规划,单片机进行数据分析与处理。总体方案如图1所示。
图1 总体方案图
2 硬件设计
2.1 主控模块设计
主控芯片采用STM32,树莓派、舵机控制板、姿态传感器与主控之间的数据传输采用串口通信,由于还需实现移动、避障、任务显示的功能,因此选择I/O口较多的STM32F103ZET6主控芯片[1],其具有4路UART串口、112个快速I/O口、多个定时器时钟,且配有512 KB的闪存程序存储器,可满足设计要求。
2.2 电源模块设计
小车以12 V航模电池为电源,利用稳压器将电压稳定在12 V后并联供电,分别作为电机驱动、PCB控制板的电源,其中PCB板通过LMS2596模块将输入电压降到5 V后给电路板上的其他模块供电。稳压器流出的12 V电压通过降压器后分别给机械臂控制板、树莓派供电,电路原理如图2所示。
图2 电源模块电路原理图
2.3 电机驱动模块设计
小车利用4个电机实现移动功能,电机采用直流减速电机,电机型号为MG513P30_12V,外形尺寸73 mm×33 mm,质量145 g,输出轴径6 mm,D型轴,额定参数12 V、0.36 A、293 r/min、扭矩1 kg·cm,通过调节PWM占空比实现转速的控制,进而通过轮间差速实现转弯功能。电机驱动采用大功率隔离电机驱动模块,可频繁正反转而不烧驱动,且使用方便,只需要将电机正负线连接驱动,驱动IN1~IN4分别接STM32F103ZET6的PWM输出I/O口就可以实现PWM信号控制。
2.4 寻迹模块设计
小车的寻迹是沿着地图中的黑线移动,在指定位置根据特定逻辑判断实现停车。本小车寻迹分为2部分:一部分是黑线位于小车中间寻迹,主要利用12路灰度寻迹模块[2],其上的LED灯通电后发光,经过地面的反射后光敏电阻根据光强改变电阻大小,由于地图的色差不同,调节寻迹模块的灵敏度后可实现在黑线上返回高电平,深黄色区域返回低电平,STM32芯片根据返回的电平改变电机转速实现寻迹功能;另一部分是2条黑线位于小车两边,小车靠近2条黑线的其中1条寻迹,利用2个一路灰度寻迹模块检测小车相对于黑线的位置并实时调节,实现走中间寻迹功能,能够解决小车在夹取下层货架的物料时机械臂长度限制的问题。2种寻迹效果如图3和图4所示。
图3 小车巡中间
图4 小车巡两边
2.5 树莓派模块设计
树莓派是一个开放源代码的硬件平台,它是一款基于ARM的微型电脑主板,以SD/MicroSD卡为内存硬盘,并且只有信用卡大小,功能强大,可以通过开源的Linux系统安装软件实现各种功能,并且处理数据效率高,不易出错,能够满足对图像识别的要求,因此选择用它安装python-opencv并搭载200万像素摄像头实现二维码的读取、物料位置和颜色的识别。
2.6 姿态传感器模块设计
小车在转弯时由于场地摩擦力、电池电压、重心、轮间距等原因不能每次都精确地转到相同的角度,因此需要额外增加姿态传感器模块,与STM32通过串口通信,采用闭环控制,在旋转角度与预定不符的时候,姿态传感器检测当前角度并反馈给单片机,单片机经过处理后调整轮间差速,旋转后姿态传感器再次检测角度,反复多次,最终实现对小车旋转角度的准确控制。
2.7 舵机及舵机控制板模块设计
物料的抓取和放置需要准确且快速,因此选择串行总线舵机,它与传统的PWM舵机相比,舵机之间通过双接口进行上下串联,极大地减少了布线,使得结构更加清晰简单,而且减少了串口的占用,同时,总线舵机具有角度反馈,可以快速读取舵机角度,进行机械臂关节的位置捕捉。舵机控制板通过降压后的7.5 V供电,与STM32串口通信,小车到指定位置后单片机发送指令,控制板收到信息后控制舵机执行动作组。
3 机械结构设计
小车机械结构包含2个部分:小车主体和机械臂。小车主体由直流电机驱动的海绵内胆轮、各种模块以及底板组成,车载布局空间高效利用,使小车整体空间利用率最大化。底板采用亚克力板,亚克力板质量小、加工方便,并且成本不高。
机械臂由舵机和机械爪组成。机械臂各关节使用铝制材料制作,可以最大程度地减轻整车质量,并且将机械臂设计[3]为折叠形式,节省空间。使用5个大功率总线舵机驱动机械臂的每一个关节,使机械臂具有5个自由度,夹取物料灵活快捷,控制精度高而且比较稳定;机械爪采用笼式抓手,使用亚克力板制作,内部夹持面设计为深沟状且带有防滑条纹,2个亚克力板之间以铜柱连接,在夹取时能够更加稳定、准确;物料仓使用斜坡式,物料只需放到一定范围内即可在重力作用下滑到指定位置,提高容错率,并且在后方间隔一定距离固定2根铜柱卡住物料,防止物料掉落。结构设计采用SOLIDWORKS进行整体仿真以及有限元与力学分析,确保在实际情况下能够满足设计要求。
4 软件设计
4.1 主程序设计
根据竞赛要求,主程序设计流程如图5所示。
图5 主程序设计流程图
4.2 电机控制单元
采用STM32的TIM3定时器的2个通道输出PWM方波,通过电机驱动实现电机控制,控制电机的PWM频率需要在6~16 kHz之间。高频率驱动电机的振动比较大、开关损耗比较大、电磁噪声较明显,且电机参数本身也不推荐太高的载频,所以采用了10 kHz的频率,确保电机平稳运行。PWM输出可以实现基本的电机控制,但是随着供电电压和负载的变化,电机的速度会发生变化。为了保证电机的速度达到理想的效果,采用了霍尔编码器对电机转速进行检测。根据编码器正反转输出信号的相位差,通过STM32芯片对其进行正交解码,获取电机运转状态,存入CNT寄存器之中。任何时候CNT寄存器的值就是编码器的位置信息,正转累加,反转递减,不需要软件干预。
为了控制电机平稳运转,运用了增量式PID控制算法[4]。当执行机构需要的控制量是增量,而不是位置量的绝对数值时,可以使用增量式PID控制算法进行控制。其公式也是由位置式PID推导出来。增量式PID控制算法与位置式PID算法公式相比,计算量小的多,计算公式如下所示:
其中:
经过上述方案调节,精度虽然足够高,但出现了超调现象,不能达到理想的加速效果,速度超调会使得小车的整体运行不平稳,在加速的时候由于加速度过快,会发生前轮上翘,在刹车时会出现后轮上翘。尝试了去整定PID的参数,如果把Kp调小,可以解决加减速过快的问题,但是响应速度受到了严重的影响。在保持Kp不变的情况下增大Kd值去抑制电机过调量。这样能达到一定的平缓速度,但是在速度变化量较大的时候小车的运行依旧不平稳。因此,采取对每次增量进行限幅的措施,当速度差很大的时候限制了单位时间内的增量,这样就能保证平稳加速减速控制。具体程序如下。
if(abs(Target2-pid_speed_2_last)>30)
{
if(Target2>Encoder2)
pid_speed_2=pid_speed_2_last+Car_Max_Chang e_Speed;
else
pid_speed_2=pid_speed_2_last-Car_Max_Change_Speed;
}
小车限幅后的速度控制曲线如图6所示。
图6 小车限幅后的速度控制曲线
4.3 二维码识别单元
使用树莓派4b+opencv+200万像素摄像头,二维码的识别通过pyzbar包实现,摄像头处于时刻开启状态,对准二维码,单片机发送指令,读取当前帧转为灰度图像后提取条形码的边界框的位置,使用pyzbar内置函数读取二维码内容,转化为字符串后发送给单片机,单片机内通过串口中断,如果接收到内容,判断是否为二维码内容,若是,则让任务显示装置逐位显示。
4.4 颜色识别单元
使用树莓派4b+opencv+200万像素摄像头,单片机发送指令后先将目标对象图片的特征数据提取出来,将图像进行色彩模型转换,由RGB模型变为HSV模型。HSV表色系由色度(Hue)、饱和度(Saturation)、亮度(Value)3个分量构成。提前设置物料颜色的HSV范围,对转换后的HSV图像中的颜色进行检测,用白色像素将其标记出来,其余背景标记为黑色像素,生成二值图像。对颜色筛选后的图像进行形态学处理[5]。二值图像的形态学运算主要包括腐蚀、膨胀、开操作、闭操作,用来提取图像目标分量。最后使用opencv内置函数inrange(),并将在指定范围内的颜色框选出来,判断轮廓的面积,如果面积大于0则说明检测到指定颜色并标号,并且摄像头可以一次识别3种颜色,3种颜色全部检测完成后通过串口返回给单片机进行处理。
4.5 任务显示单元
任务码的显示采用0.96 in(1 in≈2.54 cm)7引脚OLED屏幕,为使字符高度达到规则要求的8 mm,通过PCtoLCD2002软件对字符取模,取模设置为阴码,列行式,逆向,十六进制数,最后得到32×160像素的字模。成功识别二维码后,树莓派通过串口传回一组如“312”的字符串,通过单个数字所在位置决定在OLED上显示的位置,核心程序如下所示。
if(a==49)
LCD_P32x160Str(0,0,"1");
else if(a==50)
LCD_P32x160Str(0,0,"2");
elseif(a==51)
LCD_P32x160Str(0,0,"3");
4.6 寻迹单元
走直线:走直线使用的是12路灰度寻迹模块,使用定时器7中断函数,每隔5 mm实时检测模块当前相对黑线的位置并以高低电平的形式反馈给STM32,同时在寻迹的程序中加入PID闭环控制,使小车在偏离直线时能够准确且迅速地返回预定轨迹。检测12路灰度当前位置并返回差值部分程序、寻迹位置式PID控制程序如下所示。
检测12路灰度程序:
u16 P0=PO_get();
if(P0==0x0600)
{val=0;}
elseif(P0==0xC000)
{val=-110;}
elseif(P0==0x4000)
{val=-102;}
else if(P0==0x4000)
{val=-99;}
PID控制:
void car_fwd_encode(int car_spd)
{
error_last=error;
error=val;
if(val<=100)
{adjust=val*KP/100+(error-error_last)*KD+(error+error_l ast)*KI;
car_run_open(car_spd+adjust-wz ,car_spd-adjust+wz);
}
}
走中间:走中间是通过检测安装在小车四角的由2个一路灰度传感器组成的两路灰度的位置,当检测到小车边缘超过黑线时,给小车的左右轮子一定偏差,使其实现贴边走,部分程序如下所示。
u16 P2=P2_get();
if(P2_get()==0x0000) //0000
{
car_run_go(speed_left,speed_right);
}
else if(P2_get()==0x1000)
{
car_run_go(27,60);
}
elseif(P2_get()==0x3000)
{
car_run_go(27,70);
delay_ms(50);
}
5 小车实物
小车实物如图7所示。
图7 小车实物
6 结语
本文设计并制作了一辆智能物流小车,包含实现电机驱动、寻迹模块、树莓派的二维码识别与颜色识别、姿态传感器、舵机控制等功能的软硬件设计,小车的电机控制以及寻迹功能都加入了PI闭环控制,能够实现更精确的移动控制,能够精准、快速地完成物料搬运任务,降低工人风险,减少企业人力成本。