yichangzhang 发表于 2014-4-25 17:49:55

Makeblock搬运遥控车之车身行动控制

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

void left_stop()//小车左轮停止
{
   digitalWrite(P11_left, LOW);
   digitalWrite(P12_left, LOW);   
}
void right_stop()//小车右轮停止
{
   digitalWrite(P21_right, LOW);
   digitalWrite(P22_right, LOW);      
}
//主程序
void loop()
{
if (Serial1.available()>0) //如果Arduino控制器读缓冲区中存在上位机下达的字节
{
   delay(300);
      for(int i=0; i<5; i++)//for循环次数与上位机下达的字节数一致
   {val = Serial1.read(); //读出Arduino控制板读缓冲区的字节
      delay(5);   
      }   
   if(val==0x11)   //如果读出的第一个字节为小车启动标志字节0x11
   {
         if(val ==0xAA)   
            left_advance();               
         if(val ==0xBB)   
         left_back();            
         if(val ==0xAA)   
            right_advance();      
         if(val ==0xBB)            
         right_back();               
   }
   else if(val==0x22) //如果读出的第一个字节为小车停止标志字节0x22
   {
         right_stop();
         left_stop();                                 
      }
}
}
   通过三篇文章的介绍,讲解了如何用LabVIEW可视化界面,方便直观高效地确定出Arduino编程时所需的参数。这些参数包含有搬运车夹持器爪子张合角度;直线导轨上夹持器的升降高度和速度;以及小车走直线时左右电机的PWM值。   下面就要谈谈如何用SONY PS2手柄来遥控这个MakeBlock搬运车。这些确定好的重要参数,可以直接会用到遥控车的Arduino程序中,比如向前拨动手柄摇杆,小车左右电机按照事先设定好的PWM值,能向前走出直线。按下手柄某个按钮,夹持器的爪子收紧到规定角度,刚好紧紧抓住物料。

盖世吴双 发表于 2014-7-7 15:13:34

精辟,学习中,非常好
页: [1]
查看完整版本: Makeblock搬运遥控车之车身行动控制