使用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 errorif(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 valuesRead GamePad and set vibration valuesps2x.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 valuesyou should call this at least once a second*/if(error == 1) //skip loop if no controller foundreturn; 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通道为0analogWrite(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通道为0analogWrite(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度初始位置,这个时候要学会根据实际效果微调。
  • 测试的时候没必要让小车到处跑,可以像我一样把小车架起来,方便。

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

  1. 玩转X-CTR100 l STM32F4 l PS2无线手柄

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] SONY的PS2无线手柄是索尼游戏机的遥控手柄,控制 ...

  2. Arduino Mega 2560操作加密芯片源代码

    Arduino Mega 2560操作SMEC98SP加密芯片的事例代码,如果需要完整代码(包括加密芯片代码),请到中巨伟业 http://www.sinormous.com/download.htm ...

  3. 树莓派3B+与Arduino Mega 2560蓝牙通讯

    树莓派3B+与Arduino Mega 2560蓝牙通讯 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 树莓派3B+与Arduino Mega 2560蓝牙通讯 前言 一 ...

  4. PCB 零件尺寸图:Arduino Mega 2560 尺寸

    Arduino Mega 2560 尺寸图

  5. Arduino MEGA 2560找不到驱动怎么办

    刚买了Arduino MEGA 2560(比Arduino UNO稍微高级一点的板子),按照视频一步一步操作(似乎插板子也不太一样,不管他,能插上去就完事了),但是到了代码烧录的时候,点击Tools- ...

  6. 【电机控制】Arduino mega 2560控制42步进电机接线

    Arduino mega 2560控制42步进电机接线图 ****TB6600驱动器与42步进电机接线图**** 接线: 12V电源适配器正负极分别接驱动器VCC和GND 步进电机黑绿红蓝线分别接驱动 ...

  7. 玩转X-CTR100 l STM32F4 l PS2无线手柄-4WD智能小车

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 前面已介绍X-CTR100控制器解码PS2无线手 ...

  8. Arduino mega 2560 上传项目总是出错最全解决方案以及串口测试教程

    一:串口识别和驱动安装需要保证准确无误 1.运行arduino mega 2560 首先需要安装串口驱动,这样我们用USB将板子和我们计算机连接的时候,使得我们的计算机能够识别连接的串口并且能够连接上 ...

  9. 手把手教你用Arduino MEGA 2560+AS608指纹模块+舵机实现指纹锁,超详细,不要错过哦!

    相信很多小伙伴都想制作一个属于自己的指纹锁吧,看完这一篇博文就够了 (一)材料准备 主要材料: 其它材料: (二)库文件.软件下载 (三)指纹的录入 指纹与TTL转接口接线: 用软件录入指纹 (四)模 ...

最新文章

  1. zemax操作数_ZEMAX与像差理论:二级光谱的ZEMAX描述与详解
  2. mysql+跨服务器+写入_MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问
  3. Android 应用开发(33)---Android程序签名打包
  4. Hex Workshop(16进制编辑利器) 6.7.2绿色版
  5. MySQL忘记密码后,修改
  6. centos php mbstring.so,CentOS安装php mbstring的扩展
  7. Java游戏编程技术-1
  8. 2016-2017-2 《程序设计与数据结构》课程总结
  9. 288388D-EnterCAT调试
  10. 免费一年VPS,digitalocean加上GitHub学生包
  11. iWatch开发的真机调试适配攻略
  12. 推荐系统——Neural Collaborative Filtering(NMF)
  13. webshell、一句话木马的权限问题
  14. Java实习生常规技术面试题每日十题Java基础(七)
  15. 纯前端实现 App Store 卡片展开效果
  16. sklearn机器学习:岭回归Ridge
  17. 预测房价(Python)
  18. Python chicken (2)
  19. Jad - the latest version
  20. LeetCode:112(Python)—— 路径总和(简单)

热门文章

  1. MapReduce论文精读
  2. python浮点数计算出现无限小数
  3. 微博营销我们应该知道些什么?
  4. A10 VBIOS Flash
  5. Java EE 概述
  6. javaFX基本使用
  7. Tkinter超市收银小程序(附源码),看完这一篇你还不会Tkinter吗,快来试试吧
  8. GNU Radio入门
  9. 学习笔记——java潜艇游戏项目
  10. heic文件如何转换成jpg?免费heic转换器了解一下