查看: 7027|回复: 1

[Ardublock] Makeblock搬运遥控车之车身行动控制

[复制链接]
   搬运遥控车的底盘是由金属铝合金结构件组建而成,它底盘驱动系统是由两个直流电机,四个同步带轮和橡胶履带组成的,以实现前后进退和左右转弯的动作。
     为了让搬运遥控车的宽度限制在160mm内,我选用了两个短尺寸的电机并排放置在小车的后轮位置,如图1所示。两个电机由一块MC33886电机双路驱动板驱动。
夹持器.JPG
1 搬运遥控车的底盘

一、Makeblock搬运车车身行动部分的电控系统组成
    搬运车车身行动部分的电控系统组成为:两个短尺寸直流电机、Arduino MEGA2560控制器与XBee无线数传模块,一块MC33886电机驱动板,稳压电源模块,还有12V锂聚合物电池。
    用来驱动这两个短尺寸直流电机是MC33886驱动板。这个驱动板是一款大电流电机驱动模块,两路电机输出,可实现 PWM调速、正反转、制动功能等。

二、Makeblock搬运车的车身行动控制调试程序编制
    机械和电子硬件组装完毕后,我一步步通过LabVIEW软件来调试各执行部件的动作,并确定出来重要参数。这次调试的是车身行动控制,确定出车子直行和转弯的速度,以及两个电机转速偏差为多少时,小车才会直行。
    经常做智能车模型作品,你会发现,若给驱动左右两个车轮的电机相同的PWM功率值,小车却不能直行。可能有三个因素,导致了这种现象的出现。一是车轮的轮胎质量不行,比如轮胎没有内胆,有下陷的凹面,或者车身负载较大时,轮胎太硬,导致抓地能力不强而打滑;二是小车身上所带负载不平衡,车体左右一边重,一边较轻;三是驱动左右两个车轮的电机,它们的电气参数不一致。所以可以通过修正左右电机的PWM值,让它们之间有些偏差,小车就会被调整到走直线。
       所以设计一个行动灵活,控制精确的智能车,我认为要注意以下几点:
1、在智能车能够完成规定任务的前提下,小车负载尽量做到最轻(除相扑机器人),同时小车左右两边的负载尽量做到均衡。
2、所选电机要能与小车负载匹配,小车应具有比较好的加速能力和响应能力。
3、驱动小车的电机最好能选用带编码器的电机,这样小车的控制能力可以被提升。
4、小车的轮胎需仔细选择,轮胎要有很好的韧性。
     调试车身行动参数,采用了LabVIEW前面板,上位机与下位Arduino控制器通过XBee无线串口通信。
车体行走前面板.jpg
2车身行动控制前面板
    上图前面板中,左右两个旋钮控件分别用来设置小车左右电机的PWM值,PWM值范围为0~255,值越大,电机转速越快。当把小车左右电机的PWM值设置好后,按下启动按钮,小车被遥控行驶。若此时,按下停止按钮,则小车停止。
   注意,小车的Arduino MEGA2560控制器上插有一块XBee数传模块,它与插在电脑USB适配器上的另一块XBee模块无线通信,该适配器如图3所示。
XBee模块与适配器.jpg
3 Xbee适配器
   这个适配器通过USB数据线插到电脑USB插口上,要通过Arduino软件自带的驱动,生成串口COM号。这个串口号可以在windows操作系统的设备管理器看到,并且要把这个COM号,填写到图2前面板右侧的“请选择串口号”列表框中。“波特率”列表框中的值也不能随便写,它要与下位机Arduino程序设置的波特率一致。
    前面板后台程序是图形化编程语言,称为框图程序。在这个程序中,我采用了事件结构,这个结构分为三个由按钮控件引发的事件分支。三个按钮是分别指启动、停止、退出按钮。图4展示的就是启动按钮分支,
车身行动启动按钮事件分支.jpg
4 车身行动控制框图程序之启动按钮事件分支
   从图4看出,如果按下前面板的“启动”按钮,在后台框图程序中就会引发“启动”:值改变事件分支,这个分支程序的任务是先把五个字节数据转换为一个字符串,再输入到VISA写入VI中,这个VI就会通过RS322通信协议把五个字节下达给小车上的Arduino控制器。五个字节中第一个字节如果是0x11(十六进制),则表示小车启动,若是0x22,则小车停止;第二个字节决定小车左轮电机正转或者反转,0xAA表示前进,0xBB表示后退;第三个字节是决定右轮电机正转或者反转,0xAA表示前进,0xBB表示后退;第四个字节是左轮电机的PWM功率值,功率值的大小由图2中旋钮控件来调节,第五个字节是小车右轮电机的PWM功率值。
       与上位机LabVIEW程序相配合的是Arduino程序,它的任务是:接受上位机下达的五个控制字节,并据此控制小车左右轮子的转向、转速。
Arduino程序:
  1. int P11_left =8; //连接小车右轮电机的PWM控制端口到数字接口8
  2. int P12_left =9; //连接小车右轮电机的转向控制端口到数字接口9
  3. int P21_right =10; //连接小车左轮电机的PWM控制端口到数字接口10
  4. int P22_right =11; //连接小车左轮电机的转向控制端口到数字接口11
  5. int val[5]; //定义接受上位机下达的五个控制字节的存储数组变量
  6. //初始化
  7. void setup()
  8. {
  9.   Serial1.begin(9600);    // 启动串口通信,波特率为9600b/s
  10.   pinMode(P21_right, OUTPUT);   //直流电机驱动板的控制端口设置为输出模式
  11.   pinMode(P22_right, OUTPUT);
  12.   pinMode(P11_left, OUTPUT);
  13.   pinMode(P12_left, OUTPUT);
  14.   digitalWrite(P21_right, LOW); //右电机停止
  15.   digitalWrite(P22_right, LOW);
  16.       delay(20);
  17.   digitalWrite(P11_left, LOW); //左电机停止
  18.   digitalWrite(P12_left, LOW);
  19.       delay(20);  
  20. }
  21. void left_advance()//小车左轮前进
  22. {
  23.    digitalWrite(P11_left,LOW);
  24.    analogWrite(P12_left,val[3]);
  25. }
  26. void left_back()//小车左轮后退
  27. {  
  28.    digitalWrite(P12_left,LOW);
  29.    analogWrite(P11_left,val[3]);  
  30. }
  31. void right_advance()//小车右轮前进
  32. {
  33.    digitalWrite(P22_right,LOW);
  34.    analogWrite(P21_right,val[4]);   
  35. }
  36. void right_back()//小车右轮后退
  37. {
  38.    digitalWrite(P21_right,LOW);
  39.    analogWrite(P22_right,val[4]);
  40. }

  41. void left_stop()//小车左轮停止
  42. {
  43.    digitalWrite(P11_left, LOW);
  44.    digitalWrite(P12_left, LOW);     
  45. }  
  46. void right_stop()//小车右轮停止
  47. {
  48.    digitalWrite(P21_right, LOW);
  49.    digitalWrite(P22_right, LOW);      
  50. }  
  51. //主程序
  52. void loop()
  53. {
  54.   if (Serial1.available()>0) //如果Arduino控制器读缓冲区中存在上位机下达的字节
  55.   {
  56.      delay(300);
  57.       for(int i=0; i<5; i++)//for循环次数与上位机下达的字节数一致
  58.      {val[i] = Serial1.read(); //读出Arduino控制板读缓冲区的字节
  59.         delay(5);   
  60.       }     
  61.      if(val[0]==0x11)     //如果读出的第一个字节为小车启动标志字节0x11
  62.      {
  63.          if(val[1] ==0xAA)   
  64.             left_advance();               
  65.          if(val[1] ==0xBB)   
  66.            left_back();              
  67.          if(val[2] ==0xAA)   
  68.             right_advance();        
  69.          if(val[2] ==0xBB)            
  70.            right_back();               
  71.      }
  72.      else if(val[0]==0x22) //如果读出的第一个字节为小车停止标志字节0x22
  73.      {
  74.          right_stop();
  75.          left_stop();                                   
  76.       }
  77.   }
  78. }
复制代码

   通过三篇文章的介绍,讲解了如何用LabVIEW可视化界面,方便直观高效地确定出Arduino编程时所需的参数。这些参数包含有搬运车夹持器爪子张合角度;直线导轨上夹持器的升降高度和速度;以及小车走直线时左右电机的PWM值。
   下面就要谈谈如何用SONY PS2手柄来遥控这个MakeBlock搬运车。这些确定好的重要参数,可以直接会用到遥控车的Arduino程序中,比如向前拨动手柄摇杆,小车左右电机按照事先设定好的PWM值,能向前走出直线。按下手柄某个按钮,夹持器的爪子收紧到规定角度,刚好紧紧抓住物料。

盖世吴双  学徒

发表于 2014-7-7 15:13:34

精辟,学习中,非常好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail