【S141】智能分拣抓取机器人
作品说明 |
作者:余泽钲 应奇艇 陈威雨
单位:浙江警察学院
指导老师:陈东杰 范英盛
本项目设计的作品是一款可以智能分拣、抓取的机器人,特点是可以通过灰度传感器的变化来实现机器人巡线至程序设计的地方,利用舵机控制小车机械手的放下、升起和高度上下调节,充分利用机器人的速度快、准确性高的特点,让货物接受智能的挑选与运输,提升运输效率。另外本项目设计加装了红外测距传感器来判断机器人是否成功将货物抓取和放置,从而来提升准确性。
关键字:灰度传感器;红外测距传感器;齿条升降;分拣抓取
1. 研究背景
随着现在科技、网络、社会的发展,人工智能和机械智能化、自动化已经成了一个不可避免的趋势。比如现在几乎人人都在用的购物网站,现在发展也越来越快,有了十分庞大的数据网络,相关联的发货商的压力也越来越大,而现在有了用人工智能机器人对商品进行智能分类、抓取,并放到相匹配的发货地点、发货单位窗口,而基础就是一套能巡线的抓取机器人,因此本作品在此基础上设计了一个能识别物体并进行抓取的机器人。
作品说明
智能分拣抓取机器人
2. 工作原理
2.1 灰度传感器
灰度传感器利用不同颜色的检测面对光的反射程度不同的原理工作的,通过两个LED小灯发出的光源,光敏电阻接收不同检测面返回的光强值,使得其阻值发生改变,来进行颜色深浅检测。在环境光干扰不是很严重的情况下,用于区别黑色与其它颜色。它还有比较宽的工作电压范围,在电源电压波动比较大的情况下仍能正常工作。它输出的是连续的模拟信号,因而能很容易地通过A/D转换器或简单的比较器实现对物体反射率的判断,是一种实用的机器人巡线传感器。
2.2 红外测距传感器
红外测距传感器是一种传感装置,是用红外线为介质的测量系统,测量范围广,响应时间短的优点。红外测距传感器具有一对红外信号发射与接收二极管,利用的红外测距传感器中的红外发射器发射出一束红外光,在照射到物体后形成一个反射的过程,反射到传感器后接收信号,然后利用接收发射与接收的时间差的数据计算来测定大致距离。测量距离较为固定,使小车在检测到木棍放入小洞后,能继续执行下一段程序。
2.3 利用舵机设计的升降平台及机械手
伺服舵机一种是根据角度伺服的驱动器,用齿条与之固定连接,可以通过伺服电机改变角度来改变机械手的初始高度,上下约可以升降7-8cm,而且因为齿条的位置较为靠中,可以使小车的重心不至于因为机械手的重量而偏离。使用扭力较大的大舵机使得齿条足以支撑机械手的重量而不至于下降,机械爪使用的是中型舵机,而机械爪粗糙的表面足以抓住木棍而不至于掉落,而连接处的舵机可以使木棍转到一个便于放置进洞的位置。
2.4 动力系统小电机
马达是通过磁电转换而转变成动能的装置,具有转换效率高,性能转速较为稳定的优点,是良好的驱动小车前进转向的装置。通过内部的齿轮组将高转速的马达转换成较低转速的可以驱动小车前进的动力。通过程序的控制来实现左右侧不同的转速使得小车能按既定的方向行走。
3. 技术分析
整辆小车的组成如下图所示,分别由小车主体、循线模块、动力模块、升降模块和抓取模块组成。
小车装置组成
小车主体由四块主板组成,四块主板依靠小零件相连组成小车的主体。主体下方连接动力模块,上方连接着主控板与其他各个模块。
循线模块由八路灰度传感器和红外线传感器组成。灰度传感器通过发光二极管发出白光,照射在地面上,检测面反射部分光线,光敏电阻检测此光线的强度并转换为小车主控板可以识别的信号,并在处理后传递给动力模块从而实现循线。而红外线传感器通过发射的红外线是非被反射来实现判断前方是否有障碍或是否抵达目的地等功能以完善整个循线模块。此外,红外装置还能起到控制启动的作用。
动力模块由四个电机和四个轮胎组成。四个电机依靠零部件分别与四个轮胎相组合,组装于小车底板侧面。通过主控板发出不同的信号控制各个电机带动轮胎转动,并依靠四个轮胎的不同转动来按需求实现前进、后退、转弯等不同的功能。
伸缩模块由齿条、齿轮和舵机构成。根据主控板的信号来控制舵机的转动,再通过舵机的转动来控制与其相连的齿轮旋转,从而带动齿条的上下移动来实现机械爪的升降功能。
抓取模块有机械爪和两个舵机组成。根据主控板的信号来控制舵机的转动。其中,通过第一个舵机的转动来实现机械手的举放动作,再通过另一个舵机的转动来实现机械手的抓、放功能。
4. 示例程序
#include <Servo.h>
Servo servo_pin_4; Servo servo_pin_12; Servo servo_pin_3;
void stop(); void ht(); void xs(); void back(); void you(); void xunxianxi(); void zuod(); void youd(); void zuo(); void dui(); void xunxian(); void stop2(); void go();
void setup() { pinMode( 2, INPUT); pinMode( 19, INPUT); pinMode( 17, INPUT); pinMode( 18, INPUT); pinMode( 15, INPUT); pinMode( 16, INPUT); pinMode( 14, INPUT); servo_pin_4.attach(4); servo_pin_12.attach(12); servo_pin_3.attach(3); pinMode( 5 , OUTPUT); pinMode( 6 , OUTPUT); pinMode( 9 , OUTPUT); pinMode( 10 , OUTPUT); }
void loop() { servo_pin_4.write( 140 ); servo_pin_12.write( 90 ); servo_pin_3.write( 90 ); stop(); while ( ( ( digitalRead(2) ) == ( HIGH ) ) ) { stop(); }
go(); delay( 300 ); while ( ( ( ( digitalRead(15) ) == ( LOW ) ) || ( ( digitalRead(18) ) == ( LOW ) ) ) ) { xunxianxi(); }
stop(); back(); delay( 10 ); stop(); while ( ( ( digitalRead(17) ) == ( LOW ) ) ) { youd(); }
stop(); go(); delay( 450 ); stop(); servo_pin_3.write( 180 ); stop(); servo_pin_4.write( 50 ); stop(); servo_pin_12.write( 0 ); stop(); back(); delay( 370 ); stop(); zuod(); delay( 600 ); while ( ( ( digitalRead(16) ) == ( LOW ) ) ) { zuod(); }
delay( 50 ); stop(); while ( ( ( ( digitalRead(15) ) != ( HIGH ) ) || ( ( digitalRead(14) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 300 ); while ( ( ( ( digitalRead(15) ) != ( HIGH ) ) || ( ( digitalRead(14) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 300 ); while ( ( ( ( digitalRead(14) ) != ( HIGH ) ) || ( ( digitalRead(15) ) != ( HIGH ) ) ) ) { xunxian(); }
stop(); back(); delay( 25 ); stop(); zuod(); delay( 450 ); while ( ( ( digitalRead(15) ) == ( LOW ) ) ) { zuod(); }
stop(); while ( ( ( digitalRead(2) ) == ( HIGH ) ) ) { xunxianxi(); }
stop(); go(); delay( 200 ); stop(); servo_pin_3.write( 90 ); stop(); servo_pin_12.write( 20 ); stop(); servo_pin_4.write( 170 ); stop(); back(); delay( 250 ); servo_pin_12.write( 90 ); servo_pin_4.write( 140 ); stop(); zuod(); delay( 280 ); while ( ( ( digitalRead(15) ) == ( LOW ) ) ) { zuod(); }
stop(); while ( ( ( digitalRead(18) ) != ( HIGH ) ) ) { xunxian(); }
back(); delay( 150 ); stop(); youd(); delay( 100 ); stop(); while ( ( ( ( digitalRead(19) ) != ( HIGH ) ) || ( ( digitalRead(18) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 200 ); while ( ( ( ( digitalRead(18) ) != ( HIGH ) ) || ( ( digitalRead(19) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 200 ); while ( ( ( ( digitalRead(18) ) != ( HIGH ) ) || ( ( digitalRead(19) ) != ( HIGH ) ) ) ) { xunxian(); }
stop(); zuod(); delay( 100 ); stop(); go(); delay( 350 ); stop(); servo_pin_3.write( 180 ); stop(); servo_pin_4.write( 50 ); stop(); servo_pin_12.write( 0 ); stop(); back(); delay( 450 ); stop(); zuod(); delay( 500 ); stop(); xs(); }
void you() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); }
void xunxian() { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( HIGH ) ) && ( ( ( digitalRead(17) ) == ( HIGH ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { go(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( HIGH ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { zuo(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( HIGH ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { you(); } else { if (( ( ( digitalRead(15) ) == ( HIGH ) ) && ( ( ( digitalRead(16) ) == ( HIGH ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { zuo(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( HIGH ) ) && ( ( digitalRead(18) ) == ( HIGH ) ) ) ) )) { you(); } else { if (( ( ( digitalRead(15) ) == ( HIGH ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { zuo(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( HIGH ) ) ) ) )) { you(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(14) ) == ( HIGH ) ) ) ) )) { digitalWrite( 5 , LOW ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); } else { if (( ( ( digitalRead(19) ) == ( HIGH ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH ); } else { go(); } } } } } } } } } }
void xunxianxi() { if (( ( ( digitalRead(16) ) == ( HIGH ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) )) { zuo(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( digitalRead(17) ) == ( HIGH ) ) ) )) { you(); } else { if (( ( ( digitalRead(15) ) == ( LOW ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( HIGH ) ) ) ) )) { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH ); } else { if (( ( ( digitalRead(15) ) == ( HIGH ) ) && ( ( ( digitalRead(16) ) == ( LOW ) ) && ( ( ( digitalRead(17) ) == ( LOW ) ) && ( ( digitalRead(18) ) == ( LOW ) ) ) ) )) { digitalWrite( 5 , LOW ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); } else { go(); } } } } }
void go() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); }
void xs() { while ( ( ( digitalRead(16) ) == ( LOW ) ) ) { zuod(); }
stop(); while ( ( ( ( digitalRead(15) ) != ( HIGH ) ) || ( ( digitalRead(14) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 300 ); while ( ( ( ( digitalRead(14) ) != ( HIGH ) ) || ( ( digitalRead(15) ) != ( HIGH ) ) ) ) { xunxian(); }
stop(); go(); delay( 300 ); while ( ( ( ( digitalRead(14) ) != ( HIGH ) ) || ( ( digitalRead(15) ) != ( HIGH ) ) ) ) { xunxian(); } stop(); go(); delay( 300 ); while ( ( ( ( digitalRead(14) ) != ( HIGH ) ) || ( ( digitalRead(15) ) != ( HIGH ) ) ) ) { xunxian(); }
stop(); back(); delay( 75 ); stop(); zuod(); delay( 300 ); while ( ( ( digitalRead(15) ) == ( LOW ) ) ) { zuod(); }
stop(); while ( ( ( ( digitalRead(14) ) != ( HIGH ) ) || ( ( digitalRead(15) ) != ( HIGH ) ) ) ) { xunxian(); }
stop(); back(); delay( 25 ); stop(); zuod(); delay( 350 ); while ( ( ( digitalRead(15) ) == ( LOW ) ) ) { zuod(); }
stop(); back(); delay( 20 ); stop(); dui(); dui(); while ( ( ( digitalRead(2) ) == ( HIGH ) ) ) { xunxianxi(); }
stop(); go(); delay( 100 ); stop(); servo_pin_3.write( 90 ); stop(); servo_pin_12.write( 20 ); stop(); servo_pin_4.write( 170 ); stop(); back(); delay( 350 ); stop(); servo_pin_12.write( 90 ); servo_pin_4.write( 140 ); stop(); zuod(); delay( 300 ); while ( ( ( digitalRead(16) ) == ( LOW ) ) ) { zuod(); }
stop(); ht(); }
void back() { digitalWrite( 5 , LOW ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH ); }
void stop2() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); delay( 200 ); }
void dui() { }
void stop() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , LOW ); delay( 1000 ); }
void youd() { digitalWrite( 5 , HIGH ); digitalWrite( 6 , LOW ); digitalWrite( 9 , LOW ); digitalWrite( 10 , HIGH ); }
void zuo() { digitalWrite( 5 , LOW ); digitalWrite( 6 , LOW ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); }
void ht() { while ( ( ( digitalRead(18) ) != ( HIGH ) ) ) { xunxian(); }
stop(); delay( 10 ); stop(); youd(); delay( 400 ); stop(); while ( ( ( ( digitalRead(19) ) != ( HIGH ) ) || ( ( digitalRead(18) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 200 ); while ( ( ( ( digitalRead(18) ) != ( HIGH ) ) || ( ( digitalRead(19) ) != ( HIGH ) ) ) ) { xunxian(); }
go(); delay( 200 ); while ( ( ( ( digitalRead(18) ) != ( HIGH ) ) || ( ( digitalRead(19) ) != ( HIGH ) ) ) ) { xunxian(); }
stop(); youd(); delay( 330 ); while ( ( ( digitalRead(18) ) == ( LOW ) ) ) { youd(); }
delay( 100 ); stop(); go(); delay( 1200 ); stop(); }
void zuod() { digitalWrite( 5 , LOW ); digitalWrite( 6 , HIGH ); digitalWrite( 9 , HIGH ); digitalWrite( 10 , LOW ); } |
5. 应用前景
智能机器人目前一般在一些物流比较庞大复杂的大城市应用,但随着时间的发展,会有越来越多的城市会需要这种智能机器人来分类商品,提高效率并降低失误率,而本项目做的这套机器人基础性比较低,结构简单,造价也比较低,应用空间和前景都比较广,相信在进一步的改良下会有更好的应用前景。
* 本项目未获得作者开源授权,无法提供资料下载。
|