|
|
【S184】智能循迹搬运小车
作品说明 |
作者:陈鑫宇 何哲涵 敖小东 周钰斌 刁怡博
单位:广西大学 电气工程学院
指导老师:李勇
1. 作品概述
1.1 所用到的零部件
作品说明
1.1.1 开发板和扩展板简介
Basra开发板实物图和接口图如下所示,Basra是一款基于Arduino开源方案设计的一款开发板,通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以在 Arduino、eclipse、Visual Studio 等 IDE 中通过 c/c++语言来编写程序,编译成二进制文件,烧录进微控制器。Basra 的处理器核心是 ATmega328,同时具有 14 路数字输入/输出口(其中 6 路可作为 PWM 输出),6 路模拟输入,一个 16MHz 晶体振荡器,一个 USB 口,一个电源插座,一个 ICSP header 和一个复位按钮。主 CPU 采用 AVR ATMEGA328 型控制芯片,支持 C 语言编程方式;该系统的硬件电路包括电源电路、串口通信电路、MCU 基本电路、烧写接口、显示模块、AD/DA 转换模块、输入模块、IIC 存储模块等其他电路模块电路。控制板尺寸不超过 60*60mm,便于安装。CPU 硬件软件全部开放,除能完成对小车控制外,还能使用本实验板完成单片机所有基础实验。供电范围宽泛,支持 5v~9v 的电压,干电池或锂电池都适用。编程器集成在控制板上,通过 USB 大小口的方式与电脑连接下载程序,开放全部底层源代码。控制板含3A6V 的稳压芯片,可为舵机提供 6v 额定电压。板载 8*8led 模块采用 MAX7219 驱动芯片,板载一片直流电机驱动芯片 FAN8100MTC,可同时驱动两个直流电机。板载 USB 驱动芯片及自动复位电路,烧录程序时无需手动复位。2 个 2*5 的杜邦座扩展坞,方便无线模块、OLED、蓝牙等扩展模块直插连接,无需额外接线。
如下图所示为BigFish扩展板实物图及接口图,BigFish扩展板完全兼容 arduino 控制板标准接口,连接的电路可靠稳定,上面还扩展了伺服电机接口、8*8Led 点阵、直流电机驱动以及一个通用扩展接口。
1.1.2 灰度传感器
如下图所示为灰度传感器实物图及引脚图,灰度传感器有一只发光二极管和一只光敏电阻,安装在同一面上。灰度传感器利用不同颜色的检测面,对光的反射程度不同,光敏电阻利用不同检测面返回的光不同、其阻值也不同的原理来进行颜色深浅检测,在有效的检测距离内,发光二极管发出白光,照射在检测面上,检测面反射部分光线,光敏电阻检测此光线的强度并将其转换为机器人可以识别的信号。灰度既可以当作数字量传感器使用,也可以当作模拟量传感器使用。
1.1.3 超声波传感器
如下图所示为超声波传感器实物图及接口图,HC-SR04超声波测距的原理是使用者需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波,一旦检测到有回波信号则输出回响信号,回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离,公式:距离=高电平时间*声速(340M/S)/2;测量周期为60ms以上,以防止发射信号对回响信号的影响。
1.1.4 蓝牙串口模块
利用蓝牙模块和手机蓝牙串口助手之间的相互连接来实现小车的控制和运动及夹取功能的实现,把物体夹取到指定的位置。
1.2 整体零件布局与建模
利用solidworks软件来对小车模型进行分析建模(如下图所示),并在此基础上进行修改来实现循迹功能。
巡线小车机械爪设计制作如下图所示,本作品设计了一个三自由的机械爪,满足了小车夹取工件时速度快、稳定性高的要求。
如下图所示,为巡线小车底盘设计制作过程,使用到的器材有直流电机、直流马达输出头、直流电机支架、轮胎、螺柱 15、联轴器、螺丝 F325、螺丝 F310、螺丝 F2510H、螺母、7x11 孔平板、7x5 孔平板等。
1.3 技术路线
智能循迹搬运小车是一种基于机器视觉和自动控制技术的智能化物流设备,主要功能是通过视觉传感器对地面标志物进行感知和识别,实现自主导航和运输。本作品通过传感器获取环境信息,对地面标志物进行感知和识别,规划移动与转向,通过Arduino编程控制小车的行进过程以及舵机,实现对物品的夹取与运输。
智能循迹搬运小车
1.4 创新点
① 全自动化操控,能准确迅速地实现相应命令的执行,可以大幅提高车辆的自主性和安全性并减少人工疲劳及误差。
② 通过视觉传感器模块,对车辆进行精准定位以及对障碍物的识别与避让,利用地图数据和实时传感器信号,实现智能路径规划,优化搬运路线。
③ 小车安装蓝牙模块,实现小车的双模运行,可以在避障遇到困难的时候切换运行模式,可以通过手机或者电脑等设备进行控制,显著提高小车的可靠性。
④ 小车的硬件和软件都可以进行二次的拓展和修改,具有一定的开放性和可扩展性,可以根据不同的使用场景增加相应的功能。
1.5 预期测试效果
智能循迹搬运小车能够正常识别传感器返回的坐标信息,能够正常控制电机运动到不同的货物的坐标位置,能够正常控制舵机进行夹取物品放置到指定地点的位置,其可以正确识别划定的线路以及准确的避障;其次智能循迹搬运小车的控制系统还可以实现自动控制和手动控制之间的无缝切换,使在运行过程中具有稳定的性能和可靠的运动控制,能够应对各种复杂的工作环境;此外智能循迹搬运小车应该具备故障诊断和异常处理功能,当设备出现故障或者异常状况时能够自动检测并能采取相应的措施,以避免生产事故和设备损坏。
2. 技术方案
智能循迹搬运小车是一种基于机器视觉和自动化控制技术的智能搬运系统,它通常包括搬运小车、传感器、导航系统和控制系统等组件,能够实现自动化的搬运任务。搬运小车会配备摄像头或激光雷达等传感器,用于实时感知周围环境和地面标记。导航系统会利用这些信息来规划路径并指导小车进行移动,同时控制系统会根据实时数据对小车进行精准的控制,确保它能够沿着指定的路径进行移动和搬运物品并实现避障。
2.1 技术路线框架图
技术路线框架图
2.2 实现过程
硬件方面选用Arduino作为微控制器,用于控制小车系统;选用红外光线传感器及灰度传感器作为视觉模块,用于循迹以及避障;选用电池为小车提供动力,避免冗杂的线;选用直流电机驱动小车的行动,实现小车的前进、后退、转向;选用舵机控制机械臂,实现货物的夹取及搬运。
拼接小车框架,将电机、车轮安装在小车架上,连接电源和电机驱动模块,将传感器模块接在在小车底部,并连接到微控制器;拼装机械臂模块,将它安装在小车的上方,并连接到微控制器;安装蓝牙模块,连接到微控制器以及移动终端。
编写代码来控制小车的运动,利用arduino开发板的串口接入三个灰度传感器来实行小车循迹,其中利用pid算法来实现小车循迹的流畅性和稳定性,实现超声波避障和搬运物体的功能进行测距,分模块来判断是跟随还是避障实现多功能,在此基础上还可以实现对于车的遥控,日常生活中帮助搬运物品,将代码烧录至微控制器开发板。
测试与调试:在实际的线路与真实环境下测试小车,看是否能够正确循迹并试验各种可能的线路和环境条件,调整传感器的敏感度或者修改代码进行优化。部分pid调试代码如下:
| int Data_Out;//定义数据输出变量 int Left_AD,Right_AD,Mid_AD;//定义左右中传感器AD值变量
Left_AD=analogRead(A4); Mid_AD=analogRead(A2); Right_AD=analogRead(A3); Data_Out=(Left_AD-Right_AD+D_AD_VALUE); Serial.print(Data_Out); Serial.print(" "); if(Left_AD > _H && Mid_AD > _H && Right_AD > _H) stop = 1; else stop = 0; if(Mid_AD>200) { flag = 0; } if((Mid_AD <= LEFT_THERSH) && (Data_Out < -20)) { //left Data_Out= (2*LEFT_MAX-Data_Out); flag--; } else if((Mid_AD <= RIGHT_THERSH) && (Data_Out > -10)) { //right Data_Out= (2*RIGHT_MAX-Data_Out); flag++; } if(Left_AD < _L && Mid_AD < _L && Right_AD < _L) { Serial.print("---"); if(flag<0) {//left Data_Out = LEFT_MAX*2; } else {//right Data_Out = RIGHT_MAX*2; } |
2.3 遇到的困难及解决方法
① 在调试代码的过程中对于灰度传感器的位置进行调整,使得其循迹达到最好的效果,然后利用pid、比例、积分、微分来实现对车的稳定控制,在过程中遇到很多问题,无法循迹,轨迹错误,但随后通过pid参数的调节都实现了。
② 在调试中不断对超声波测距的距离和方向进行修改,最终确定了最合适的距离,在串口助手中来查看超声波所测得的距离来对实现信号的传递与处理。
③ 在实现蓝牙切换来实现对车的控制和搬运货物,在其中为拓展板安装模块,实现对车的遥控和夹取,舵机的调整,一开始抓力不够,后来经过测试来逐渐修改舵机,使得小车可以顺利实现货物的夹取和释放。
3. 测试分析
数据来源:实验测试智能循迹搬运小车完成指令情况。
数据规模:共测试60次。
环境配置:智能循迹搬运小车、障碍物、物块。
测试过程:智能循迹搬运小车夹取物块,循迹搬运至目标地点并躲避障碍物。
分析与结论:60次测试数据中每次都能进行搬运与循迹运输,其中57次满分通过,3次由于机械臂抓取不牢导致掉落,成功率为百分之九十五。
4. 问题分析
4.1 关键性问题
① 图像处理的准确性:确保智能循迹搬运小车能够准确识别周边边环境信息是任务的关键问题,需要智能循迹搬运小车具备图像处理技术和识别算法,能在复杂环境中准确识别规定的路线,如使用深度学习模型(如卷积神经网络)对图像进行处理和分析,以实现准确的物体识别和目标检测。
② 运动控制的精确性:机器人需要具备精确的运动控制能力,以实现准确的搬运以及转向动作,研究主要涉及机器人运动规划和轨迹跟踪技术,如通过路径规划算法和运动学模型来控制舵机的运动,以实现精确的定位和运动控制。
③ 环境感知和安全性:智能循迹搬运小车需要能够感知周围的环境中的障碍物,以避免碰撞和保证操作的安全性,相关研究主要包括使用传感器(如激光雷达、摄像头等)进行环境感知和障碍物检测,以及利用避障算法和安全策略来保证小车的安全运行。
④ 系统集成、协同和优化:将传感器、舵机、控制板模块之间进行有效的集成和协同工作是一个关键的技术挑战,相关研究主要在于如何实现控制板与视觉模块之间的数据传输和通信,以及优化整个系统的性能和稳定性。
4.2 场景调研
智能循迹搬运小车是一种自动化、智能化的搬运设备,可以按照预设的轨迹完成物料搬运任务,它可以提高工作效率,降低人工劳动强度,减少作业失误,提高作业安全性。智能循迹搬运小车可以广泛应用于各个领域,如工厂、仓库、物流中心等,实现运输的智能化与高效化。
① 应用场景:智能循迹小车可以在许多场景得到广泛的应用,在不同的场景对小车的需求不同,需要根据场景确定相应的功能及技术参数,如在制造业可以用于物料的运输配送,降低人工失误率;在物流与仓储可以用于货物的分拣、搬运与存储,提高物流效率;在食品与医药行业可以用于食品原材料、成品或半成品与药品和医疗器械的搬运和配送,减少人工接触,提高自动化水平和安全性;在零售业可以实现商品的快速上架和盘点,提高运营效率;在农业中可以实现自动化施肥、收割等作业,提高生产效率,降低劳动强度。
② 作业流程:智能循迹搬运小车在应用场景的作业流程包括任务的接受,路径规划,物料取放、搬运、摆放等环节,在不同的应用场景下略有不同。在整个作业流程中,智能循迹搬运小车可以通过各种传感器、摄像头、控制系统等设备实时监测自身状态和环境变化,自动调整行驶速度和搬运方式,确保物料搬运任务的顺利完成,同时小车还可以与仓库管理系统、企业资源计划(ERP)系统等外部系统对接,实现物料信息的实时更新和管理。
③ 硬件功能:小车应具有坚固的车体,能够在承受一定重量的情况下具有良好的稳定性和移动性能;小车应具有多种传感器,实时监测自身状态和环境的变化,以确保作业安全;小车应具有机械臂、夹具等抓取装置,实现物料的装取;小车应具有电池与充电系统,保证作业的连续性。
④ 软件功能:小车通过嵌入式控制系统实现对小车驱动系统、抓取装置、传感器等设备的控制,控制系统根据任务要求,调节小车的行驶速度、转向角度、抓取力度等参数,确保小车按照预定任务完成作业。小车采用路径规划算法(如A*算法、Dijkstra算法等),根据物料的起始位置和目的地位置规划出最优搬运路径并实现避让,这有助于提高物料搬运效率和安全性,降低行驶能耗。小车与仓库管理系统、企业资源计划(ERP)系统等外部系统对接形成物联,接收任务指令,反馈任务状态,实现物料信息的实时更新和管理。调度系统会根据物料需求、小车状态等因素,自动分配小车任务,提高整体作业效率,小车应拥有用户友好的可视化界面(如触摸屏、网页界面等),提供作业状态、任务进度等信息,用户可通过用户界面查看小车的运行情况,进行任务分配、小车操控等操作。小车能够记录并分析作业数据,如行进距离、搬运时间、能耗等。通过对这些数据的分析,可以优化小车的控制策略、路径规划算法等,持续提升小车的性能和效率。
5. 项目总结
5.1 作品创新点
① 自动化操作:相比传统的人工搬运,智能循迹搬运小车具备自动化操作的能力,可以实现无人操控下的货物的夹取搬运任务,这大大提高了工作效率和生产效益,同时减少了人力成本和劳动强度。
② 高精度的视觉技术:智能循迹搬运小车可采用先进的计算机视觉技术,能够准确识别货物的类型、位置和姿态,从而实现精准的夹取操作,通过图像处理、目标检测和姿态估计等算法,机械臂能够快速而准确地定位并取放货物。
③ 具备优秀拓展功能:智能循迹搬运小车可以根据不同的工作场景和任务需求,进行灵活的拓展、调整和适应,通过可编程的控制系统和智能算法,智能循迹搬运小车能够根据需求进行调整,以适应更广泛的应用场景。
④ 安全性和可靠性保证:智能循迹搬运小车在操作过程中注重安全性和可靠性,通过环境感知和障碍物检测技术,小车能够识别并避免与周围的障碍物发生碰撞,此外通过可靠的控制系统和故障监测机制,机器人能够在检测到故障的情景下切换为人工操控,确保操作的安全和可靠。
⑤ 数据智能分析和优化:智能循迹搬运小车可以收集和分析大量的操作数据,与后台系统对接,应用机器学习技术,通过数据智能分析和优化算法,实现对运输过程的实时监控和改进,通过对数据的分析,可以提供优化建议,以提高工作效率和质量,并可以进行远程的监控和管理。
5.2 展望
① 自主化和智能化:未来的智能循迹搬运小车将变得更加自主化和智能化,它们将具备更高级的感知和决策能力,能够实时感知和适应不同的物品、环境和任务要求。
② 协同作业:随着技术的发展,未来的智能循迹搬运小车将能够实现协同作业,它们可以共同合作完成更复杂的任务,提高生产效率和灵活性。
③ 更高的速度和精度:未来的智能循迹搬运小车将具备更高的速度和精度,它们可以快速而准确地处理物品,并能够实现连续作业,提高工作效率。
④ 更广泛的适应性:智能循迹搬运小车将具有很强的可塑性和二次拓展性,在微调模块的技术参数后能够适应更广泛的应用场景。
⑤ 人机协作:未来的智能循迹搬运小车将与人类工作人员进行更紧密的协作,它们可以在人类的监督下执行任务,或者与人类工作人员共同操作和操控。
⑥ 网络化和云端管理:未来的智能循迹搬运小车将更加网络化,并与其他设备和系统进行无缝连接,它们可以通过云端管理和监控,实现远程控制、故障排除和数据分析。
5.3 具体应用
智能循迹搬运小车构造简单,功能具有普适性,在使用过程中易于维护,是自动化场景中必不可少的组成元素,在未来的应用会非常广泛,涵盖各个行业领域。例如:
① 物流仓储:在大型仓库或配送中心,智能循迹搬运小车可以根据设定的路径自动搬运商品,可大幅度降低人力成本,提高运输效率。
② 制造业:在生产线上,智能循迹搬运小车可以进行零部件的传递,支持灵活的生产线布置,提升生产效率。
③ 医疗服务:在医院中,智能循迹搬运小车可以用来搬运药品、仪器以及送餐等,减轻医务人员的负担。
④ 餐饮服务:在大型餐饮场所,小车可以用来自动送餐,提升服务效率,减轻服务人员的工作压力。
⑤ 智慧农业:在农场或种植园,小车可以进行搬运果实、施肥等自动化作业,节省人力,提高劳动效率。
⑥ 清洁服务:在公共场所如机场、商场,智能循迹搬运小车可以配合清洁设备,进行清洁工作,提高清洁效率等等。
随着技术的不断发展,如无人驾驶、AI、5G、星闪等,智能循迹搬运小车将成为万物互联的重要组成部分,应用领域和能力都将得到更大提升。
6. 示例程序
① 实现蓝牙遥控搬运
| #include<Servo.h> //调用舵机库 int _ABVAR_1_data = 0 ; #define Servo_Pin 3 //定义舵机引脚号 #define Claw_Open_Angle 180//设置舵机夹爪张开角度 #define Claw_Close_Angle 0 //设置舵机夹爪闭合角度 Servo myservo; //声明舵机对象 void setup()
{ myservo.attach(Servo_Pin); Serial.begin(9600);
pinMode( 9 , OUTPUT);
pinMode( 5 , OUTPUT);
}
void loop()
{
_ABVAR_1_data = Serial.parseInt() ;
if (( ( _ABVAR_1_data ) == ( 1 ) )) //右转
{
digitalWrite( 6, HIGH ); digitalWrite( 5, LOW ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); }
if (( ( _ABVAR_1_data ) == ( 2 ) ))//左转
{
digitalWrite( 6, LOW ); digitalWrite( 5, HIGH ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH);
} if (( ( _ABVAR_1_data ) == ( 3 ) ))//后退
{ digitalWrite( 6, HIGH ); digitalWrite( 5, LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH );
} if (( ( _ABVAR_1_data ) == ( 4) )) //直走
{
digitalWrite( 5, HIGH ); digitalWrite( 6 , LOW ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW );
} if (( ( _ABVAR_1_data ) == ( 5) ))//停止
{
digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); } if (( ( _ABVAR_1_data ) == ( 6) ))
{ myservo.write(Claw_Open_Angle); //舵机夹爪张开
} if (( ( _ABVAR_1_data ) == ( 7) ))
{ myservo.write(Claw_Close_Angle); //舵机夹爪张开
}
} |
② 实现循迹和超声波避障
| #define LEFT_MAX -680 #define RIGHT_MAX 330 #define LEFT_THERSH 35 #define RIGHT_THERSH 37 #define D_AD_VALUE -8 #define _L 45 #define _H 500 #define ECHOPIN 14 #define TRIGPIN 15 #define leftA_PIN 5 #define leftB_PIN 6 #define righA_PIN 9 #define righB_PIN 10 #define step_left_speed 255 #define step_right_speed 255 float Kp = 0.05, Ki = 0, Kd = 0; //pid弯道参数参数 float error = 0, P = 0, I = 0, D = 0, PID_value = 0;//pid直道参数 float previous_error = 0, previous_I = 0; //误差值 int initial_motor_speed = 100; //初始速度 //unsigned int PWM_L, PWM_R, T = 0; int flag = 0; int stop = 0; void motor_pinint( ) { pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚 pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚 pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚 pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚 } //获取循迹传感器输出函数 int GetTraceDate() { int Data_Out;//定义数据输出变量 int Left_AD,Right_AD,Mid_AD;//定义左右中传感器AD值变量
Left_AD=analogRead(A4); Mid_AD=analogRead(A2); Right_AD=analogRead(A3); Data_Out=(Left_AD-Right_AD+D_AD_VALUE); Serial.print(Data_Out); Serial.print(" "); if(Left_AD > _H && Mid_AD > _H && Right_AD > _H) stop = 1; else stop = 0; if(Mid_AD>200) { flag = 0; } if((Mid_AD <= LEFT_THERSH) && (Data_Out < -20)) { //left Data_Out= (2*LEFT_MAX-Data_Out); flag--; } else if((Mid_AD <= RIGHT_THERSH) && (Data_Out > -10)) { //right Data_Out= (2*RIGHT_MAX-Data_Out); flag++; } if(Left_AD < _L && Mid_AD < _L && Right_AD < _L) { Serial.print("---"); if(flag<0) {//left Data_Out = LEFT_MAX*2; } else {//right Data_Out = RIGHT_MAX*2; } } return Data_Out; }
void calc_pid() { P = error; I = I + error; D = error - previous_error; PID_value = (Kp * P) + (Ki * I) + (Kd * D); previous_error = error; }
void motor_control() { int left_motor_speed = initial_motor_speed - PID_value; int right_motor_speed = initial_motor_speed + PID_value; if(left_motor_speed < 1) left_motor_speed = 1; if(right_motor_speed < 1) left_motor_speed = 1;
analogWrite(leftA_PIN, left_motor_speed); analogWrite(leftB_PIN, 0); analogWrite(righA_PIN, right_motor_speed); analogWrite(righB_PIN, 0);
Serial.print("move_A: "); Serial.print(left_motor_speed, OCT); Serial.print(" move_B: "); Serial.print(right_motor_speed, OCT); Serial.print(" error: "); Serial.print(error, OCT); Serial.print(" PID_value: "); Serial.print(PID_value); Serial.println(); } void step_forword()//小车前进 { analogWrite(5, step_right_speed); analogWrite(6, 0); analogWrite(9, step_left_speed); analogWrite(10, 0); } void noline_back()//小车后退 { analogWrite(5, 0); analogWrite(6, step_right_speed); analogWrite(9, 0); analogWrite(10, step_left_speed); } void _stop() { analogWrite(leftA_PIN, 0); analogWrite(leftB_PIN, 0); analogWrite(righA_PIN, 0); analogWrite(righB_PIN, 0); } void setup() { Serial.begin(9600); motor_pinint(); pinMode(ECHOPIN, INPUT); pinMode(TRIGPIN, OUTPUT); } int getDistance_on() { //超声波模块的工作原理 digitalWrite(TRIGPIN, LOW); delayMicroseconds(5); //间隔时间 digitalWrite(TRIGPIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGPIN, LOW); int distance = pulseIn(ECHOPIN, HIGH); // 读出脉冲时间 distance= distance/58;
Serial.println(distance);
delay(500); if(distance<20) { _stop(); } void loop() { error = GetTraceDate(); if(!stop) {
calc_pid(); motor_control();
}
} |
* 本项目未获得作者开源授权,无法提供资料下载。