|
【S073】多功能图书整理机器人
作品说明 |
作者:李安政 李子盛 王雨晴 林依硕 尹婧雯
单位:西安外事学院
指导老师:杜凯育 毋文峰
1. 产品说明
1.1 设计目的
针对多功能图书整理机器人的特定需求和人工智能的发展趋势,本项目设计了一款室内多功能图书整理机器人,该机器人功能可以满足人们的日常需求,具有极高的性价比。在整理图书过程中,该机器人利用自身特殊的机械结构避开可障碍物,实现自动识别、检测、对图书进行抓取和运输等功能。本项目设计可推广应用于图书馆环境下的自动识别和拾取,具有显著的经济、社会效益。
1.2 场景调研
随着现代科学技术的发展,服务类机器人在市场越来越受欢迎,它不仅给人们的生活提供了便利,还优化了人们的生活方式。多功能图书整理机器人具备一定的人工智能化,能够自主地整理图书,因此人们解放了双手,提高了工作和学习效率。与此同时,多功能图书整理机器人作为一项重要智能化技术正在迅速变革,从简单的抓取、搬运等功能正在逐步扩展,增加识别分拣。因此设计一种合理的多功能整理图书机器人具有重大的研究意义。本产品以多功能图书整理机器人为研究对象,充分调研了目前多功能图书整理机器人的研究现状,了解了多功能图书整理机器人的发展趋势以及当前这类机器人所存在的不足,整个项目的最终目标是针对目前多功能图书整理机器人功能单一、结构复杂等缺点进行改造,设计一种能够自主循迹并且准确拾取图书的多功能图书整理机器人。该机器人可按照特定设计的路线运行并且绕开障碍物,完成规定的整理任务。
1.3 设计思路
根据多功能整理图书机器人研究现状和需求分析,本设计采用“需求分析-关键技术-设计功能”的总体思路,如下图所示:
作品说明
1.4 需求分析
因为在图书馆,图书覆盖了整个区域,而且图书类别繁多,为此拾取图书是一个费时费力的过程。在这种情况下我们设计了一款可以有效拾取图书的机器人,解放人们的双手,更能让人们花费的时间变少,提高了工作和学习效率,给人轻松舒适的心境。本项目设计的图书整理机器人包括电机驱动模块、避障模块。
① 电机驱动模块:该产品使用了五个伺服电机,两个灰度传感器,用 PWM 调速,四个步进电机驱动小车运动。
② 识别模块:机器人使用一个超声波,该超声波装在机器人的前方,用来检测前方是否有障碍物,检测出有障碍物时,小车会向后退,再转头以避开障碍物继续行驶。
③ 循迹模块:机器人使用两个灰度传感器识别地上的黑线,一个安装在车头左侧,一个安装在车头右侧,如果左侧传感器检测到轨迹,则向右行驶来纠正;同理如果右侧传感器检测到轨迹,则向左行驶来纠正。这样就保证轨迹始终在两个传感器之间,完成循迹。
1.5 机器人本体技术路线说明
本机器人为了满足图书馆复杂环境和相关应用。底座采用四个步进电机为机器人整体提供动力。夹取装置使用五个伺服电机搭载出 5 自由度的机械臂。使用灰度传感器让机器人按照指定路线完成运输工作。采用一个超声波传感器为使机器人能准确判断夹取与放置图书的工作区域。伺服电机能快速准确的确定参数,响应速度快,可以控制运动速度并确定位置精度;地面灰度传感器主要用于检测不同颜色的灰度值,判断此产品在循迹中沿黑线行走;步进电机则是驱使小车前进;舵机主要接收目标信号。通过巧妙运用技术使人们更容易拾取图书。最开始时用灰度传感器检测黑线,如果检测到黑线存在循迹运动。当机器人加持的超声波传感器检测到到达指定工作区域时,启动 5 自由度机械爪对图书进行抓取放置。拾取图书完成后后,超声波传感器没收到有图书的信号传入,则启动循迹模块前
往下一段区域进行图书的拾取,并返回图书放置区域,完成图书收集放置工作。
1.6 创新点
对于一般的图书整理机器人来讲,一般都只有图书摆放的功能,而没有对种类繁多又凌乱的图书加以整理的功能,而我们推出的这款机器人能够在行进过程中对书架的图书加以检测,这样的程序让机器人的实用性更强,更具有开发和利用价值,能够保证图书馆的整齐划一,给前来借阅图书的同学以舒适感。本项目机器人采用 1 个超声波来避障,相比较其它机器人结构简单、取材少、经济性高。而我们采取 5 自由度的机械臂,可以进行夹取,回转,进行空间上任何地方的运动,相对比较灵活。同时采用两个灰度传感器,其比颜色传感器更加灵敏、更加快速识别信号,按照指定的路线完成循迹。
1.7 难点及解决方案
如何顺利运行是一个难点,我们通过不断的实验、测量以及检查数据来解决这个问题。使根据其循迹顺利转弯也是一个难点,如何按照规划的路线并且准确地完成循迹需要我们查阅资料以及不断的进行试验、调整,完成循迹任务。再则我们怎样运用机械爪来准确获取图书,以及灰度传感器模拟数值的数字转化也是难点。对此我们的解决方案是通过多次采用灰度传感器传回的灰度值以及多次实验和数据分析后得出稳定的灰度值加入程序,采用 pwm 调速,控制左边两轮和右边两轮的速度差从而达到左转与右转,合理使用灰度值使得机器人在运作过程中进行稳定的巡线行驶。
2. 硬件设计说明
2.1 主控板设计
Arduino Mega2560 也是采用 USB 接口的核心电路板,它最大的特点就是具有多达54 路数字输入输出。Mega2560 的处理器核心是 ATmega2560,同时具有54 路数字输入/输出口(其中 16 路可作为 PWM 输出),16 路模拟输入,4 路 UART 接口,一个 16MHz 晶体振荡器,一个 USB 口,一个电源插座,一个 ICSP header 和一个复位按钮。Arduino Mega2560 上 USB 口附近有一个可重置的保险丝,既利于安装又起到保护作用。如下图所示:
2.2 Ares-ST 扩展板
要在 Ares 主控板上添加电路是一个比较麻烦的事,所以设计一个专用于简单机器人的扩展板,能将大部分传感器轻松地和 Ares 主控板连接。它特点在于能完全兼容 Ares 主控板标准接口,全部铜制插针,电器性能稳定,而将插针用彩色分类,一目了然。多种特殊接口设计,使用方便,步进电机驱动芯片可直接驱动舵机、直流电机、数码管等机器人常规执行部件,无需外围电路。除此之外,还具有 5v、6v 及 vin 电源接口,便于为各类扩展模块供电。如下图所示 为 Ares-ST 扩展板:
2.3 超声波传感器
超声波传感器是将超声波信号转换成其它能量信号(通常是电信号)的传感器。超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小的优点,特别是方向性好、能够成为射线而进行定向传播这个特点在运行中起到极大作用。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中。超声波碰到杂质或分界面会产生显著反射形成反射回波,碰到活动物体能产生多普勒效应。如下图所示为超声波传感器:
3. 软件设计
程序设计图
4. 搭建过程
① 刚开始时不太了解如何去组装,与老师讨论的过程中获得了更多的知识,也为后面精准正确的操作打下了坚实的基础。
② 该过程在不断的检查机器人的运行情况,以便机器人能正常运行。
③ 产品成果图。
5. 示例程序
#include <Servo.h> Servo A,B,C,D,E; #include <Arduino.h> #include <Wire.h> int pos=0 ; int La, Ra; #define ECHOPIN A0; #define TRIGPIN A1; int RA, LB,RC; #include <Wire.h> const int xdirPin = 44; // 方向引脚 const int xstepPin = 45; // 步进引脚 const int ydirPin = 32; // 方向引脚 const int ystepPin = 33; const int zdirPin = 42; // 方向引脚 const int zstepPin = 43; // 步进引脚 const int adirPin = 30; // 方向引脚 const int astepPin = 31; const int STEPS_PER_REV =700; void advance(); void cease(); void righe(); void left(); void scram(); void setup() { // put your setup code here, to run once: pinMode(xstepPin, OUTPUT); pinMode(xdirPin, OUTPUT); pinMode(ystepPin, OUTPUT); pinMode(ydirPin, OUTPUT); pinMode(zstepPin, OUTPUT); pinMode(zdirPin, OUTPUT); pinMode(astepPin, OUTPUT); pinMode(adirPin, OUTPUT); Serial.begin(9600); delayMicroseconds(10000); A.attach(2); // Servo 对象连接在 9 号引脚 delay(10);B.attach(3); // Servo 对象连接在 9 号引脚 delay(10); C.attach(3); // Servo 对象连接在 9 号引脚 delay(10); D.attach(3); // Servo 对象连接在 9 号引脚 delay(10); E.attach(3); // Servo 对象连接在 9 号引脚 delay(10); Serial.begin(9600); } void loop() { cm=ceju(aa); RA = analogRead(A2); LB = analogRead(A4); RC = analogRead(A6); //cease(); //delay(100); int shang; shang=RA-LB; Serial.print("zuo"); Serial.print(RA); Serial.print("CM"); Serial.print(" "); Serial.print("you"); Serial.print(LB); Serial.print("DISAN"); Serial.print(shang); Serial.print("\n"); if (RA >= 500 && LB >= 400) { //Serial.print("停止\n"); cease(); //调用停止函数 } else if (shang>=(-200)&&shang<=200) { // Serial.print("前进\n"); advance(); //调用前进函数 } else if (shang>=200 ) { // Serial.print("you 转\n"); //scram(); righe(); //右转} else if (shang < (-200)) { //Serial.print("zuo 转\n"); //scram(); left(); //左转 } else if(cm>=0&&cm<50) { jiaqu(); fanhui(); fuyuan(); } } void jiaqu() { for(int pos=130;pos>=0;pos--) { A.write(pos); } delay(2000); for(int pos=30;pos<=120;os++) { B.write(pos); } delay(2000); for(int pos=50;pos<=120;pos++) { C.write(pos); } delay(2000); for(int pos=30pos<=30;pos++) { D.write(pos); } delay(2000);for(int pos=85;pos>=60;pos--) { E.write(pos); } delay(2000); } void huilai(){ for(int pos=170;pos>=40;pos--) { A.write(pos); } delay(2000); for(int pos=30;pos=30;) { B.write(pos); } delay(2000); for(int pos=140;pos>=45;pos--) { C.write(pos); } delay(2000); for(int pos=150;pos>=30;pos--) { D.write(pos); } delay(2000); for(int pos=85;pos>=60;pos--) { E.write(pos); } delay(2000); } void fuyuan(){ for(int pos=0;pos<=130;pos++) { A.write(pos); }delay(2000); for(int pos=120;pos>=30;pos--) { B.write(pos); } delay(2000); for(int pos=120;pos>=50;pos--) { C.write(pos); } delay(2000); for(int pos=30;pos>=30;pos--) { D.write(pos); } delay(2000); for(int pos=60;pos<=85;pos--) { E.write(pos); } delay(2000); } viod ceju(){ digitalWrite(TRIGPIN, LOW); //给 Trigpin 发送一个低电平(初始 化) delayMicroseconds(5000); //等待 2 微妙 digitalWrite(TRIGPIN, HIGH);//给 Trigpin 发送一个高电平 delayMicroseconds(5000); //等待 10 微妙 digitalWrite(TRIGPIN, LOW); //给 Trigpin 发送一个低电平 float distance = pulseIn(ECHOPIN, HIGH);//存储回波等待时间, float aa = (distance * 17 )/1000; //把回波时间换算成 cm return aa; Serial.print("ECHOPIN ="); Serial.print(distance);//串口输出等待时间的原始数据 Serial.print(" | | Distance = "); Serial.print(aa);//串口输出距离换算成 cm 的结果 Serial.println("cm"); } void advance() { //前进函数digitalWrite(xdirPin, HIGH); digitalWrite(ydirPin, LOW); digitalWrite(zdirPin, HIGH); digitalWrite(adirPin, LOW); for (int x = 0; x <500; x++) { digitalWrite(xstepPin, HIGH); digitalWrite(ystepPin, HIGH); digitalWrite(zstepPin, HIGH); digitalWrite(astepPin, HIGH); delayMicroseconds(400); digitalWrite(xstepPin, LOW); digitalWrite(ystepPin, LOW); digitalWrite(zstepPin, LOW); digitalWrite(astepPin, LOW); delayMicroseconds(400); } } void cease() { //停止函数 digitalWrite(xstepPin, HIGH); digitalWrite(ystepPin, LOW); digitalWrite(zstepPin, HIGH); digitalWrite(astepPin, LOW); delayMicroseconds(1000); } void righe() { //右转函数 digitalWrite(xdirPin, HIGH); digitalWrite(ydirPin, HIGH); digitalWrite(zdirPin, HIGH); digitalWrite(adirPin, HIGH); for (int x = 0; x <600; x++) { digitalWrite(xstepPin, HIGH); digitalWrite(ystepPin, HIGH); digitalWrite(zstepPin, HIGH); digitalWrite(astepPin, HIGH); delayMicroseconds(800); digitalWrite(xstepPin, LOW); digitalWrite(ystepPin, LOW); digitalWrite(zstepPin, LOW); digitalWrite(astepPin, LOW); delayMicroseconds(800); } }void left() { //左转函数 digitalWrite(xdirPin, LOW); digitalWrite(ydirPin, LOW); digitalWrite(zdirPin, LOW); digitalWrite(adirPin, LOW); for (int x = 0; x < 600; x++) { digitalWrite(xstepPin,HIGH); digitalWrite(ystepPin, HIGH); digitalWrite(zstepPin, HIGH); digitalWrite(astepPin, HIGH); delayMicroseconds(400); digitalWrite(xstepPin, LOW); digitalWrite(ystepPin, LOW); digitalWrite(zstepPin, LOW); digitalWrite(astepPin, LOW); delayMicroseconds(400); } } void scram() { digitalWrite(xstepPin, HIGH); digitalWrite(ystepPin, HIGH); digitalWrite(zstepPin, HIGH); digitalWrite(astepPin, HIGH); delayMicroseconds(800); digitalWrite(xstepPin, LOW); digitalWrite(ystepPin, LOW); digitalWrite(zstepPin, LOW); digitalWrite(astepPin, LOW); } |
* 本项目未获得作者开源授权,无法提供资料下载。