【S069】物流搬运机器人
作品说明 |
1. 场景调研
随着互联网技术的发展,网购成了人们生活不可以或缺的部分,越来越多的人加入了“网购大军”,这需要物流行业能承担大量货运仓储压力;但是当下大部分分拣工作是人工或履带进行,人工效率较低,而且劳动量大,工人长时间劳动对其身体也会造成损伤,也容易造成分拣错误;而履带虽然速度快,运输不大受自然条件限制,载运量大,运输成本较低,但其灵活性差,只能在固定线路上实现运输,需要以其它运输手段配合和衔接,所以本项目在结合上述情况经验后,设计了这款物流搬运机器人。
作者:段开文 陈宝国 王开印 张皓 周忠旭
单位:山东农业工程学院
指导老师:李莉 王世辉
作品说明
2. 机器人本体说明
为了完成机器人的移动功能,我们设置了自动运行程序,并使用灰度传感器,在地面铺设多条黑线分别通往各类快递的收发位置,我们还利用了超声波传感器增加了避障功能,能灵活的识别前方障碍物并通过一系列反应躲避障碍物并回到原路线。
我们吸取了大型互联网公司仓储集散中心的货运小车的优缺点,在结构上添加了可进行360°旋转抓取的机械臂与可容纳更多货物的改进型筐斗,可以自行装配货物,并且在运行途中发现掉落货物可以抓起,防止出现传统物流货运小车收到货物阻拦便系统全部瘫痪的现象,而且灵活的机械臂可以应付体积更小,结构更复杂,表面更不规律的物件的精密抓取。
本作品中的筐斗采用3d打印技术制造而成,在保证强度的同时,也使得重量大大减轻,而且筐斗的尾部采用斜坡型设计,在保证货物不容易掉落的同时,也极大方便了倾倒,保证倾倒时货物不会留在筐中,并给货物一个缓冲,使其平滑的落到目的地。
3. 作品创新点
3.1 功能上创新
与当今市面上的物流运输小车相比,我们创作的机器人功能性更齐全,具有导向功能,简易的结构与超声波传感器的检测功能也为他提供了更灵活的能力,更能符合复杂的运行场所环境,在检测到掉落得物品时,我们创作的机器人可以对物品进行抓取或移动,防止其对总体运输系统造成影响,致使系统全部瘫痪,导致设备无法正常运行。
3.2 结构上创新
简洁的结构合理的结构布局,大大降低了小车重量的同时,也保证了小车车体的强度。机械臂的加入也使得功能性大大提高,可进行360°旋转抓取,抓取物品的爪部采用不对称布局,使得机械爪可以抓取表面不规则的物体,极大提高了爪部的抓取力量与对复杂物件的应对能力。筐斗的尾部采用斜坡型设计,在保证货物不容易掉落的同时,也极大方便了倾倒,保证倾倒时货物不会留在筐中,并给货物一个缓冲,可使其平滑的落到目的地。
3.3 取材上创新
我们设计制造的物流运输机器人采用探索者系列基础零件,取材少,材料费用较低,功能方面较为齐全,且筐斗采用3D打印技术,3d打印技术节省材料,不用剔除边角料,提高了材料的利用率,通过摒弃生产线而降低了成本,能做到较高的精度和很高的复杂程度,可以制造出采用传统方法制造不出来的、非常复杂的制件,可根据用户的不同需求DIY出独特的筐斗,倘若在未来批量生产,可采用注塑模具加工法,极大降低生产成本的同时,还可大大加快生产速度,小车简易的结构也使得其后期维修成本低廉。
4. 作品难点及解决方法
4.1 障碍物的检测问题
由于循迹功能的完成,要在循迹功能的基础上添加循迹功能就会产生程序上的冲突,经过多次对程序的改进,停止抓取功能始终不能按照理想化的形式运行。最后我们改变了思路,降低了超声波检测装置的位置,利用超声波传感器探测前方障碍物,然后执行电机的一系列操作,检测到障碍物后停止、抓取重新回到黑线上继续循迹前进,解决了程序冲突问题。
4.2 机器臂的抓取
为了实现机械臂的灵活抓取,我们的机械臂采用了4个探索者提供的标准舵机,以做到灵活抓取,但是随着舵机数量的增多,各舵机之间的协调运作的实现变得较为困难,最后我们采用模块化系统编程+统筹化结合解决了此项问题,使舵机可以灵活运作,进行抓取。
5. 作品改进方法
① 随着5G技术、物联网技术的不断发展完善,可以在机器人的开发板中植入智能化系统,实现导出终端,大数据云平台集合控制。
② 为机器人增加外壳,改善外观。
③ 增加蓝牙模块,添加摄像头。能大幅度拓宽机器人的功能,使其功能性得到完善,可实现在黑暗环境的巡逻、定向运输、物品寻找等功能。
④ 在机械臂上增加扫描器。可对物件上的二维码进行扫描,发现物品运输的错误、物品的掉落可智能检测出此物品的正确目的地。
⑤ 添加温度传感器,如果发现仓库、运输车间这种极度怕火的工作场景温度异常升高,可及时报警。
6. 示例程序
① 运作代码
#include <Servo.h>
Servo servo_3; Servo servo_4; Servo servo_A2; Servo servo_A4; Servo servo_7; Servo servo_A3;
void setMotor8833(int speedpin,int dirpin, int speed) { if (speed == 0) { digitalWrite(dirpin, LOW); analogWrite(speedpin, 0); } else if (speed > 0) { digitalWrite(dirpin, LOW); analogWrite(speedpin, speed); } else { digitalWrite(dirpin, HIGH); analogWrite(speedpin, -speed); } }
float checkdistance_7_8() { digitalWrite(7, LOW); delayMicroseconds(2); digitalWrite(7, HIGH); delayMicroseconds(10); digitalWrite(7, LOW); float distance = pulseIn(8, HIGH) / 58.00; delay(10); return distance; }
void setup(){ servo_3.attach(3); servo_4.attach(4); servo_3.write(75); delay(1000); servo_4.write(75); delay(1000); pinMode(5, OUTPUT); pinMode(6, OUTPUT); digitalWrite(5, LOW); digitalWrite(6, LOW); pinMode(9, OUTPUT); pinMode(10, OUTPUT); digitalWrite(9, LOW); digitalWrite(10, LOW); pinMode(7, OUTPUT); pinMode(8, INPUT); servo_A2.attach(A2); servo_A4.attach(A4); servo_7.attach(7); servo_A3.attach(A3); }
void loop(){ setMotor8833(5, 6, 200); setMotor8833(9, 10, 200); delay(1000); if (checkdistance_7_8() <= 10) { setMotor8833(5, 6, 0); setMotor8833(9, 10, 0);
} servo_A2.write(150); delay(1000); servo_A4.write(25); delay(1000); servo_7.write(150); delay(1000); servo_A3.write(10); delay(1000); servo_A3.write(70); delay(1000); servo_A2.write(90); delay(1000); servo_A2.write(180); delay(1000); servo_A4.write(150); delay(1000); servo_7.write(60); delay(1000); servo_A3.write(0); delay(1000); setMotor8833(5, 6, 100); setMotor8833(9, 10, 200); setMotor8833(5, 6, 200); if (checkdistance_7_8() <= 10) { setMotor8833(5, 6, 0); setMotor8833(9, 10, 0);
} servo_3.write(0); delay(1000); servo_4.write(0); delay(1000); servo_3.write(75); delay(1000); servo_4.write(75); delay(1000); while(true);
} |
void setMotor8833(int speedpin,int dirpin, int speed) { if (speed == 0) { digitalWrite(dirpin, LOW); analogWrite(speedpin, 0); } else if (speed > 0) { digitalWrite(dirpin, LOW); analogWrite(speedpin, speed); } else { digitalWrite(dirpin, HIGH); analogWrite(speedpin, -speed); } }
void setup(){ Serial.begin(9600); pinMode(5, OUTPUT); pinMode(6, OUTPUT); digitalWrite(5, LOW); digitalWrite(6, LOW); pinMode(9, OUTPUT); pinMode(10, OUTPUT); digitalWrite(9, LOW); digitalWrite(10, LOW); int A = 0; int B = 0; Serial.println(analogRead(A1)); A = analogRead(A1); B = analogRead(A0); if (A < 300 && B < 300) { setMotor8833(5, 6, 255); setMotor8833(9, 10, 255);
} else if (A < 300 && B > 300) { setMotor8833(5, 6, 0); setMotor8833(9, 10, 255); } else if (A > 300 && B < 300) { setMotor8833(5, 6, 255); setMotor8833(9, 10, 0); } } |
② 灰度传感器代码
* 本项目未获得作者开源授权,无法提供资料下载。
|