前面有文章分别介绍了这个乐高六足机器人遥控和自控,遥控六足机器人的文章《五按钮模块遥控乐高六足机器人》,网址:http://www.eefocus.com/zhang700309/blog/13-04/292704_6a238.html。自控六足机器人的文章《能避障的自主型乐高六足机器人》,网址:http://www.eefocus.com/zhang700309/blog/13-04/293086_db4a7.html。
这篇文章的项目把遥控和自控集成在一套程序里完成。采用DFRobot公司的游戏杆模块作为遥控器,不仅实现遥控六足机器人前后左右行走,而且通过它切换机器人遥控和自控两种模式,自控模式是躲避障碍物,自主寻找行走路径。
实验视频:

图2游戏杆模块、Arduino控制器和蓝牙模块的安装图
游戏杆模块采用叠层设计,可以轻松的插接到DFRobot公司的Arduino Duemilanove或Arduino UNO上。预留DF-Bluetooth V3蓝牙模块和APC220数传模块的接口,能方便地的实现无线遥控功能。
该遥控器具体操作如下:按下游戏杆模块上的红色按钮,机器人接受遥控器的控制命令,可以被指使前进、后退、左转和右转;按下蓝色按钮,机器人切换为自主行走模式,它遇到障碍物时,先向后避闪,然后向左或向右转身,再向前搜寻可以行走的道路。游戏杆模块上的PS摇杆前后左右遥控,相应控制机器人四个方向上的动作。PS摇杆按钮向下每按动一次,可以使机器人从高速向低速或者从低速向高速切换一次,改变机器人行走速度。
按照上述操作逻辑,我编写了下面的程序。
Arduino程序:
int JoyStick_X = 1; //游戏杆扩展板的PS摇杆X轴连在模拟端口1
int JoyStick_Y = 0; //游戏杆扩展板的PS摇杆Y轴连在模拟端口0
int button_JoyStick = 5; //游戏杆扩展板的摇杆A按键连在数字端口5
int button_Grab =3; //红色B按键连在数字端口3
int button_Release =4; //蓝色C按键连在数字端口4
//A按键控制机器人遥控模式下的高速与低速的切换
//B按键用来把机器人运行模式切换为遥控模式
//C按键用来把机器人运行模式切换为自控模式
int A, B,C;//定义游戏杆扩展板的开关量按键的当前状态
int x,y; //定义游戏杆扩展板的PS摇杆X,Y轴的当前模拟量值
int old_A;//定义A、B、C按键在上一个程序循环执行时的状态
int old_B;
int old_C;
int state=0;//定义A按键控制的机器人行走速度的切换标志,并初始化为低速
//定义PS摇杆在上一个程序循环结束时的状态,并初始化为摇杆居中状态
char old_flag='n';
char flag;//定义PS摇杆的当前状态,
char manual_auto='m';//定义机器人的运行模式,初始化为遥控模式
int val; //定义变量,用于读取机器人的红外测距传感器上传的采集数据
float distance_float;//定义变量,用于存放由采集值算式转换后的距离值
int randNumber; //定义随机数变量,以决定机器人是左转还是右转
//初始化
void setup()
{
//把游戏杆扩展板上三个按键设置为开关量输入模式
pinMode(button_JoyStick, INPUT);
pinMode(button_Grab, INPUT);
pinMode(button_Release, INPUT);
//启动串行通信
Serial.begin(9600);//设置串行通信的波特率
//把机器人的舵机控制板上A、B、C、D接口设置为模拟量输入模式
Serial.println("VA VB VC VD");
delay(20);//延时,等待命令发送成功
//读取返回值,该值为“Serial.println("VA VB VC VD");”命令执行后的无效返回值
val=Serial.read();
}
//主程序
void loop()
{
x=analogRead(JoyStick_X);//读取PS摇杆X轴的模拟量信息
y=analogRead(JoyStick_Y);//读取PS摇杆Y轴的模拟量信息
//读取游戏杆扩展板上三个按键“是否按下”的状态
B= digitalRead(button_Grab);
C= digitalRead(button_Release);
A=digitalRead(button_JoyStick);
//如果PS摇杆Y轴向前摇动
if(y<212)
{
//设置PS摇杆状态标志为'a'
flag='a';
}
//如果PS摇杆Y轴向后摇动
else if(y>812)
{
//设置PS摇杆状态标志为'b'
flag='b';
}
//如果PS摇杆X轴向左摇动
else if(x>812)
{
//设置PS摇杆状态标志为'c'
flag='c';
}
//如果PS摇杆X轴向右摇动
else if(x<212)
{
//设置PS摇杆状态标志为'd'
flag='d';
}
//如果B按键按下,执行一次其结构体里的命令
else if((B ==LOW)&&(old_B==HIGH))
{
manual_auto='m'; //设置机器人运行模式为遥控模式
Serial.println("PL 0"); //机器人停止
delay(20);//延时,等待命令发送成功
}
//如果C按键按下,执行一次其结构体里的命令
else if((C==LOW)&&(old_C==HIGH))
{
manual_auto='a';//设置机器人运行模式为自控模式
Serial.println("PL 0 SQ 0 SM 100"); //机器人前进
delay(20);//延时,等待命令发送成功
}
//如果A按键按下,执行一次其结构体里的命令
else if((A==LOW)&&(old_A==HIGH))
{
delay(20);
state=1-state;//每按一次按钮,机器人高速与低速状态标志之间切换一次
}
//否则,PS摇杆居中
else
{flag='n'; //设置PS摇杆状态标志为'n'
}
//把处理后的开关按钮状态赋值给old变量,这样可以做到
//每次按下按钮仅执行一次结构体里的命令。
old_A=A;
old_B=B;
old_C=C;
delay(20);//延时
//根据PS摇杆和开关按钮动作后生成的标志,完成相应任务
//如果机器人运行模式为遥控模式
if(manual_auto=='m')
{
//如果PS摇杆状态发生改变,结构体命令仅执行一次
if(old_flag!=flag)
{
//如果PS摇杆Y轴向前摇动
if(flag=='a')
{
//如果机器人速度标志为高速状态
if(state==1)
{ Serial.println("PL 0 SQ 0 SM 150");//发送机器人高速前进命令
delay(20);//延时
}
//如果机器人速度标志为低速状态
if(state==0)
{ Serial.println("PL 0 SQ 0 SM 100");//发送机器人低速前进命令
delay(20);//延时
}
old_flag='a';
}
//如果PS摇杆Y轴向后摇动
if(flag=='b')
{
if(state==1)
{ Serial.println("PL 0 SQ 1 SM 150");//发送机器人高速后退命令
delay(20);//延时
}
if(state==0)
{ Serial.println("PL 0 SQ 1 SM 100");//发送机器人低速后退命令
delay(20);//延时
}
old_flag='b';
}
//如果PS摇杆X轴向左摇动
if(flag=='c')
{
if(state==1)
{ Serial.println("PL 0 SQ 2 SM 200");//发送机器人高速左转命令
delay(20);//延时
}
if(state==0)
{ Serial.println("PL 0 SQ 2 SM 100");//发送机器人低速左转命令
delay(20);//延时
}
old_flag='c';
}
//如果PS摇杆X轴向右摇动
if(flag=='d')
{
if(state==1)
{ Serial.println("PL 0 SQ 3 SM 200");//发送机器人高速右转命令
delay(20);//延时
}
if(state==0)
{ Serial.println("PL 0 SQ 3 SM 100");//发送机器人低速右转命令
delay(20);//延时
}
old_flag='d';
}
//如果PS摇杆居中
if(flag=='n')
{Serial.println("PL 0");//发送机器人停止命令
delay(20);//延时
old_flag='n';
}
}
}
//如果机器人运行模式为自控模式
if(manual_auto=='a')
{
Serial.println("VD"); //向舵机控制板发送读取传感器采集数据的命令
delay(100);//延时,等待命令发送成功
if(Serial.available()>0) //查询Arduino控制器串口有无数据
{
val=Serial.read();//读取舵机控制板上传的传感器采集数据
//把采集数据0~255转换为距离值
distance_float=2547.8/((float)val*4*0.49-10.41)-0.42;
//如果六足机器人距离障碍物小于20cm
if(distance_float<=20 && distance_float>0)
{
Serial.println("PL 0 SQ 1 SM 100"); //发送机器人后退命令
delay(2500);//后退,2.5s
randNumber = random(10);
//机器人随机向左或者向右转动,6s
if(randNumber<5)
{
Serial.println("PL 0 SQ 3 SM 200"); //发送向右转动命令
delay(3000);//右转3s
}
else
{
Serial.println("PL 0 SQ 2 SM 200"); //发送向左转动命令
delay(3000);//左转3s
}
Serial.println("PL 0 SQ 0 SM 100"); //发送机器人前进命令
delay(20);//延时,等待命令发送成功
Serial.flush();//清除Arduino控制器串口输入缓冲器的数据
//此函数在Arduino 1.0之前的版本适用
}
}
}
}
由于这个项目程序用到前面两个文章中编写的程序,所以整个编制下来,发现程序还蛮长。我并不能确定,如果一开始就做这个项目,是否能顺利完成,当然按照我的习惯也不会那样,我喜欢一步步来,自然会水到渠成。
2013年4月8日,中央电视台《经济半小时》特别策划之“机器人抢了谁的工作”正式在央视二套播出,本期节目以中国机器人产业发展现况为背景,以客观的视角完整的解读了一场以机器人为核心的新型工业革命的到来。节目开始以南方某工厂通过引进工业机器人代替传统工人,从而实现生产效率的成倍增长为主线,通过对比机器人与普通工人在生产效率、投入产出比、保证产品质量等方面的优势,详细分析企业通过使用机器人所带来的潜在发展机遇。
视频网址请点击:
http://bugu.cntv.cn/news/finance/jingjibanxiaoshi/classpage/video/20130408/101308.shtml。
为更好的体现出中国机器人产业发展状况,节目组一行来到了中国最大的机器人产业化基地——新松机器人自动化股份有限公司。作为中国工业机器人在应用领域的教父级人物,新松公司总裁曲道奎预言到:“中国的机器人市场,应该离井喷式的发展不远了”。他归纳了中国机器人井喷的三大依据——1. 中国是全球最大的工业生产国,市场对于机器人有着巨大的需求。2. 中国劳动力价格快速上升,企业为降低成本,不得不使用机器人。3.中国机器人几乎是零起步,未来成长性非常大。
从节目中看,中国机器人产业正处于大发展的前夜,将来几年,机器人技术会井喷式地应用到制造业的方方面面。而另一方面,大学生就业难越来越是问题,而机器人产业从设计、制造、到安装和维护都需要大量相关人才。在校大学生和职场新人应该看到这一机会,而且应该为此做些准备。单纯靠阅读陈旧教科书和参加各类考试,是不能完全解决对机器人技术的学习和掌握的,所以在没有公司现场实习的条件下,可以考虑边学习边动手,做一些机器人模型,来磨练自己的能力,这样可以使您进入相关行业后,能快速地适应具体的工作。