宜昌老张

32路舵机控制板与乐高蓝牙遥控车

0
阅读(5397)

    上一篇文章《乐高8275科技套件B模型的Arduino电控改造》描述的是:我用标准舵机替换掉了乐高Technic电机,并用Arduino系统全电控了乐高8275机械手车,网址:http://blog.chinaaet.com/detail/28854.html。前几天,花了一些功夫改装了一个乐高SET套件作品,写了一篇文章,如果就此拆掉这些积木,再换个作品继续用这些积木进行搭建,当然可以。但为免过于草率,我在想能否换些另外的电控,测试一下这些玩意的功效,也是蛮有意思的。所以这次我把遥控车接收器从Arduino控制器换成了32路舵机控制板。下面是遥控车接收器更换为32路舵机控制板后的实验全景图。

图1 Arduino蓝牙遥控乐高机械手车实验全景图

    其实32路舵机控制板也像Arduino控制板一样是个国际标准,并不是哪家公司所独有的技术,很多国内外的机器人配件公司和Arduino设备商都有类似的产品,下面一张图展示的是国外Lynxmotion公司和国内DFRobot的产品,它们都必备有动作存储器部件,区别是Lynxmotion公司的产品采用老式9针串行接口,而DFRobot公司的产品用的是USB接口,另外可以插装蓝牙和APC220无线模块,这样便于制作遥控作品。Lynxmotion公司网址:http://www.lynxmotion.com/。DFRobot公司网址:http://goo.gl/g4oQB

图2 Lynxmotion公司和DFRobot的32路舵机控制板对照图

    由机器人专家Jim Frye领衔的Lynxmotion公司是国际知名的机器人套件生产商,可以在它的网站里看到很多COOL的机器人作品图片、视频以及有关机器人的资讯。下图是该公司在“SERVO” 杂志上的广告页,可以欣赏下,图中红色矩形框标注的是该公司的32路舵机控制板。我看了下图的时候,就想到我肯定不会花那多钱海淘这些套件去感受科技,自己用国内公司的32路舵机控制板,再从网路上很容易买到些舵机关节连接板,加上乐高零件,自己也应该能高仿下Lynxmotion公司的机器人套件。    

图3  Lynxmotion公司在“SERVO” 杂志上的广告页

    SERVO Magazine 是创办于2003年10月份的美国经典的机器人杂志,是由T&L Publications创办发行的月刊。它是面向最广大机器人爱好者的杂志,是百分之百的机器人实践专门杂志,里面的内容有专题文章、访谈、教程、DIY项目、黑客(创客)、零部件来源,还有更多分类。SERVO Magazine 网址:http://www.servomagazine.com/index.php。还有一本名为“Make”杂志,无线电杂志社已经把它翻译成简体中文,中文名为《爱上制作》,可以在当当网买到,“Make”杂志网址:http://makezine.com/。看到下面图片,感觉美国人玩得很开心,而且还没耽误工作。

图4 Servo杂志和Maker杂志

    闲话不再说了,还是谈谈这篇文章的焦点,DFRobot公司的USB版32位舵机控制板吧。用上这个板子,我的乐高遥控车上的接收器从机,没有编写一行程序,只需遥控器主机发字符串命令,就可以控制小车完成规定动作。

实验视频:

     我这篇文章的实验项目是用Arduino遥控主机来控制32路舵机控制板,然后舵机控制板再驱动遥控车两个轮子的舵机以及机械手舵机工作,所以对于舵机控制板,这次我只讲与这个实验项目有关的内容,更多关于这个板子的用法,我会在今后的文章中逐一介绍,也可以先看看它的说明书网页,http://wiki.dfrobot.com.cn/index.php?title=USB%E7%89%8832%E8%B7%AF%E8%88%B5%E6%9C%BA%E6%8E%A7%E5%88%B6%E6%9D%BF(SKU:DRI0005)

    我将从三个方面来讲解这个项目,1、32路舵机控制板的电源供给和跳线帽设置;2、舵机零速时PWM信号脉宽值的确定;3、遥控器主机的程序编制。

1、32路舵机控制板的电源供给和跳线帽设置

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

图5 DF-USBSSC32控制板各端口分布和功能图

     上图中标号1、8、10、12端口都可以供电,10号端口提供逻辑电源,我用9V方块电池供电,12号端口提供舵机电源,我用5节2400ma充电电池供电,“11 VL和VS1连通跳线帽”不插上(看上图),断开!,逻辑电源与舵机电源分开供电。由于不用电脑USB供电,所以“2 USB供电选择跳线帽”也不插上,断开!其他跳线帽都插上短接,蓝牙模块插在“16 无限数传接口”上。

    实验项目采用Arduino遥控主机来控制这个32路舵机控制板,跳线帽设置和电源供给应如下图所示。注意:下图跳线帽部分如果是白色空白,说明没有插上跳线帽,如果是黑色矩形,说明插上了跳线帽短接。

图6  Arduino控制器和32路舵机控制板之间串口通讯时的跳线帽和电源设置

    由于舵机电源不能超过6.8V,所以只能最多用5节充电电池,但我采用的是乐高Technic套件的电池盒供电,里面是装6节5号电池的,于是我用一个铁钉把一个电池位给短接了。至于如何把乐高电池盒的电源线引出来给舵机电源端供电,可参看文章,网址thttp://blog.chinaaet.com/detail/24857.html

图 7 乐高电池盒的电池位短接方法

    32路舵机控制板的通信波特率,我设置为115200b/s,用通过” 7 拨码开关“来设置,把两个拨码开关都拨到ON端。如下图。

图8  舵机控制板上DIP拨码开关与波特率设置

 

2、舵机零速时PWM信号脉宽值的确定

      舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由单片机发出PWM信号(脉宽调制信号)来控制舵机运行。PWM信号的周期为20ms,基准脉冲宽度为1500us,实际脉冲宽度范围从500us到2500us。如果是180度舵机,PWM信号脉冲宽度的范围就对应着舵机的转角范围从-90°到+90°,如果是360°旋转舵机,就对应着舵机的转速和转向,脉宽为500us,对应舵机以最高速度反转,脉宽为2500us,对应舵机以最高速度正转,如果脉宽为基准脉宽1500us,那转速为多少?应该为零速。但是即使360°舵机是一个厂家、一个批次的产品,当单片机发出脉宽为1500us的PWM信号时,这种舵机的转速可能也会偏离零速,所以需要PC机舵机控制软件来确定各个舵机应该发出脉宽为多少的PWM信号,才会使某一舵机速度为零。

     要用舵机控制软件来确定舵机零速时的PWM信号脉宽值,首先要对32路舵机控制板的跳线帽进行设置,还要安装USB驱动软件。

图9  USB调试时的跳线帽和电源设置

    如图9所示,连接USB电缆到控制板,将红圈1位置(标注接地符号的那个跳线帽)的跳线帽插到红圈2位置,即采用USB电源给控制板逻辑部分供电,舵机部分则还是采用乐高电池盒供电,并接到“12 VS1电源端子”,使用USB供电后红圈3要断开,“10 VL逻辑电源端子”的9V方块电池的电源也要断开!DIP拨码开关都拨到ON处,波特率选择为115.2Kb/s。乐高机械手车的右轮子和左轮子的舵机分别连在的5号和7号舵机端子上,机械手舵机连在3号舵机端子上。

    USB驱动软件和舵机控制软件以及关于DF-USBSSC32控制板的全部资料我从厂家获取来,并打包成RAR文件,可以下载:http://115.com/file/dp42m70j#DF-USBSSC32资料.rar

     安装好驱动程序后,把舵机控制板上的蓝牙模块拿下来,再插到电脑USB接口上,在Windows操作系统的设备管理器里,可以看到自动生成的串口号是什么,我的电脑显示串口号为COM17。不同电脑产生的串口号可能不同,您就用自己操作时生成的串口号。

图10 舵机控制板的USB串口号生成

   接着打开舵机控制软件 ,选择为串口号COM17,设置波特率为115200,点击“连接”按钮,然后调整我用红色矩形框标注的对应三个舵机速度的P3、P5、P7值,眼睛看看或者耳朵听听,到底设置为多少,舵机才不转动。这次实验项目连在3、5、7端子的舵机脉宽要分别微调至1510、1505和1500,三个舵机才一点也不转动。确定了零速脉宽值后,把它们记录下来,最后要填写到文章后面的遥控器主机程序相应程序行中,该程序行,我将用红色字体标注出来,最后点击“断开”按钮,释放COM17串口资源

图11 用舵机控制软件调整舵机零速

    另外,我把主从机的两个蓝牙模块的波特率都设置为115200b/s,至于蓝牙模块的参数设置,可见《乐高8275科技套件B模型的Arduino电控改造》,网址:http://blog.chinaaet.com/detail/28854.html。由于上篇文章里,蓝牙模块的波特率采用默认值,9600b/s,没必要用AT命令特别设置,但要把波特率改为115200b/s,需在SSCOM3.2串口助手软件的发送行输入AT命令“AT+ UART=115200,0,0 ”来设置,可以再输入“AT+ UART?”查询设置是否正确。如下图所示。

图12 蓝牙模块波特率参数设置

 

3、遥控器主机的程序编制

  只有主机遥控器才需要编写程序,机械手车上的从机接收器由于使用了32路舵机控制板,不需要编写程序,舵机控制板接受到主机遥控命令后,会自动领会,并驱动舵机工作的。主机程序部分由于有详细的注释,就不累述了。注意:向Arduino控制器“写”程序前,先把蓝牙模块从控制器的TTL串行接口上拔下来,否则程序无法“写”入,“写”完程序后,再插上蓝牙模块。

    主机遥控器程序任务是:采集遥控器的游戏杆扩展板上的PS摇杆和大拇指按键信息,处理后,通过蓝牙串口,向遥控车上的舵机控制板发送字符串控制命令,这些命令分别控制小车的前后左右行走、机械手抓取或松开物体。

int JoyStick_X = 1; //游戏杆扩展板的PS摇杆X轴连在模拟端口1

int JoyStick_Y = 0; //游戏杆扩展板的PS摇杆Y轴连在模拟端口0

int button_Grab =3;     //红色B按键连在数字端口3
int button_Release =4;  //蓝色C按键连在数字端口4
//B按键控制遥控车机械手抓取物体
//C按键控制遥控车机械手松开物体
int B,C;//存储游戏杆扩展板的开关量按键的当前读取值
int x,y;  //存储游戏杆扩展板的模拟量PS摇杆X,Y轴的当前读取值

//初始化
void setup()
{
  //把游戏杆扩展板上B、C按键设置为开关量输入模式
  pinMode(button_Grab, INPUT); 
  pinMode(button_Release, INPUT);
  //启动串行通信
  Serial.begin(115200);//设置串行通信的波特率
}
//主程序
void loop()
{
    x=analogRead(JoyStick_X);//读取PS摇杆X轴的模拟量信息
    y=analogRead(JoyStick_Y);//读取PS摇杆Y轴的模拟量信息
    //读取游戏杆扩展板上B、C按键“是否按下”的状态
     B= digitalRead(button_Grab);
     C= digitalRead(button_Release);         
    //如果PS摇杆Y轴向前摇动
    if(y>812)
    {
       //向遥控车的舵机控制板发送小车前进命令
       Serial.println("#5 P2500 #7 P500");
    }
    //如果PS摇杆Y轴向后摇动
    else if(y<212)
    {
       //向遥控车的舵机控制板发送小车后退命令
       Serial.println("#5 P500 #7 P2500");
    }
    //如果PS摇杆X轴向左摇动
    else if(x>812)
    {
       //向遥控车的舵机控制板发送小车向左命令
       Serial.println("#5 P500 #7 P500");
    }
    //如果PS摇杆X轴向右摇动 
    else if(x<212)
    {
       //向遥控车的舵机控制板发送小车向右命令
       Serial.println("#5 P2500 #7 P2500");
    }    
    //如果机械手B按键为按下状态,同时C按键为松开状态
    else if((B ==LOW)&&(C==HIGH))
    {
      //向遥控车的舵机控制板发送机械手“抓取”物体命令
       Serial.println("#3 P2500");
    }
    //如果机械手C按键为按下状态,同时B按键为松开状态
   else if((C==LOW)&&(B==HIGH))
    { 
      //向遥控车的舵机控制板发送机械手“松开”物体命令
       Serial.println("#3 P500");
    }        
     //否则     
    else
    {
      //向遥控车的舵机控制板发送所有舵机停转命令 
      Serial.println("#3 P1510 #5 P1505 #7 P1500");
    }
    delay(200);//延时,等待数据发送成功    
}
 
     主机程序写入后,按照图6所示设置舵机控制板上跳线帽和电源供给,两个设置波特率的DIP拨码开关都拨到ON,主从机都插上蓝牙模块,就可以遥控乐高机械手车了。