使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动
使用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无线手柄信号并控制小车运动相关推荐
- 玩转X-CTR100 l STM32F4 l PS2无线手柄
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] SONY的PS2无线手柄是索尼游戏机的遥控手柄,控制 ...
- Arduino Mega 2560操作加密芯片源代码
Arduino Mega 2560操作SMEC98SP加密芯片的事例代码,如果需要完整代码(包括加密芯片代码),请到中巨伟业 http://www.sinormous.com/download.htm ...
- 树莓派3B+与Arduino Mega 2560蓝牙通讯
树莓派3B+与Arduino Mega 2560蓝牙通讯 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 树莓派3B+与Arduino Mega 2560蓝牙通讯 前言 一 ...
- PCB 零件尺寸图:Arduino Mega 2560 尺寸
Arduino Mega 2560 尺寸图
- Arduino MEGA 2560找不到驱动怎么办
刚买了Arduino MEGA 2560(比Arduino UNO稍微高级一点的板子),按照视频一步一步操作(似乎插板子也不太一样,不管他,能插上去就完事了),但是到了代码烧录的时候,点击Tools- ...
- 【电机控制】Arduino mega 2560控制42步进电机接线
Arduino mega 2560控制42步进电机接线图 ****TB6600驱动器与42步进电机接线图**** 接线: 12V电源适配器正负极分别接驱动器VCC和GND 步进电机黑绿红蓝线分别接驱动 ...
- 玩转X-CTR100 l STM32F4 l PS2无线手柄-4WD智能小车
我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 前面已介绍X-CTR100控制器解码PS2无线手 ...
- Arduino mega 2560 上传项目总是出错最全解决方案以及串口测试教程
一:串口识别和驱动安装需要保证准确无误 1.运行arduino mega 2560 首先需要安装串口驱动,这样我们用USB将板子和我们计算机连接的时候,使得我们的计算机能够识别连接的串口并且能够连接上 ...
- 手把手教你用Arduino MEGA 2560+AS608指纹模块+舵机实现指纹锁,超详细,不要错过哦!
相信很多小伙伴都想制作一个属于自己的指纹锁吧,看完这一篇博文就够了 (一)材料准备 主要材料: 其它材料: (二)库文件.软件下载 (三)指纹的录入 指纹与TTL转接口接线: 用软件录入指纹 (四)模 ...
最新文章
- zemax操作数_ZEMAX与像差理论:二级光谱的ZEMAX描述与详解
- mysql+跨服务器+写入_MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问
- Android 应用开发(33)---Android程序签名打包
- Hex Workshop(16进制编辑利器) 6.7.2绿色版
- MySQL忘记密码后,修改
- centos php mbstring.so,CentOS安装php mbstring的扩展
- Java游戏编程技术-1
- 2016-2017-2 《程序设计与数据结构》课程总结
- 288388D-EnterCAT调试
- 免费一年VPS,digitalocean加上GitHub学生包
- iWatch开发的真机调试适配攻略
- 推荐系统——Neural Collaborative Filtering(NMF)
- webshell、一句话木马的权限问题
- Java实习生常规技术面试题每日十题Java基础(七)
- 纯前端实现 App Store 卡片展开效果
- sklearn机器学习:岭回归Ridge
- 预测房价(Python)
- Python chicken (2)
- Jad - the latest version
- LeetCode:112(Python)—— 路径总和(简单)