宜昌老张

能避障的自主型乐高六足机器人

0
阅读(6967)

图1 能避障的六足机器人全景图

一、前言

      通常都是用一个智能小车来实现避障功能,网络上鲜有见到六足机器人也能避障。前面的文章《LabVIEW蓝牙控制乐高六足机器人》讲解了,上位计算机如何通过SSC32路舵机控制板来控制12台舵机,让六足机器人前、后、左、右行走。实际上,DFRobot公司的这款舵机控制板不仅可以控制各个舵机协调运行,而且还可以采集模拟和数字传感器检测的信息,并上传到上位机处理。这样,上位机就能从舵机控制板获取某个测距传感器的信息,然后制定一个避障算法,并生成舵机驱动输出,让机器人遇到障碍物时,可以躲避并另寻路线。

《LabVIEW蓝牙控制乐高六足机器人》文章网址:

http://blog.chinaaet.com/detail/32097.html

视频网址:http://player.youku.com/player.php/sid/XNTMzNTY2OTUy/v.swf


二、六足机器人的机械组成    

    这个六足机器人的驱动电机是辉盛9克mini舵机,它并不是乐高公司出品的电机,所以如何把mini舵机安装到乐高积木上,而且要做到舵机输出轴与支撑它的乐高积木孔之间距离,在X和Y轴两个方向上,都为乐高孔距的整数倍(乐高标准孔距为8mm)。这就需要自制一个专门适合乐高积木的舵机连接板。如图2的a画面所示。

   现在淘宝上已经有这样的连接板,可以买到,大家不妨看看,

http://ardu.taobao.com/search.htm?spm=a1z10.3.w588618719.6.mOQA4c&scid=626612911&scname=wNa43w%3D%3D&checkedRange=true&queryType=cat

    哪位高手也可以自己花精力用雕刻机做几个,当然安装孔的间距和配合精度要做到位才行。

    有了专门的舵机连接板,不用任何机械加工,甚至不需要螺钉螺帽连接,仅用乐高积木,按照图2所示步骤,就可以搭建出这个六足机器人了。该机器人左右两侧各分布三条腿,每条腿由两个舵机控制,这两个舵机分别起着大腿关节和小腿关节的作用。

图2六足机器人的安装步骤图

    这个专门适配乐高的舵机连接板的应用是Arduino电控与乐高机械积木结合的一种捷径。由于舵机分为两类,180度角度舵机和360度旋转舵机,所以这样的应用既可以做出类似六足、机械臂这样的模型,也可以做出如三轮智能车和光感晾衣架等作品。

 

三、六足机器人的电控组成

    控制这个机器人12个mini舵机的是DFRobot公司出品的USB SSC32舵机控制板,该控制板的各端口分布和功能说明图如下。


图3  32路舵机控制板的端口分布和功能说明

    六足机器人左侧6个舵机的输出端子分别插接在控制板的1到6舵机通道,而右侧6个舵机插接在17到22舵机通道。控制板的通信波特率,我设置为9600b/s,通过图4所示的拨码开关来设置,把1开关都拨到ON端,把2开关都拨到另一端,即可。

图4 SSC32舵机控制板波特率的设置

    舵机控制板与Arduino控制器的通信采用蓝牙模式,在如图3所示控制板的 “16数传接口”上插入蓝牙模块,它的波特率设置为9600b/s,并采用从机通信模式。同时,在Arduino控制器主机的无线数传接口上插入另一个蓝牙模块,这个模块的波特率也设为9600b/s,通信采用主机模式。蓝牙模块采用的是由DFRobot公司出品的一对DF-BluetoothV3模块。

该模块的说明书网址:

http://wiki.dfrobot.com.cn/index.php/DF-BluetoothV3%E8%93%9D%E7%89%99%E4%B8%B2%E5%8F%A3%E6%A8%A1%E5%9D%97%E5%8F%AF%E6%94%B9%E4%B8%BB%E4%BB%8E%E6%9C%BA_(SKU:TEL0026)

    图3中标号为1、8、10和12的端口都可以供电,1号和10号是逻辑部分供电端口,8号和12号端口是舵机部分供电端口。逻辑部分和舵机部分分别单独供电,我用一块9V方块电池供电给逻辑部分,用另一块7.4V、900ma的锂聚合物电池供电给舵机部分。于是“11 VL和VS1连通跳线”帽要断开!同时“2 USB供电选择跳线”帽不插上,断开,不采用电脑USB供电。这两套电源配置如图5所示。

图5 SSC32舵机控制板供电电池配置

    值得注意的是,7.4V锂电池不能直接连在控制板上给舵机供电,因为mini舵机的供电电压不能超过6V,否则会出现异常噪音,不能正常工作,所以锂电池要接上一个电压调节器(Voltage Regulator)才能给舵机供电。我用的这个电压调节器的型号为好盈牌UBEC-3A,如图6所示,它的输入电压为5.5~26V,输出电压为5V或6V(可用跳线帽切换),额定电流为3A,最大电流6A。7.4V锂电池加上好盈UBEC-3A电压调节器的组合能达到给12路舵机供电的要求。

图6好盈牌UBEC-3A电压调节器

    图6所示好盈牌UBEC-3A电压调节器的输入和输出端子要进行改造,以适应锂电池连接,所以它的输入端加装了JST 2P母头连接线。另外把它输出端原有的3P黑色杜邦公头端子剪断,并用剥线钳拨出导体,以方便接到图3所示8号或12号舵机部分供电端口。 


四、Arduino控制器主机程序设计

    SSC32舵机控制板可以看成一个输入输出接口板,它自己并没有程序思考能力,它把大脑交给远端计算能力更强的上位计算机,这次实验的上位主机是Arduino UNO控制器。Arduino控制器与SSC32舵机控制板,通过蓝牙无线通讯形成了主从机运行模式,如图1所示。舵机控制板不仅同时能控制多达32路的伺服电机,它还具有4个数字和模拟输入接口,可以接5V电压的传感器,这样就能实现带反馈的闭环控制,让多舵机设备,比如这个六足机器人,可以根据周边环境变化,做出相应的动作反映。

   图7中,我用红色方框标注了A、B、C、D这四个数字输入或模拟输入接口的位置。

图7 SSC 32舵机控制板

     A,B,C,D做模拟口时,禁止内部上拉,同时开启数字滤波功能以减噪,滤波后只读取端口电压8ms内变化量的最终值,返回“0”表示0V,返回“255”表示4.98V。返回值=(输入电压*256)/5。

舵机控制板上电初始,A,B,C,D接口将配置为数字输入并有内部上拉,第一次使用“VA VB VC VD <cr>”命令后,会配置为模拟输入并禁止内部上拉,在设置为模拟输入后的第一个返回值是无效字节。

    我在下面Arduino初始化程序段中,用了三条指令把A,B,C,D端口设置为模拟输入模式。

             Serial.println("VA VB VC VD");//把A、B、C、D端子设置为模拟量输入模式

               delay(100);//延时,等待命令发送成功

               //读取返回值,该值为“Serial.println("VA VB VC VD");”命令执行后的无效返回值

               val=Serial.read();

     这个具有避障功能的六足机器人模型采用了sharp公司的GP2Y0A21红外测距传感器,该传感器测距范围为10cm~80cm。它的输出线有三根,分别为模拟信号线、VCC线和GND线,我把它们分别连在了舵机控制板的D端子、+端子和-端子上。下面两张图为传感器与舵机控制板连线图和蓝牙模块加装图。

图8 GP2Y0A21传感器与舵机控制板连线图

图9蓝牙模块加装示意图

    上位计算机给舵机控制板下达模拟输入读取命令,例如:发送VA VB <cr>命令后,A、B模拟传感器将会向上位机返回2个字节,比如A模拟输入为2V,B输入为3.5V,那么返回值为102(二进制)和179(二进制)。

      如果用Arduino控制器作为主机,向舵机控制板的D模拟输入端口发送读命令,这个命令函数应为“Serial.println("VD");”,发出命令后,舵机控制板从机则返回一个字节数据,对这个数据做一个距离值转换算法,这个算法是“2547.8/((float)val*4*0.49-10.41)-0.42”,得出的结果就为六足机器人与前方障碍物有多少cm。有了距离值,Arduino控制器就可以进一步编制避障逻辑,该逻辑是如果机器人距离障碍物小于20cm,则Arduino下达后退命令“Serial.println("PL 0 SQ 1");”,后退4秒后,下达转弯命令“Serial.println("PL 0 SQ 3");”或“Serial.println("PL 0 SQ 2");”,右转或者左转6秒后,再执行前进命令“Serial.println("PL 0 SQ 0");”,于是机器人前行,直到又遇到障碍物,再重复执行上述避障动作。实现上述逻辑的Arduino程序如下。

/*Arduino控制器的任务:接受舵机控制板上红外测距传感器的采集数据,

并把此数据转换为距离值。如果六足机器人距离前方障碍物小于20cm,

则机器人后退、转弯,再前进,直到它又遇到障碍物,再重复执行避障动作。*/

int val;   //定义变量,用于读取传感器上传的采集数据

float distance_float;//定义变量,用于存放距离转换值

int randNumber;  //定义随机数变量

//初始化

void setup()

  Serial.begin(9600);//启动串口通信,波特率为9600b/s

  delay(10);//延时,等待波特率设置成功

  Serial.println("VA VB VC VD");//把A、B、C、D接口设置为模拟量输入模式

  delay(100);//延时,等待命令发送成功

  //读取返回值,该值为“Serial.println("VA VB VC VD");”命令执行后的无效返回值

val=Serial.read();

  Serial.println("PL 0 SQ 0"); //机器人前进

  delay(100);//延时,等待命令发送成功     

}

//主程序

void loop()

{

   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"); //机器人后退

           delay(4000);//后退,4s

           randNumber = random(10);

           //机器人随机向左或者向右转动,6s

           if(randNumber<5)

           {

             Serial.println("PL 0 SQ 3"); //向右转动,6s

             delay(6000);

           }

           else

           {

             Serial.println("PL 0 SQ 2"); //向左转动,6s

             delay(6000);

           }

          Serial.println("PL 0 SQ 0"); //机器人前进   

          delay(100);//延时,等待命令发送成功          

          Serial.flush();//清除Arduino控制器串口输入缓冲器的数据

                    //此函数在Arduino 1.0之前的版本适用

      }      

   }

 }

    值得注意的是上面程序中“Serial.flush();”函数必须加入,这也是实践中得来的经验。在主程序void loop()中,每次下达给舵机控制板的模拟量读取命令“Serial.println("VD");”之前,要清除Arduino控制器串口输入缓冲器的数据,这样才能保证Arduino串口读命令“Serial.read()”取出来的字节数据是当前“Serial.println("VD");”命令的返回值。“Serial.flush();”函数只有Arduino 1.0之前的版本才能够清除Arduino控制器串口输入缓冲器的数据,如果是Arduino 1.0版本,这个函数功能已发生了改变,所以你必须采用如Arduino 0022版本,来下载上述程序。 


五、结束语 

    传统机器往往只有一两台定速电机,然后通过齿轮齿条、蜗轮蜗杆等复杂的传动机构,把动力分配和变速到多个执行部件。而现代机器往往配备了多台伺服电机,这些电机直接连接到执行部件,让各执行部件按照规划好的路线、速度和力量运行。控制这些伺服电机的就是智能控制器中的软件,软件起到了传统机器中的那些传动链和变速箱的作用,而且运行起来还更可靠。我的这个六足机器人就很好地体现了现代机器的特点,没有传动链,利用软件和多伺服电机直接控制着机器的各部件协调地运行。