机器谱

S138】一种智能AGV抓取小车

图文展示3264(1)

图文展示3264(1)

副标题

作品说明

作者:苗雄雄 刘晓康

单位:北方民族大学

指导老师:张春涛 田国禾

1. 研究背景以及意义

1.1 国外研究概况

      国外从上世纪50年代在仓储业首先应用AGV,目前观之,AGV的使用已扩展到机械加工,家电消费,微电子加工等多个行业。相比国外,国内AGV的发展较晚,在各个领域目前处于跟跑状态。在消费制造业的生产线中,AGV现在能够高效,精确,灵敏的实现物品的空间搬运任务。而且可由多台AGV合作组成柔性的物料搬运网络,路径能够随流程相应作出改动,使一条生产线可以制作多种商品,提高了柔性加工。例如Volvo Kalmar 汽车生产厂为了提升运输方面的灵敏多样性,以AGVS为载运对象的自主轿车生产线就被提上了日程。该生产线由多台AGVS组成,使装配时间与劳动力都相应较少,提升了效率。当前,绝大多数机械行业与运输行业都已经使用到了AGV。

      项目研究依托于对湖北三丰机器人有限公司的实习经验,自主设计了一款磁条引导式运输型机器人。以现有的传感器与微控技术为基础,并结合车身设计,制造出完整的小车,以减轻劳动强度。对于中国而言,AGV起步较晚,并且由于国内需求限制发展较慢,国内许多搬运货物的场所都是由人工操作的简单行为来实现,仅有在那些自动化水平要求较高,作业环境对人体有伤害的场合才大量应用AGV,而且依赖于国外,无自主产权。如今人工成本上升,为了适应国民经济发展的要求且提升国家核心竞争力,国内许多厂家开始大力发展、使用AGV,对于在自动化制造中起纽带作用的AGVS有更强烈的需求,所以开发研制自主产权的AGVS有十分广阔的前景。

1.2 国内研究概况

      目前AGV已经在烟草、汽车装配、印钞造币、新闻出版以及石油岩芯等领域广泛应用。冀东油装配、印钞造币、新闻出版以及石油岩芯等领域广泛应用。冀东油分析的流程特点,为岩芯的观察分析提供一种先进的物流解决方案,有利于提高岩芯管理的信息化水平1953年,Barrett Electric公司在世界范围内最先制作了一批自主导引小车。70年代中期,运输型AGV在欧洲与美国得到了大量使用。到了上世纪80年代初,伴随着AGV技术的发展,其应用领域逐渐多元化。最近10年,AGV扩展到大功率负载搬运领域,尤其是在装配运输等行业利用多台AGV小车协同构成柔性装配生产线。

      AGV在我国的研究及发展较晚20世纪70年代后期北京起重运输机械研究所研制了三轮式AGV;80年代后期北京机械工业自动化研究所为二汽研制了应用在立体化仓库中的AGV。1992年,中国第一次将国内的AGV投入柔性生产线中当前我国各种机构公司拥有AGV 3000多台,但国产比例较小其中国内在AGV研究方面比较出名的有沈阳新松机器人有限公司等。我国公司自主生产的AGV主要应用于货物运输,装配制造,电子信息等行业,从功能上分为装配机器人和搬运机器人两大类国内AGV在功能上与设计上与国外相比还是有一定差距为了跟上世界先进水平甚至进行反超,我国一些优秀企业一直在研究攻关例如合肥井松自动化已经自主研发了第一代激光导航叉取式AGV而且加紧研发后叉式AGV。随着经济的发展,未来我AGV的制造与使用都将有一个质的蜕变。

2. 设计过程

2.1 机器人模型

      下图为本作品设计的机器人模型,结构主要由移动平台的机械结构、抓取装置、主控板、灰度传感器、近红外传感器、直流电机和伺服电机七个部分构成。

作品说明

机器人模型

2.2 硬件部分

      抓取机器人的硬件结构主要由移动平台的机械结构、抓取装置、主控板、灰度传感器、近红外传感器、直流电机和伺服电机七个部分构成。

2.2.1抓取装置

      通过伺服电机控制抓手的移动来抓取物体,实物图如下所示:

机器人抓手

2.2.2 主控板(Basra主控板+bigfish扩展板)

      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、蓝牙等扩展模块直插连接,无需额外接线。

主控板

      特点:开放源代码的电路图设计,程序开发接口免费下载,也可依需求自己修改;可以采用USB接口供电,不需外接电源,也可以使用外部 DC 输入;支持 ISP 在线烧,可以将新的“bootloader”固件烧入芯片。有了bootloader之后,可以在线更新固件;支持多种互动程序,如:Flash、Max/Msp、VVVV、PD、C、Processing 等;具有宽泛的供电范围,电源电压可任选 3v~12v 的电源;采用堆叠设计,可任意扩展;主控板尺寸不超过 60mm*60mm,便于给小型机电设备安装;板载 USB 驱动芯片及自动复位电路,烧录程序时无需手动复位。

2.2.3 灰度传感器

      灰度传感器是模拟传感器,灰度传感器利用光敏电阻对不同颜色的检测面对光的反射程序不同,其阻值变化在的原理进行颜色深浅检测。灰度传感器有一只发光二极管和一只光敏电阻,安装在同一面上。在有效的检测距离内,发光二极管发出白光,照射在检测面上,检测面反射部分光线,光敏电阻检测此光线的强度并将其转换为机器人可以识别的信号。

图层 1.jpg

版本:v1.0.1

传感器_灰度

机器时代(北京)科技有限公司

序号

物料名称

Designator

Footprint

LibRef

数量

数值大小

1

插件_四针米色卧式防反插针

JP1

Header 4

HDR1X4

1

四针米色插针(卧式)

2

IO件_红外收发一体管

JP2

HDR2X2

Header 2X2

1

红外收发一体管

3

电阻_0805_604R

R1

R2012-0805

Res Thermal

1

604R

4

电阻_0805_51K

R2

R2012-0805

Res Thermal

1

51K

5

PCB_灰度




1
6

塑胶_绝缘壳(传感器)




1



图层 1.jpg

版本:v1.0.1

传感器_灰度

机器时代(北京)科技有限公司

序号

物料名称

Designator

Footprint

LibRef

数量

数值大小

1

芯片_555芯片

555

SO-G8

Header4X2A

1

2

IO件_红外发射头5.0

红外发射头

5mm_2.54mm

Header 2X2

1

D-5mm

3

IO件_红外接收头

JP2

HDR1X3


1

5*6*5mm 38HZ红外接收头

4

弹簧_弹簧管r6h6.5

弹簧管



1

Φ6mm高6.5mm

5

插件_四针米色卧式防反插针

JP1

Header 4

HDR1X4

1

四针米色插针(卧式)

6

三极管_贴片8050

Q1

SOT-23

NPN

1

8050

7

电阻_0805_4.7K

R1

R2012-0805

Res Thermal

1

4.7K

8

电阻_0805_56K

R2

R2012-0805

Res Thermal

1

56K

9

电阻_0805_470R

R3

R2012-0805

Res Thermal

1

470R

10

电阻_0805_100R

R4

R2012-0805

Res Thermal

1

100R

11

电阻_0805_100R

R5

R2012-0805

Res Thermal

1

100R

12

电容_C2012-0805_301

C1

C2012-0805

Cap

1

301(300pF)

13

电容_C2012-0805_104

C2

C2012-0805

Cap

1

104

14

电容_47uF胆电容B型16v

C3

CAPR5-4X5

Cap2

147uF胆电容
15

PCB_近红外




1
16

塑胶_绝缘壳(传感器)




1



      灰度传感器上无信号指示灯,但是配有检测颜色返回模拟量大小调节器。欲使检测给定的颜色时,可以将发射/接收头置于给定颜色处,配合调节器即可调出合适的返回模拟量。方法如下:

      将调节器逆时针方向旋转,返回模拟量变大

      将调节器顺时针方向旋转,返回模拟量变小

2.2.4 近红外传感器

      近红外传感器用近红外能量来直接检测被加工产品的特定组元或成分。这些传感器的运行原理是,这些组元会选择性吸收近红外能量的特定波长。实物如下所示:

近红外传感器

      近红外传感器模块工作电压为+5V,具有数字量电平信号和模拟量电平信号输出,在使用过程中,可以根据需要,选择数字量电平信号或模拟量电平信号。当远红外接收二极管接收到红外信号后,红外接收二极管的电阻减小,电流变大,AC节点电压被拉低为低电平信号;相反,没有接收到红外信号时,红外接收二极管呈现极高阻值,AC 节点电压被上拉为高电平信号。

2.2.5 直流电机与伺服电机  

      直流电机与伺服电机为整个系统提供动力驱动,实现底盘的移动、抓取机器人的运动模式转换、抓取结构的机械臂的转动与移动。实物如下所示:

直流电机

      直流电机:直流电机(direct current machine)是指能将直流电能转换成机械能直流电动机或将机械能转换成直流电能(直流发电机)的旋转电时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。直流电机的工作原理就是把电枢线圈中感应的交变电动势,靠换向器配合电刷的换向作用,使之从电刷端引出时变为直流电动势的原理。感应电动势的方向按右手定则确定(磁感线指向手心,大拇指指向导体运动方向,其他四指的指向就是导体中感应电动势的方向。)

      伺服电机(servo motor )是指在伺服系统中控制机械元件运转的发动机,是一种补助马达间接变速装置。伺服电机可使控制速度,位置精度非常准确,可以将电压信号转化为转矩和转速以驱动控制对象。伺服电机转子转速受输入信号控制,并能快速反应,在自动控制系统中,用作执行元件,且具有机电时间常数小、线性度高、始动电压等特性,可把所收到的电信号转换成电动机轴上的角位移或角速度输出。分为直流和交流伺服电动机两大类,其主要特点是,当信号电压为零时无自转现象,转速随着转矩的增加而匀速下降。伺服系统(servo mechanism)是使物体的位置、方位、状态等输出被控量能够跟随输入目标(或给定值)的任意变化的自动控制系统。伺服主要靠脉冲来定位,基本上可以这样理解,伺服电机接收到1个脉冲,就会旋转1个脉冲对应的角度,从而实现位移,因为,伺服电机本身具备发出脉冲的功能,所以伺服电机每旋转一个角度,都会发出对应数量的脉冲,这样,和伺服电机接受的脉冲形成了呼应,或者叫闭环,如此一来,系统就会知道发了多少脉冲给伺服电机,同时又收了多少脉冲回来,这样,就能够很精确的控制电机的转动,从而实现精确的定位,可以达到0.001mm。

2.3 软件部分

      Arduino软件开发平台及C语言程序控制

2.3.1 Arduino开发环境

      Arduino是一款结构简单,易于操作的开源编程软件。其含有各种型号的Arduino板和与不同控制板相配套的软件(Arduino UNO),也可对其他控制板进行编译传输(BigFish扩展板)。Arduino 它构建于开放原始码simple I/O界面版,并且与C语言、C++等编程软件开发环境相似。其主要由两个部分构成——硬件部分和开发环境:硬件部分包含各种型号的控制板以及可编程的其他程序;另一个则是计算机中的程序开发环境。只需将正确的程序代码写入编译框中,将程序上传到Arduino控制板后,程序便会操控Arduino电路板进行相应工作【】。

      Arduino能够与各种传感器相配合,将传感器的信号接收至程序中,通过控制灯光、电机和其他的可视装置来反馈、调节环境。板子上的微控制器可以接收由Arduino的编程语言进行编写的二进制程序,进而控制一些装置。

2.3.2 C 语言运动程序

      Arduino采用C语言编程,使用C语言编译规则,程序包含三个主要部分:结构、定义值(变量与恒量)以及相应函数。一般结构常见的由以下两个函数:“setup”、“loop”。“setup()” 是在“sketch”开始运行时被读取的,用以定义初始化变量、管脚、调用相应的库函数等等。这个函数只会在开发板上电或复位时被引用一次。而“loop()”类似于C语言中的“while”函数。待“setup()”函数执行结束后,“loop()”函数循环执行。

      “PinMode()”定义与端口相连的信号输入/输出状态,将信号反馈给控制器。

      “digitalRead()”本意为“读取数字量“,将端口信号状态读取出来,为后续程序提供数据。

       “pwm”是指对模拟信号进行数字编码。简单来说,是通过改变占空比对电平进行编码,高电平使电机起动,低电平停止电机转动。通过改变占空比,调节高低电平的频率,进而控制电机速度。

      “analogWrite()”本意是“输入模拟量”,程序中将所在端口的pwm值写入,进而改变端口控制电机的转速。

      “INPUT”是指信号输入,一般与传感器相接,当传感器发生信号变化时,通过与之相连的端口将信号传输给Arduino控制板,通过微控制器改变直流电机状态。

      “OUTPUT”与之相反,其一般与直流电机等执行部件相连。所在端口通过接收由微控制器发出的信号,进而改变直流电机的运行状态。

      本次设计未涵盖变压元件,故AGV小车的行走速度只与供电元件的电压电流密切相关,无法进行调节。可用锂电池提供能源、电脑连接USB线供电以及电池连接GND或VIN引脚供电。由于各电源所能提供的电压电源的差异,可相应改变AGV小车的运动速度,这是外部电源控制。

2.3.3 小车圆周运动的设计与实现

       AGV小车在转向过程中,速度应保持在一个较低水平,一方面是由于传感器反应时间与程序运行问题,另一方面是防止速度过快,水平地面摩擦力小,AGV小车转向困难。转向过程中具体分析如下:

在圆周运动中,使用物理公式

运行轨迹图

      本实验在光滑地板上进行,路径简单,路况单一,故采用简单便捷易控制的轮式AGV小车。本实验最大的隐患是AGV小车不能沿磁条行进,冲出跑道导致实验失败,因此对转弯半径与小车速度两方面进行控制。轨迹半径较大时,虽然AGV小车运动不甚平稳,左右摇晃,但是AGV小车灰度传感器检测的周期得以延长,更易控制小车的行进与转向,基本可以保证小车不会冲出预设轨迹。半径较大,占用面积也大,运动一周时间加长,故在R=0.34m的基础上适当改变。

      改变AGV小车速度同样也是防止实验失败的一种方法。由于各种硬件设备(灰度传感器、BASRA控制板)的检测与接收的速度较慢,AGV小车有很大可能出现以下情况:其中左侧的灰度传感器检测到磁条,传感器将信号触发发送给BASRA控制板,控制板控制程序进行相对信号传输于电机端口,控制左侧两个电机的运动。如果灰度传感器检测、传输较慢,或BASRA控制板接收信息、传输信息较慢,就有可能出现AGV小车左侧灰度传感器检测到磁条后,仍然冲出跑道,在之后的某个时间段内小车左转,然后前行。这种情况就是小车速度过快,没有给硬件设备留下反应的时间。因此控制速度也是很重要的。

3. 结论与展望

      在现有条件的基础上进行选材,如电机,舵机,控制板,扩展版,灰度传感器,近红外传感器等。通过硬件安装,设备组装,制作出完整简便的AGV小车。 接下来就是软件,程序的安装与调试,这是本次实验的重点。Arduino软件目前有很多版本,依据探索者课件,本项目选用了1.5.2版本,并且同时使用1.8.5版本,以应对程序编译时出现的软件不兼容的情况。在程序调试过程中,遇到的最大问题是由于设备缺失出现的无法调节小车转速。在经过与他人探讨后,决定采用低电源进行供电,以弥补程序的短板。待程序编译,烧录完成后,在地面上张贴磁条(为方便起见,磁条由黑色胶带简单替换)。刚开始实验时发现,由于小车速度过快,灰度传感器传输信息较慢,小车未能沿指定轨道行驶,导致实验失败,因此降速是必不可少的。缺点是本次实验所涉及到的功能模块较少,控制相对简单,在以后的实验过程中会渐趋完善的。

      在当今世界变革的大趋势中,机器取代人是显而易见的。在一些工厂,码头等需要货物运输的地方,由于人力成本上升,效率低,采用磁引导AGV小车替代人进行货物运输是必不可少的。所以磁导式AGV小车的研究会更加深入化,更加智能化。磁引导AGV小车的未来发展潜力无限。以后希望能在以下几个方面深入研究磁导式AGV小车:

      安装自动报警系统,节省处理故障所需要得时间。

      自动分析电量,不足时自动充电,节省人工。

      设置激光引导模块,使选定目的地变得简单。

      多台AGV协同合作,实现货物的自动装载,运输。

4. 示例程序

#include <Servo.h>

Servo myservo;
int pos;

void setup()
{
pinMode(16, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
myservo.attach(3);
myservo.write(150);
}

void loop()
{


int a = digitalRead(17);
int b = digitalRead(18);
int c = digitalRead(16);
if (b == HIGH)
{
if (a == HIGH && c == HIGH)
{
forward();
}
else if (a == HIGH && c == LOW)
{
turnleft();
}
else if (a == LOW && c == HIGH)
{
turnright();
}
else if (a == LOW && c == LOW)
{
stop();
delay(2000);
forward();
}
}
        if(b==LOW&&pos==150)
{
                open();
stop();
                delay(2000);
colse();
                if (a == HIGH && c == HIGH)
{
forward();
}
else if (a == HIGH && c == LOW)
{
turnleft();
}
else if (a == LOW && c == HIGH)
{
turnright();
}
else if (a == LOW && c == LOW)
{
stop();
delay(2000);
forward();
}
}  
         if (b == LOW && pos == 90)
{
if (a == HIGH && c == HIGH)
{
forward();
}
else if (a == HIGH && c == LOW)
{
turnleft();
}
else if (a == LOW && c == HIGH)
{
turnright();
}
else if (a == LOW && c == LOW)
{
stop();
delay(2000);
forward();
}
}
}

void turnright()
{
digitalWrite(9, HIGH);
digitalWrite(10, 0);
digitalWrite(5, 0);
digitalWrite(6, 0);


}
void turnleft()
{
digitalWrite(5, 0);
digitalWrite(6, HIGH);
digitalWrite(9, 0);
digitalWrite(10, 0);

}
void turnback()
{
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
}
void forward()
{
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);


}
void stop()
{
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
}

void open()//开
{
for (pos = 90; pos <= 150; pos += 10)
{
myservo.write(pos);
delay(15);
}
}

void colse()//抓
{
for (pos = 150; pos >= 90; pos -= 10)
{
myservo.write(pos);
delay(15);
}
}


* 本项目未获得作者开源授权,无法提供资料下载

© 2024 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用