第三届开源硬件开发大赛优秀作品 低成本打造booby家庭服务机器人
2016-03-31 17:04:45我是大二的学生,偶然间接触了arduino,从此一发不可收拾,做过激光雕刻机、智能小车等有意思的东西。大一下半学期的暑假是一个很好的机会,能够深入学习arduino,于是我决定设计制作一种家庭服务机器人,恰逢arduino中文社区举办了开源硬件开发大赛,我便报名参加了比赛。这款机器人的灵感来源于《机器人总动员》中的瓦力,作为家庭服务机器人,初步决定加入履带底盘、可夹持机械手、视频传输、语音识别与交流、短信报警、led点阵眼睛等功能。
履带底盘的设计
驱动采用履带传动,我比较了网上的各种玩具履带配件,发现普遍价格偏高且材质较脆,不适合大动力的驱动,于是采用了二手的汽车正时皮带作为履带,后来测试发现同步带作为履带行走起来十分稳定。
主动力为两个蜗轮蜗杆减速电机,动力十足,而且由于蜗轮、蜗杆自锁的特性,即使是45°斜坡也不会滑下,可以适应多种特殊路况,甚至是石子路等复杂路况。电机驱动板(见图2)采用继电器控制,因为普通的mos管组成的h桥驱动电路输出电流太小且发热较严重,无法满足底盘的驱动要求,故采用继电器控制电路控制电机,每一路信号都做光耦隔离,同时成本低、易维护。
机械臂的设计
为了实现抓取物品和动作交互娱乐等功能,我们制作了一种类似于桌面码垛机器人的机械手,采用舵机作为动力来源,使用arduino进行控制。画好三维图纸,导出二维图纸,先用廉价的木板切了一套(见图3)验证效果,发现效果很好,于是换用亚克力板加工,一左一右共两只,镜像安装。对于机械臂的远程控制,采用2.4ghz无线控制,使用nrf2401模块传输数据。为了更方便控制机械臂,我制作了一个同步摇杆来控制机械手(见图4),这个摇杆就是缩小版的机械手,只是舵机的位置换成了电位器,其他的连杆结构的比例与机械臂基本相同,这样操控起来就比较简单。
机械臂测试程序
#include <servo.h>
#include <eeprom.h>
servo servo1;
servo
servo2;
servo servo3;
byte angle1;
byte angle2;
byte angle3;
int buffer1[3];
int rec_flag;
int serial_data;
int uartcount;
unsignedlong pretime;
unsignedlong nowtime;
unsignedlong costtime;
void
setup() {
serial.begin(9600);
servo1.attach(9);
servo2.attach(10);
servo3.attach(11);
angle1=eeprom.read(0x01);
angle2=eeprom.read(0x02);
angle3=eeprom.read(0x03);
servo1.write(angle1);
servo2.write(angle2);
servo3.write(angle3);
}
void
loop()
{
while(1)
{
get_uartdata(); //读取串口数据
//uarttimeoutcheck();
}
}
void
communication_decode()
{
if(buffer1[0]==0x01)//舵机命令
{
if(buffer1[2]>180)return;
switch(buffer1[1])
{
case
0x07:angle1=buffer1[2];servo1.write(angle1);return;
case
0x08:angle2=buffer1[2];servo2.write(angle2);return;
case
0x09:angle3=buffer1[2];servo2.write(angle2);return;
default:return;
}
}
elseif(buffer1[0]==0x32)//保存命令
{
eeprom.write(0x01,angle1);
eeprom.write(0x02,angle2);
eeprom.write(0x03,angle3);
return;
}
}
void
get_uartdata()
{
staticint i;
if(serial.available()>0)
{
serial_data=serial.read();
if(rec_flag==0)
{
if(serial_data==0xff)//ff000100ff
{
rec_flag=1;
i=0;
}
}
else
{
if(serial_data==0xff)
{
rec_flag=0;
if(i==3)
{
communication_decode();
}
i=0;
}
else
{
buffer1=serial_data;
i ;
}
}
}
}
(未完。全文见《无线电》杂志2016年第3期)