dtcms 自定义指令 ssh命令 drupal uiview interface ftp vue中文 vue安装教程 郑州小程序公司 pmp视频教程下载 less官网 基于bootstrap的框架 java 数据分析 js获取月份 安卓程序源代码 windows杀死进程命令 css选择器有几种 matlab图像滤波 kafka启动命令 plsql卸载 range函数python mysql更新 表白网页源码 python配置 python的open函数 python基本语法 python做界面 java连接mysql数据库 学java基础 java基础框架 java列表 运行时错误1004 EasyCHM bash命令 通达信金融终端官网 渐变事件 免费家谱制作软件 idea重命名快捷键 js分页
当前位置: 首页 > 学习教程  > 编程语言

使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动

2021/1/13 20:02:57 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动 文章目录使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动1 前言2 硬件连接2.1 硬件构成简介2.2 硬件连线3 程序编制4 实际测试5 TIPS1 前言 最近开始学习单片机和树莓派小车的编程相关内容,本例较…

使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动

文章目录

  • 使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动
    • 1 前言
    • 2 硬件连接
      • 2.1 硬件构成简介
      • 2.2 硬件连线
    • 3 程序编制
    • 4 实际测试
    • 5 TIPS

1 前言

最近开始学习单片机和树莓派小车的编程相关内容,本例较为简单,旨在通过Arduino mega 2560 读取PS2无线手柄的左摇杆信号并驱动小车运动。

2 硬件连接

硬件连接是编程的基础,也正是在本例的探索过程中,我发现网上很多例子借用了他人的图片、程序,且接线的图片和程序存在不能对应的问题,浪费了我很多时间。所以本例虽然简单,但绝对原创,确保了图片和程序的对应性问题。

2.1 硬件构成简介

本例使用的小车底盘为双减速电机(供电12V减速比为30)后驱,前轮转向为DS3119舵机驱动;本例使用购买的L298N电机驱动板直接驱动两个后轮减速电机运动;本例使用的单片机为Arduino mega 2560,前轮转向舵机采用L298N驱动板上的5V输出供电,信号线直接与Arduino相连;无线手柄为购买的仿制PS2手柄,但好在接口基本相同且有标明;小车供电采用3个18650电池组成的电池组供电,额定电压11.1V。本例涉及硬件如下表:

器件名称主要参数备注
后轮驱动电机减速电机,12V额定电压,30减速比带编码器,但本例未用到
前轮转向舵机DS3119数字舵机与主流995等舵机控制相同
驱动板L298N四路驱动板四路刚好驱动两个电机的正反转
单片机Arduino mega 2560手头刚好有,其实用UNO也可以
无线手柄仿制PS2无线手柄手柄无线接收器有明确的信号口标识
主电源3x18650电池组,额定电压11.1V带双路圆口输出,一公一母,公头可直接插入arduino,母头需自己再配一个公头转接L298N电机驱动板上
副电源5V(本例使用电压源)本打算驱动舵机使用arduino或驱动板的5V电源,但发现会严重影响Arduino与无线手柄之间的通讯,遂使用单独5V电源驱动舵机
排线若干排线以一头公一头母的为主,大约用到10根左右

本例涉及的所有硬件(5V电压源除外)如下图所示:

所有硬件合影

2.2 硬件连线

所用端口、硬件连线如下图所示:

硬件连线图

3 程序编制

本例所用全部程序如下:

#include <PS2X_lib.h>  //for v1.6

#include <Servo.h>    //这是控制舵机必须包含的头文件

PS2X ps2x; // create PS2 Controller Class
Servo myservo;        //创建一个舵机控制对象
//right now, the library does NOT support hot pluggable controllers, meaning 
//you must always either restart your Arduino after you conect the controller, 
//or call config_gamepad(pins) again after connecting the controller.
int Left_motor_back=6;       //左电机后退(IN1)
int Left_motor_go=7;         //左电机前进(IN2)
 
int Right_motor_go=5;        // 右电机前进(IN3)
int Right_motor_back=4;      // 右电机后退(IN4)
 
int Velocity=0;              //前进或后退的速度大小
int Direction=90;            //转向舵机的角度,舵机初始都是在90度,对应前轮在中位,本例小车底盘大概左转极限对应舵机70度,右转极限对应舵机110度

int error = 0;               //这些是人家原来的手柄信号读取例程中的内容
byte type = 0;
byte vibrate = 0;
 
void setup(){
Serial.begin(57600);
 //初始化电机驱动IO为输出方式
  pinMode(Left_motor_go,OUTPUT); //将控制电机的四路信号口设置为输出模式
  pinMode(Left_motor_back,OUTPUT);  
  pinMode(Right_motor_go,OUTPUT);
  pinMode(Right_motor_back,OUTPUT);
  myservo.attach(8);             //将舵机信号口设置为相应的舵机模式
//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************
  
error = ps2x.config_gamepad(13,11,10,12, true, true);   //setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error
 
if(error == 0){
   Serial.println("Found Controller, configured successful");
   Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
  Serial.println("holding L1 or R1 will print out the analog stick values.");
  Serial.println("Go to [url]www.billporter.info[/url] for updates and to report bugs.");
}
   
  else if(error == 1)
   Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit [url]www.billporter.info[/url] for troubleshooting tips");
   
  else if(error == 2)
   Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit [url]www.billporter.info[/url] for troubleshooting tips");
   
  else if(error == 3)
   Serial.println("Controller refusing to enter Pressures mode, may not support it. ");
   
   //Serial.print(ps2x.Analog(1), HEX);
   
   type = ps2x.readType(); 
     switch(type) {
       case 0:
        Serial.println("Unknown Controller type");
       break;
       case 1:
        Serial.println("DualShock Controller Found");
       break;
       case 2:
        Serial.println("GuitarHero Controller Found");
       break;
     }
  
}
 
void loop(){
   /* You must Read Gamepad to get new values
   Read GamePad and set vibration values
   ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255)
   if you don't enable the rumble, use ps2x.read_gamepad(); with no values
   
   you should call this at least once a second
   */
   
if(error == 1) //skip loop if no controller found
  return; 
  
ps2x.read_gamepad(false, vibrate);          //read controller and set large motor to spin at 'vibrate' speed
if(ps2x.Analog(PSS_LY) <128){               //通过测试可知,左摇杆Y轴中位时是128,前推到顶为0,故此范围内执行if语句,为前进
  Velocity = map(ps2x.Analog(PSS_LY), 0, 128, 255, 0);//通过map函数将128-0的摇杆值对应为255-0的速度值
  analogWrite(Left_motor_go, Velocity);               //前进状态,两个电机的go通道为速度值,back通道为0
  analogWrite(Right_motor_go, Velocity);
  analogWrite(Left_motor_back, 0);
  analogWrite(Right_motor_back, 0);
}
else {                                      //相应的,左摇杆Y轴在128-255的时候,意味着后退
  Velocity = map(ps2x.Analog(PSS_LY), 128, 255, 0, 255);//通过map函数将128-255的摇杆值对应位0-255的速度值
  analogWrite(Left_motor_back, Velocity);               //后退状态,两个电机的back通道为速度值,go通道为0
  analogWrite(Right_motor_back, Velocity);
  analogWrite(Left_motor_go, 0);
  analogWrite(Right_motor_go, 0);
}

Direction = map(ps2x.Analog(PSS_LX), 0, 255, 70, 110); //转向的控制较为简单,只需通过map函数将0-255的左摇杆X轴值对应为70-110的舵机角度
myservo.write(Direction);                              //将计算所得的舵机角度写入舵机
    
delay(50);                                             //这个50ms的延时非常重要,去掉会影响arduino与手柄接收器的通讯
     
}

程序的说明均已在注释中表述,这里不再赘述。

4 实际测试

前进测试
后退测试
转向测试
综合测试

5 TIPS

  • 不同模块之间的共地一定要做好,比如单片机和电机驱动板之间等,否则会出现莫名其妙错误。
  • 舵机供电最好不要用单片机的5V和驱动板上面的5V,因为二者都是通过一个小的稳压芯片得来,带负载能力不是很强,所以很可能会带不起舵机。我的这套硬件就是这样。。。
  • 排线接插的方式虽然方便,但很容易产生虚接,有的劣质排线甚至折两次内部就断了。出问题的时候,要耐心检查,有一个万用表最好,用蜂鸣通断功能逐个排除。
  • 底盘硬件安装上有误差很正常,可能导致前轮的中位并不对应舵机的90度初始位置,这个时候要学会根据实际效果微调。
  • 测试的时候没必要让小车到处跑,可以像我一样把小车架起来,方便。

本文链接: http://www.dtmao.cc/news_show_600233.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?