基于Arduino使用PS2无线手柄
产品特点1、自动休眠省电模式
在开启无配对状态下,30S自动启动省电模式,开启并配对完成的状态下,5分钟内没有按键按下,然后启动省电模式,此时只需按下START键就能激活。
2、远距离遥控
手柄采用的是2.4G无线技术,遥控距离最大可达20米左右,智能小车上装上接收器,在20米范围内,无线手柄都能对智能小车进行操控。
4、按键介绍
配对成功后,按“MODE”键,选择手柄发送模式,红灯模式:遥杆输出模拟值,绿灯模式:遥杆对应四个方向按键。
5、引脚说明
1、DI/DAT:信号流向,从手柄到主机,此信号是一个8bit的串行数据,同步传送于时钟的下降沿,信号的读取在时钟由高到低的变化过程中完成。 2、DO/CMD:信号流向,从主机到手柄,此信号和DI相对,信号是一个8bit的串行数据,同步传送于时钟的下降沿。 4、GND:电源地 5、VDD:接收器工作电源,电源范围3-5V 6、CS/SEL:用于提供手柄触发信号,在通讯期间,处于低电平 7、CLK:时钟信号,由主机发出,用于保持数据同步
接线方式
Arduino PS2无线手柄 D12 <------> 1号端口 D11 <------> 2号端口 GND <------> 4号端口 3.3V <------> 5号端口 D10 <------> 6号端口 D13 <------> 7号端口
PS2无线手柄基础小案例
结合Arduino 、两个直流减速电机、一个6v外部供电电源、PS2无线手柄、一个L298N电机驱动板模块 实现1、通过无线手柄左边的“上下左右”键实现前进、后退、左转、右转 实现2、通过按PS2左摇杆位置实现前进 、后退、左转、右转
接线方式
Arduino PS2无线手柄 D12 <------> 1号端口 D11 <------> 2号端口 GND <------> 4号端口 3.3V <------> 5号端口 D10 <------> 6号端口 D13 <------> 7号端口
Arduino L298N电机驱动板模块 5V <------> +5V GND <------> GND D2 <------> ENA D4 <------> IN1 D3 <------> IN2 D7 <------> ENB D5 <------> IN3 D6 <------> IN4
6v外部供电电源的正极接在 L298N电机驱动板模块的+12V,负极接在 L298N电机驱动板模块的GND,一个电机接在OUT1和OUT2输出口,另外一个电机接在OUT3和OUT4输出口。
L298N电机驱动板模块可驱动两路直流电机,使能端ENA、ENB为高电平时有效,控制方式及直流电机状态表如下所示。
实现1:通过无线手柄左边的“上下左右”键实现前进、后退、左转、右转
Mixly 图形化编程程序
程序实现代码
- #include <PS2X_lib.h>
- PS2X ps2x;
- void setMotor(int speedpin,int dirpin, int speed)
- {
- if (speed == 0)
- {
- digitalWrite(speedpin, LOW);
- }
- else if (speed > 0)
- {
- digitalWrite(dirpin, LOW);
- analogWrite(speedpin, speed);
- }
- else
- {
- digitalWrite(dirpin, HIGH);
- analogWrite(speedpin, speed);
- }
- }
- void setup(){
- ps2x.config_gamepad(13,11,10,12, true, true);
- delay(300);
- pinMode(2, OUTPUT);
- pinMode(7, OUTPUT);
- pinMode(3, OUTPUT);
- pinMode(4, OUTPUT);
- digitalWrite(3, LOW);
- digitalWrite(4, LOW);
- pinMode(5, OUTPUT);
- pinMode(6, OUTPUT);
- digitalWrite(5, LOW);
- digitalWrite(6, LOW);
- }
- void loop(){
- ps2x.read_gamepad(false, 0);
- delay(30);
- digitalWrite(2,HIGH);
- digitalWrite(7,HIGH);
- if (ps2x.Button(PSB_PAD_UP)) {
- setMotor(3, 4,200);
- setMotor(5, 6,200);
- } else if (ps2x.Button(PSB_PAD_DOWN)) {
- setMotor(3, 4,-200);
- setMotor(5, 6,-200);
- } else if (ps2x.Button(PSB_PAD_LEFT)) {
- setMotor(3, 4,0);
- setMotor(5, 6,200);
- } else if (ps2x.Button(PSB_PAD_RIGHT)) {
- setMotor(3, 4,200);
- setMotor(5, 6,0);
- } else {
- digitalWrite(2,LOW);
- digitalWrite(7,LOW);
- }
- }
复制代码
实现2:通过按PS2左摇杆位置实现前进 、后退、左转、右转 手柄发送模式在红灯模式,Mixly图形化编程程序
- #include <PS2X_lib.h>
- PS2X ps2x;
- void setMotor(int speedpin,int dirpin, int speed)
- {
- if (speed == 0)
- {
- digitalWrite(speedpin, LOW);
- }
- else if (speed > 0)
- {
- digitalWrite(dirpin, LOW);
- analogWrite(speedpin, speed);
- }
- else
- {
- digitalWrite(dirpin, HIGH);
- analogWrite(speedpin, speed);
- }
- }
- void setup(){
- ps2x.config_gamepad(13,11,10,12, true, true);
- delay(300);
- pinMode(2, OUTPUT);
- pinMode(7, OUTPUT);
- pinMode(3, OUTPUT);
- pinMode(4, OUTPUT);
- digitalWrite(3, LOW);
- digitalWrite(4, LOW);
- pinMode(5, OUTPUT);
- pinMode(6, OUTPUT);
- digitalWrite(5, LOW);
- digitalWrite(6, LOW);
- }
- void loop(){
- ps2x.read_gamepad(false, 0);
- delay(30);
- digitalWrite(2,HIGH);
- digitalWrite(7,HIGH);
- if (ps2x.Analog(PSS_LY) < 100) {
- setMotor(3, 4,200);
- setMotor(5, 6,200);
- } else if (ps2x.Analog(PSS_LY) > 150) {
- setMotor(3, 4,-200);
- setMotor(5, 6,-200);
- } else if (ps2x.Analog(PSS_LX) < 100) {
- setMotor(3, 4,0);
- setMotor(5, 6,200);
- } else if (ps2x.Analog(PSS_LX) > 150) {
- setMotor(3, 4,200);
- setMotor(5, 6,0);
- } else {
- digitalWrite(2,LOW);
- digitalWrite(7,LOW);
- }
- }
复制代码 |