宜昌老张

SONY PS2电玩手柄遥控乐高小车

0
阅读(12293)

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

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

       我这篇文章带来的作品就是Arduino与乐高结合的产物,当然Arduino与乐高按照各种路径充分结合,还需假以时日,不断研讨和实践。

SONY PS2电玩手柄遥控乐高小车 视频:

      SONY PS2电玩手柄遥控乐高小车用到的很多知识点,以前的博客已经介绍了,这个作品新的知识点主要是:1、SONY PS2手柄操控信息如何提取到Arduino里;2、一次发送多个字节的无线通信如何实现;3、舵机与乐高结构件的新连接方法介绍。

     无线手柄可以直接接arduino使用,有线手柄因为arduino的3.3V供电不足,需要单独供电,因此这个实验用采用SONY PS2无线手柄。

       按照下面接线示意图,从PS2手柄接收器的9个引脚中找出6个引脚 用六根杜邦线 Xbee传感器扩展板V5的10、11、12、13数字端子与3.3V、GND连接起来,就可以实现Arduino控制器与PS手柄的硬件联系。对于实现Arduino控制器与PS手柄的硬件联系,Xbee传感器扩展板非常好用,因为它具有3.3V的端子,而且所有端子都是插针,方便用现成的杜邦线连接。

 

     不仅硬件连线方便,而且您使用专门为PS2X_lib库文件,编写程序也特别简单。

PS2X_lib库文件的zip文件请下载:326707904549.zip

     您可以将zip文件下载并解压缩后,复制到您的Arduino安装目录下的libraries文件夹里面,如图。然后在程序里就可以引入PS2X_lib库文件,并直接使用这个库文件中的函数,采集手柄操作信息了。


     

SONY PS2电玩手柄淘宝地址: http://item.taobao.com/item.htm?id=8705620095

     DFRobot Arduino Xbee传感器扩展板V5 淘宝地址:http://item.taobao.com/item.htm?spm=1101*r1F.3-1mJ7Y.v-4uDoDg&id=6804680647

     PS2无线手柄信号的采集和库文件的获取,我也不是无师自通的,而是依靠了互联网的共享资源、准确地说,是从国内最具影响的Arduino论坛学习到了这个知识,并应用到了我的这个作品中来的。这个论坛名称是极客工坊,论坛中“arduino学习笔记24 - PS2无线手柄实验”一文的网址为http://www.geek-workshop.com/forum.php?mod=viewthread&tid=172文章中有详细的PS2手柄各部件数据采集的测试程序,我从中找到了左右摇杆和绿色“三角”、蓝色“X”按键的相关程序段,用到了乐高遥控车作品的编程中。

    这个作品的遥控程序,每0.1s发送和接受一次3个字节的遥控数据,相关程序段,我用紫色字体标注在遥控器程序和乐高被控车程序中。在做实验时,一定要记住,先接通乐高被控车电源,再接通遥控器电源,否则两者的Arduino控制器无线RS232通信的多字节传送顺序会被打乱,致使通信失败。

    乐高被控车的前后左右行走靠两个360度连续旋转舵机带动的轮子驱动,360度连续旋转舵机的使用见博客文章《Arduino控制下的LEGO光感应晾衣架》,http://blog.chinaaet.com/detail/25360.html。另外基于APC220无线数传模块的两个Arduino控制器的通信方法,见博客文章《双Arduino控制器之间的无线通讯实验 》,http://blog.chinaaet.com/detail/25849.html

    确实Arduino刚入门的新生,立即看程序,可能有些困难,所以希望多看看我以前的文章和网络上其它入门资源。下面我给出这个作品的程序,并注释了详细的说明。

遥控器程序:

 

//程序任务:PS2手柄数据采集和遥控主机发送数据。
#include <PS2X_lib.h>  //声明PS2X库文件
PS2X ps2x; // 定义ps2x为PS2X类变量
int PS_LY;//存储PS2手柄左摇杆Y轴数据
int PS_RX;//存储PS2手柄右摇杆X轴数据
int flag;//存储PS2手柄按键标识
//初始化
void setup(){
 Serial.begin(9600); //启动串行通信
 //初始化PS2与Arduino控制器接口
 ps2x.config_gamepad(13,11,10,12, true, true);  
}
//主程序
void loop(){   
   ps2x.read_gamepad();//读PS2数据   
   //如果按下PS2的绿色“三角”按键,标识为'A'
   if(ps2x.NewButtonState(PSB_GREEN))          
        { flag='A' ; }   
   //如果按下PS2的蓝色“X”按键,标识为'B'
    else if(ps2x.NewButtonState(PSB_BLUE))      
         { flag='B' ; } 
    //如果没有按键按下,标识为'C'
    else
       { flag='C' ; } 
   //把PS2手柄左摇杆Y轴数据读到变量PS_LY
    PS_LY=ps2x.Analog(PSS_LY);
    //把PS2手柄右摇杆X轴数据读到变量PS_RX
    PS_RX=ps2x.Analog(PSS_RX);
   //把PS2手柄操作数据从遥控器发到乐高小车的接收端
   Serial.write(flag); 
   Serial.write(PS_LY);    
   Serial.write(PS_RX);  
   delay(100); //等待数据发送与接收 
}

乐高被控车程序:

 

//程序任务:接受遥控主机发送的数据,并处理这些数据,
 
//通过控制小车左右电机的转速和转向来控制小车行走。
 
#include <Servo.h>  //声明伺服马达函数库
Servo rightservo;  // 定义伺服马达对象变量
Servo leftservo;  // 定义伺服马达对象变量
int power=15;//马达功率变量定义和初始化设置

int PS_LY;//存储PS2手柄左摇杆Y轴数据
int PS_RX;//存储PS2手柄右摇杆X轴数据
int button;//存储PS2手柄按键标识

void setup()
{
   Serial.begin(9600);  //串口波特率设置,开始串口通信
   rightservo.attach(9);  //初始化9号数字量引脚来控制小车右马达
   leftservo.attach(10); //初始化10号数字量引脚来控制小车左马达
   //连续旋转的舵机, 执行myservo.write(90),舵机的速度可能不为0,
   //我手头的舵机,执行myservo.write(93),舵机的速度才为0。
   rightservo.write(93);//舵机停转
   leftservo.write(93);//舵机停转
}

void loop()
      //如果查询上位机通过串口已经发来有3个字节的密码    
       if(Serial.available()==3)
      {
             button=Serial.read();//串口缓冲器里读出的第一个字节
             PS_LY=Serial.read(); //
             PS_RX=Serial.read(); //  
           //如果按下PS2的绿色“三角”按键,则功率设置为15
           if(button=='A')
           {
              power=15;              
           }
            //如果按下PS2的蓝色“X”按键,则功率设置为5
           if(button=='B')
           {
             power=5;
           }
           //如果PS2右摇杆不动,而左摇杆的Y轴数据发生变化
           if(PS_RX==128 && PS_LY!=127)
           {
               如果左摇杆向前摇动
                if(PS_LY<127)
               {
                 //小车前进
                 rightservo.write(93+power);
                 leftservo.write(93-power);
               }
               如果左摇杆向后摇动 
                if(PS_LY>127)
               {
                 //小车后退
                 rightservo.write(93-power);
                 leftservo.write(93+power);
               }
           }    
           //如果PS2左摇杆不动,而右摇杆的X轴数据发生变化
           else if(PS_LY==127 && PS_RX!=128)
           {
               //如果右摇杆向右摇动
               if(PS_RX<128)
               {
                 //小车右转
                 rightservo.write(93);
                 leftservo.write(93-power);
               }
                //如果右摇杆向左摇动
               if(PS_RX>128)
               {
                 //小车左转
                 rightservo.write(93+power);
                 leftservo.write(93);
               }
           }
           //否则小车停止
           else
               {
                  rightservo.write(93);
                 leftservo.write(93); 
               }       
      }
}
 
    看看对比照片,这次舵机与乐高结构件的连接方法(右图)与以前的方法(左图)有什么不同?

乐高遥控车搭建照片,请下载:20162199604.zip

下载后,解压打开来看,是否可以跟着也搭建一个这样的乐高遥控车玩玩。

     网络上,已经有网友,按照我的思路,搭建了再创新的Arduino与乐高结合遥控车,是通过家用红外遥控器遥控的,我是用APC220无线数传遥控。并且他是用一个180度舵机控制转向,而另一个360度舵机给小车提供驱动力,而我是用并行的两个舵机驱动轮子来控制小车转速和转向的。这说明博客写作应该比纸质期刊论文发表,传播更快、更广,受益人群更多。

    网友simatic_net原话:“老张早已发过Arduino与LEGO结合的作品。我也来凑凑热闹。由于我业余时间有限,这个小车只能算是个半成品吧。后轮驱动,带差速器,可前进可后退,可调速。前轮转向可任意控制转向角度,自动回正自然不在话下。”

    原文网址:http://bbs.cmnxt.com/forum.php?mod=viewthread&tid=7530&page=1#pid73276

    网友simatic_net的乐高遥控车靓照: