宜昌老张

乐高8275科技套件B模型的Arduino电控改造(双单片机蓝牙通信)

0
阅读(8469)

  

图1 Arduino全电控的乐高机械手车全景图   

乐高迷们达到一定的搭建水平后,总是不满足于照着详细的套件SET搭建图纸制作模型,而是想办法改装些自己原创的作品,其中把原先静态的模型加上乐高Technic或者NXT电机,让模型动起来,是作品改装一个重要项目。按照类似的思路,这次我来用全套Arduino设备改装乐高8275科技套件的B模型,把它原先的Technic电控拆下来,换上Arduino控制器360°旋转舵机、游戏杆扩展板和蓝牙模块,改装了一个蓝牙遥控,舵机驱动的机械手小车。

Arduino全电控下的乐高机械手车工作视频:

一、机械部分的改装

    原先的乐高8275科技套件B模型由两个科技系列XL-Motor电机带动小车的左右轮子前后左右行走,一个M-Motor电机正转或者反转,带动机械手抓取或松开物体。小车的后部一左一右安装了两个红外IR接收器,两个XL-Motor电机连接在左边的接收器上,控制机械手的那个M-Motor电机连在右边的IR接收器上。IR接收器接受IR遥控器控制信号,IR遥控器和IR接收器都有对应的四个通道,分别有一个小拨码开关来切换通道,左接收器设置为1通道状态,右接收器设置为4通道状态,一个IR遥控器通过切换通道1或者4来控制连在左右IR接受器的三个电机,遥控器上还有两个摇杆,上下遥动可以控制电机的正反转,于是通过红外遥控接受的方法,8275科技套件B模型机械手车在电机的带动下,可以完成小车前后左右行走,定位物体,并抓取物体的动作。看下面图片和视频。

图2 乐高8275科技套件B模型全景图

  乐高8275科技套件B模型搭建图纸请下载:http://115.com/file/anp9cupm#InspirationModel.pdf

乐高8275科技套件B模型工作视频:

     这次我用标准舵机替换下了乐高Technic电机。对于标准舵机的安装,我曾经直接用乐高机械零件来连接固定,这种方法虽然可以把舵机固定在乐高零件上,但是,如图3所示,舵机的输出轴在X、Y两个方向上都与固定它机身的乐高零件差了半个孔距(乐高孔距为8mm)。可以用皮筋、链条和万向节零件去补偿这半个孔距的错位,但是这样会加长传动链,给改装增加难度。

图3 用乐高零件直接固定标准舵机

  有没有专门适应乐高零件的舵机安装板,使舵机输出轴与乐高零件孔位在X和Y轴两个方向上都为孔距的整数倍。2011年刚有,是美国货,那就是mindsensors公司出品的标准舵机安装板Hitec Standard Servo Mounting kit for NXT ,网址:http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=117&MMN_position=41:41

图4 mindsensors公司出品的标准舵机安装板

     这个标准舵机安装板可以先通过信用卡或者银联借记卡注册一个Paypal账户,再采用Paypal账户支付,在Mindsensors公司网站购买得到。Paypal为Ebay公司所有,有点像支付宝,可以用来海淘。网址:https://www.paypal-biz.com/如果要海淘,建议注册时,把姓名、地址全用拼音填写,同时邮箱和手机(不要加区号)必须填写精确。标准舵机安装板套装一套含四个安装板。如果嫌麻烦,或者实在不会搞这些时髦的事,可以到该淘宝店咨询店主购买,网址:http://vooheese.taobao.com/search.htm?scid=512073371&scname=TWluZHNlbnNvcg%3D%3D&checkedRange=true&queryType=cat我为啥要介绍这个板子的购买,当然我写博客不仅自己翻看,读者也可以分享,如果没这个东西,这篇博客文章的参考价值就不大了。当然哪位高手也可以自己用雕刻机做几个,当然尺寸和安装孔的配合精度要做到位才行。

图5 Mindsensors公司舵机安装板与标准舵机的安装示意图

    以前没有细究舵机零件袋子里的那些橡胶垫和小铜帽有什么用,我总是另外用螺钉螺帽来固定舵机的,看了Mindsensors公司的舵机安装板说明,我显然知道了,把橡胶垫从舵机耳座孔缺口处挤进去,再把小铜帽插到橡胶垫的孔里,舵机安装版从舵机机身底座穿到它的耳座下面,最后用四个自攻螺钉通过小铜帽的孔,把舵机紧固在安装板上。

图6 利用mindsensors公司舵机安装板实现舵机与乐高零件的结合

    有了Mindsensors公司的标准舵机安装板,乐高零件就可以轻易地安装在舵机安装板上,这样舵机机身上就附加上了乐高零件,为以后舵机固定在乐高作品上,做好了准备。

  对于舵机输出轴附加乐高零件,我的方法是:由于乐高皮带轮零件与舵机零件袋里的圆盘连接板的孔正好可以对上,所以我用了两个自攻螺钉把它们连接起来,然后圆盘连接板插到舵机齿状输出轴上,再把乐高十字轴零件插到皮带轮零件的十字孔里,于是十字轴零件便成为了舵机的输出轴。看看图6所示,舵机输出轴与舵机机身上的乐高零件的孔位在X和Y轴方向都一致了吧!

     改装乐高科技套件的电控系统,建议最好先不要考虑改动传动链机构,也希望尽量减少变动传动机构的支撑部件结构。动手之前,要考虑好原来的乐高Technic电机“掏”出来后而腾出来的空间是否可以容纳下如图6所示舵机部件,会不会发生干涉,而且安装上去的舵机与原来的传动链结合后,会不会出现新的刚度不足问题。以下是三张改装过程图。

图7 电气系统改装图一

图7 电控系统改装图二

图9  电控系统改装图三

   从上面三张图可以看出,我并没有改动原来的传动链,但考虑到了舵机部件加入后产生的刚度不足问题。可以看到驱动左右车轮的舵机部件两侧都用插销零件固定了,舵机输出轴端原先有两个皮带轮零件,后来又加了两个,十字轴零件一端可以深深地插入四个皮带轮零件的十字孔里,这样它不会由于震动而松脱。十字轴的另一端穿过一个支撑孔,带动一对圆锥齿轮机构运转,这样不会出现悬臂梁问题,而且圆锥齿轮机构产生的分力,朝向十字轴轴向内侧,这些措施都会增强传动刚度。经常玩乐高科技系列作品制作的人,都知道由于乐高零件是工程塑料,有一定的让性,而且零件之间连接是通过插销固定,所以一定要考虑好机械结构的刚性,刚性不好就会出现齿轮打齿和零件松脱的现象。

图10 乐高8275科技套件B模型三维视图

  从图10,您可以看到,在机械手部分的传动链中有一个白色齿轮(又称摩擦轮),它不仅有齿轮的功能,而且它还具有离合器功能。当机械手遇到两端限位挡块时,它可以让电机与传动链脱开,电机轴空转,这样不仅可以防止由于电机过载而出现的闷车现象,而且可以使机械手不至于越程操作。

  机械手传动链设计得很是精妙,从电机出来是一对直齿轮机构,其中就有刚才说的那个特殊的白色齿轮,这个白色齿轮带动一个十字长轴转动,长轴的前端是蜗杆齿轮,与另一个蜗轮齿轮啮合,蜗轮齿轮又带动一系列连杆机构工作,最终使机械手的爪子完成规定动作。乐高工程师真了不起!他们在研发乐高套件时是如何设计的,比如:传动链是如何在车身中布局的,为什么各机构的先后顺序是这样安排的,传动链从车身后部一直延伸到前端爪子,机械手还能做到抓取和提升物体一气呵成。所以通过乐高积木的搭建是可以学习到很多机械学知识的,而且可以锻炼自己机构设计的能力。

    我们不能仅把乐高积木当作老少皆宜的玩具,它完全可以是一个很好的机电一体化实验平台和原型产品的开发工具。

二、Arduino电气系统的应用

   这个蓝牙遥控乐高机械手车作品,用到了两个Arduino控制器,一个作为遥控器主机,一个作为接收器从机,两者之间采用无线蓝牙通信。所用到的一对蓝牙模块是DFRobot公司出品的Bluetooth V3模块,上一篇文章介绍了利用这个蓝牙模块实现PC机与Arduino单片微机蓝牙通信的方法,

《基于Labview与Arduino的上下位机的蓝牙通信实验》

网址:http://blog.chinaaet.com/detail/28557.html

DFRobot中国官网:http://goo.gl/g4oQB

   这篇文章借助Arduino全电控机械手车作品,再来介绍一下双Arduino单片微机的蓝牙通信方法。看下图,两个蓝牙模块分别层叠在两个Arduino控制器上,配对使用时必须是一主一从。

图11  双Arduino单片微机的蓝牙通信示意图   

   DF-Bluetooth V3蓝牙模块上有一个两位拨码开关,如图12所示,1号开关LED Off是LINK灯的开关,可以关闭LINK省电,拨到ON为开,拨到1端为关;2号开关AT Mode是AT命令模式开关,拨到ON进入AT命令模式,拨到2端退出AT命令模式。应该使用AT指令给模块进行主从机模式或者其他参数设置,这时,AT命令模式开关和LINK灯的开关都要拨到ON。

图12 DF-Bluetooth V3蓝牙模块的AT命令模式选择

   通过串口助手软件发送AT命令设置蓝牙模块参数时,需要用到USB to Serial模块,该模块的功能是将TTL串口转换为USB接口,如图13所示。先将蓝牙模块插到USB to Serial模块上,再插到PC机USB插座里。当然事先,USB to Serial模块需要安装驱动程序。 USB to Serial模块驱动程序地址:http://www.willar.com/upload/shop/CP210x_Drivers.rar,也可以直接下载:http://115.com/file/bes5w3nl#CP210x-VCP-W...K-XP-S2K3.rar

图13 USB to Serial模块与蓝牙模块的插接方法

   安装好驱动程序后,将2号开关AT Mode拨到ON端,再插到电脑USB接口上,在Windows操作系统的设备管理器里,可以看到自动生成的串口号是什么,不同电脑产生的串口号可能不同,您就用自己操作时生成的串口号。

图14 USB to Serial模块生成的串口号

  接着打开SSCOM3.2串口助手,选择USB to Serial模块对应的COM口(我选择的是我刚刚生成的串口号COM3),设置波特率为38400,在发送行(字符串输入框)输入各AT命令进行参数设置。可以仔细看看官方说明。

   DF-Bluetooth V3蓝牙模块官方说明书网址:DF-Bluetooth V3蓝牙模块说明书请下载:115.com/file/dpaszp4n#DF-BluetoothV3.pdf

   实际上只要修改两个参数即可,首先输入双引号里的内容,即”AT+CMODE=1”,其中1含义是任意蓝牙地址连接模式 (不受绑定指令设置地址的约束)。把两个蓝牙模块的CMODE参数都设置为1,可以用“AT+CMODE?”来核实参数是否设置对了,当然也可以不核实,肯定是对的。由于蓝牙模块默认为从机模式,所以只拿出一个蓝牙模块把它设置为主机模式,在发送行输入“AT+ROLE=1”,其中1含义是模块为主角色。其他参数直接用默认参数,请记住蓝牙模块的默认波特率为9600b/s。

串口助手软件SSCOM3.2请下载:http://115.com/file/c2iez7hp#sscom32.zip


图15 用SSCOM3.2串口助手软件设置蓝牙模块参数

 主从成对使用时,不需要驱动程序,也不需要配对密码,两个模块上电就能传输。 模块上的STATE灯频闪状态时表示正在配对,LINK灯常亮表示配对完毕,此时串口功能已经启动。 一主一从成对正常使用时,LINK灯不会灭。如主机和从机距离太远而断线,则主机和从机的灯一直闪,如果它们距离再靠近,则又会找在一起而自动连上。主机会记忆它配好的从机,一上电,主机就会找它记忆的从机地址。通过串口助手,一次设置好参数后,以后两个模块会自动无线虚拟串口联机,您就把它们当作有线串口联机,用熟悉的RS232通信协议,编制两个Arduino单片微机的通信程序即可。

    另外还有两点需要注意,一是当USB to Serial模块从电脑的USB插座里拔出前,要在SSCOM3.2串口助手软件里,点击"关闭串口"按钮,否则USB to Serial模块串口资源会继续占用,如果USB to Serial模块再要插到电脑,就不能使用这个串口了;二是在双Arduino单片机蓝牙通信前,要把两个蓝牙模块上的2号AT Mode开关拨到2端,退出AT命令模式

   这个 Arduino全电控机械手车作品,另一个新用到的电控设备就是DFRobot公司出品的JoyStick Input Shield游戏杆扩展板。游戏杆扩展板上有一个PS摇杆和两个大拇指按钮。PS摇杆占用Arduino控制器的模拟端口pin0(Y轴)和pin1(X轴),PS摇杆不仅可以X、Y轴两个方向摇动,而且可以按动它,作为一个按钮,游戏杆扩展板标称这个按钮为A按钮,另外两个大拇指按钮,红色的是B按钮,蓝色的是C按钮。A按钮占用Arduino控制器的数字端口pin5,B按钮占用数字端口pin3,C按钮占用数字端口pin4。

   游戏杆扩展板采用叠层设计,可以轻松的插接到DFRobot公司的Arduino Duemilanove或Arduino UNO上。预留DF-Bluetooth V3蓝牙模块和APC220数传模块的接口,能方便地的实现无线遥控功能。

图16 DFRobt公司的游戏杆扩展板

 

三、Arduino软件程序的编制
 

  主机遥控器和机械手车上的从机接收器都要编写程序。程序部分由于有详细的注释,就不累述了。注意:向Arduino控制器“写”程序前,先把蓝牙模块从控制器的TTL串行接口上拔下来,否则程序无法“写”入,“写”完程序后,再插上蓝牙模块。

   主机遥控器程序任务:采集游戏杆扩展板上的PS摇杆信息,处理后,通过蓝牙串口,向从机遥控车发送单字符命令,这些命令分别控制小车的前后左右行走、机械手抓取或松开物体以及调节小车行走的速度。
 
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按键上一个循环程序执行时的读取值
int state=1;//存储A按键控制的小车速度切换标志,并初始化标志为1
char flag;//存储主机向从机发送的单“字符”命令
//初始化
void setup()
{
  //把游戏杆扩展板上三个按键设置为开关量输入模式
  pinMode(button_JoyStick, INPUT);
  pinMode(button_Grab, INPUT); 
  pinMode(button_Release, INPUT);
  //启动串行通信
  Serial.begin(9600);//设置串行通信的波特率
}
//主程序
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>812)
    {
       //向从机遥控车发送小车前进命令
       flag='a';
       Serial.print(flag);
    }
    //如果PS摇杆Y轴向后摇动
    else if(y<212)
    {
       //向从机遥控车发送小车后退命令
       flag='b';
       Serial.print(flag);
    }
    //如果PS摇杆X轴向左摇动
    else if(x>812)
    {
       //向从机遥控车发送小车向左命令
       flag='c';
       Serial.print(flag);
    }
    //如果PS摇杆X轴向右摇动 
    else if(x<212)
    {
       //向从机遥控车发送小车向右命令
       flag='d';
       Serial.print(flag);
    }    
    //如果机械手B按键为按下状态,同时C按键为松开状态
    else if((B ==LOW)&&(C==HIGH))
    {
      //向从机遥控车发送机械手“抓取”物体命令
      flag='e';
      Serial.print(flag);
    }
    //如果机械手C按键为按下状态,同时B按键为松开状态
   else if((C==LOW)&&(B==HIGH))
    { 
      //向从机遥控车发送机械手“松开”物体命令
      flag='f';
      Serial.print(flag);
    }
      
      //读取PS摇杆A按键的开关量信息
      //按下A按键一次,遥控车速度设为“低速”,
      //再按一次A按键,遥控车速度设为“高速”,以此往复     
//如果按键当前状态为按下,而之前状态为松下,则说明按键被触发,按下一次
      else if((A==LOW)&&(old_A==HIGH))
      {
           state=1-state;
           delay(10);    
          if(state==1)
          {
            //向遥控车发送“高速”标志 
            flag='g';
             Serial.print(flag);
          }
          if(state==0)
          {
            //向遥控车发送“低速”标志
            flag='h';
            Serial.print(flag);
          }
      }
     //否则     
    else
    {flag='n';
       Serial.print(flag);//向从机遥控车发送所有舵机停转命令
    }
    delay(20);//延时,等待数据发送成功
    //把每次循环结束前的A按键“是否按下”的状态存放到变量old_A
    old_A=A;    
}

 

     从机遥控车的程序任务是:接受主机从蓝牙串口发送来的单字符命令,根据字符命令,利用舵机函数servo.write()来控制小车左右轮子舵机和机械手舵机的运转速度和方向,从而控制小车行驶和机械手抓取物体。
 
#include "Servo.h"  //声明舵机函数库
Servo controlservo;  // 定义机械手舵机对象变量
Servo rightservo;  // 定义小车右车轮舵机对象变量
Servo leftservo;  // 定义小车左车轮舵机对象变量
int power=80;//定义360°旋转舵机功率变量和初始化设置
int val;   //存储从机接受主机发送的单字节命令的变量
//初始化
void setup()
{
   Serial.begin(9600);//设置串行通信的波特率,启动串行通信   
   controlservo.attach(3); //定义3号数字量引脚来控制机械手舵机 
   rightservo.attach(9);  //定义9号数字量引脚来控制小车右舵机
   leftservo.attach(10); //定义10号数字量引脚来控制小车左舵机
   //连续旋转的舵机, 执行myservo.write(90),舵机的速度可能不为0,
   //我手头的舵机,执行myservo.write(93),舵机的速度才为0。
   controlservo.write(93);//初始化三个舵机为停止状态
   rightservo.write(93);
   leftservo.write(93);
}
//主程序
void loop()
{
  if(Serial.available()>0) //查询串口有无数据
  {
        val=Serial.read();//读取主机发送的字符
         if(val=='a')//如果主机发送字符为'a'
        {
          //小车前进
           rightservo.write(93+power);
           leftservo.write(93-power);         
        }
        if(val=='b')//如果主机发送字符为'b'
        {
          //小车后退
           rightservo.write(93-power);
           leftservo.write(93+power);           
        }
        if(val=='c')//如果主机发送字符为'c'
        {
         //小车左转
         rightservo.write(93-power);
         leftservo.write(93-power); 
                     
        }
        if(val=='d')//如果主机发送字符为'd'
        {
           //小车右转
           rightservo.write(93+power);
           leftservo.write(93+power);          
        }
        if(val=='e')//如果主机发送字符为'e'
        {
           //机械手抓取物体 
          controlservo.write(180);         
        }
        if(val=='f')//如果主机发送字符为'f'
        {
            //机械手松开物体
            controlservo.write(0);         
        }
        if(val=='n')//如果主机发送字符为'n'
        {
          //所有舵机停止
          controlservo.write(93);  
          rightservo.write(93);
          leftservo.write(93);        
        }
         if(val=='g')//如果主机发送字符为'g'
         {
           //小车速度为高速 
           power=80;              
         }       
         if(val=='h')//如果主机发送字符为'h'
         {
           //小车速度为低速
           power=10;
         }
  }     
}
 
四、结束语

    国内的机器人爱好者苦于条件所限,不可能像专门公司或者国外发烧友那样,拥有先进的数控机床和雕刻机,可以针对特定的机器人项目,制作相应尺寸和形状的机械结构件。当然淘宝里也有些制作机器人的结构件,但是缺少齿轮、链轮等传动件,而且重组性不强,大都只能搭建几个选定的机器人作品,想用淘宝上那些结构件创意出自己设计的机器人项目,困难比较大。所以由于机械结构件的局限,国内网路上的Arduino创意作品主要停留在纯电子趣味实验阶段,很少做到机电结合。

     那么有没有种类丰富、高效方便的机械结构件产品可以为Arduino电控系统提供机器人应用的机械平台,我认为国际上流行的乐高创意积木是一个很好的选择。原因有五:1、乐高原装塑料积木的形状,尺寸,种类很多,对搭建和制作机器人具备很好的灵活性和适应性。2、通过插接方法拼装机器人,无需再加工,然后通过螺钉、螺帽把其他非乐高的电控板子与其固连,这样组装机器人高效方便。3、由于乐高积木本身结构理念先进,因而搭建出来的作品美观紧凑,而且具有一定的结构强度和韧性。4、网络上可以查询到大量乐高NXT和Technic机器人作品的搭建图纸和软件程序,它们可以借鉴到您的机器人作品中。5、乐高套件产品很容易可以在淘宝购买得到。

     我一直执着地在探寻Arduino电子积木与乐高机械零件结合的方法,这篇文章带来的作品应该达到了我预期的目的。按照这样的方法,根据网络上的大量Arduino和乐高共享资源,可以制作出更多更新颖的机器人作品来,而不再受硬件不给力的限制