使用Arduino mega 2560读取PS2无线手柄信号并控制小车运动
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度ÿ