arduino的PS2手柄控制測試:
#include <PS2X_lib.h>
#define PWMA 12
#define DIRA1 34
#define DIRA2 35
#define PWMB 8
#define DIRB1 37
#define DIRB2 36
#define PWMC 9
#define DIRC1 43
#define DIRC2 42
#define PWMD 5
#define DIRD1 26
#define DIRD2 27
#define PS2_DAT 52
#define PS2_CMD 51
#define PS2_SEL 53
#define PS2_CLK 50
PS2X ps2x;
#define MOTORA_FORWARD(pwm) do{digitalWrite(DIRA1,LOW); digitalWrite(DIRA2,HIGH);analogWrite(PWMA,pwm);}while(0)
#define MOTORA_STOP(x) do{digitalWrite(DIRA1,LOW); digitalWrite(DIRA2,LOW); analogWrite(PWMA,0);}while(0)
#define MOTORA_BACKOFF(pwm) do{digitalWrite(DIRA1,HIGH);digitalWrite(DIRA2,LOW); analogWrite(PWMA,pwm);}while(0)
#define MOTORB_FORWARD(pwm) do{digitalWrite(DIRB1,LOW); digitalWrite(DIRB2,HIGH);analogWrite(PWMB,pwm);}while(0)
#define MOTORB_STOP(x) do{digitalWrite(DIRB1,LOW); digitalWrite(DIRB2,LOW); analogWrite(PWMB,0);}while(0)
#define MOTORB_BACKOFF(pwm) do{digitalWrite(DIRB1,HIGH);digitalWrite(DIRB2,LOW); analogWrite(PWMB,pwm);}while(0)
#define MOTORC_FORWARD(pwm) do{digitalWrite(DIRC1,LOW); digitalWrite(DIRC2,HIGH);analogWrite(PWMC,pwm);}while(0)
#define MOTORC_STOP(x) do{digitalWrite(DIRC1,LOW); digitalWrite(DIRC2,LOW); analogWrite(PWMC,0);}while(0)
#define MOTORC_BACKOFF(pwm) do{digitalWrite(DIRC1,HIGH);digitalWrite(DIRC2,LOW); analogWrite(PWMC,pwm);}while(0)
#define MOTORD_FORWARD(pwm) do{digitalWrite(DIRD1,LOW); digitalWrite(DIRD2,HIGH);analogWrite(PWMD,pwm);}while(0)
#define MOTORD_STOP(x) do{digitalWrite(DIRD1,LOW); digitalWrite(DIRD2,LOW); analogWrite(PWMD,0);}while(0)
#define MOTORD_BACKOFF(pwm) do{digitalWrite(DIRD1,HIGH);digitalWrite(DIRD2,LOW); analogWrite(PWMD,pwm);}while(0)
#define SERIAL Serial
#define MAX_PWM 200
#define MIN_PWM 100
int Motor_PWM = 130;
void ADVANCE(){
MOTORA_FORWARD(Motor_PWM);MOTORB_FORWARD(Motor_PWM);
MOTORC_FORWARD(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}
void BACK(){
MOTORA_BACKOFF(Motor_PWM);MOTORB_BACKOFF(Motor_PWM);
MOTORC_BACKOFF(Motor_PWM);MOTORD_BACKOFF(Motor_PWM);
}
void LEFT_1(){
MOTORA_FORWARD(Motor_PWM);MOTORB_STOP(Motor_PWM);
MOTORC_STOP(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}
void LEFT_2(){
MOTORA_BACKOFF(Motor_PWM);MOTORB_FORWARD(Motor_PWM);
MOTORC_FORWARD(Motor_PWM);MOTORD_BACKOFF(Motor_PWM);
}
void LEFT_3(){
MOTORA_BACKOFF(Motor_PWM);MOTORB_STOP(Motor_PWM);
MOTORC_STOP(Motor_PWM);MOTORD_BACKOFF(Motor_PWM);
}
void RIGHT_1(){
MOTORA_FORWARD(Motor_PWM);MOTORB_STOP(Motor_PWM);
MOTORC_STOP(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}
void RIGHT_2(){
MOTORA_FORWARD(Motor_PWM);MOTORB_BACKOFF(Motor_PWM);
MOTORC_BACKOFF(Motor_PWM);MOTORD_FORWARD(Motor_PWM);
}
void RIGHT_3(){
MOTORA_STOP(Motor_PWM);MOTORB_BACKOFF(Motor_PWM);
MOTORC_BACKOFF(Motor_PWM);MOTORD_STOP(Motor_PWM);
}
void STOP(){
MOTORA_STOP(Motor_PWM);MOTORB_STOP(Motor_PWM);
MOTORC_STOP(Motor_PWM);MOTORD_STOP(Motor_PWM);
}
void UART_Control(){
char Uart_Date=0;
if(SERIAL.available())
{
Uart_Date = SERIAL.read();
}
switch(Uart_Date)
{
case 'A': ADVANCE(); break;
case 'B': RIGHT_1(); break;
case 'C': RIGHT_2(); break;
case 'D': RIGHT_3(); break;
case 'E': BACK(); break;
case 'F': LEFT_3(); break;
case 'G': LEFT_2(); break;
case 'H': LEFT_1(); break;
case 'Z': STOP(); break;
case 'L': Motor_PWM = 240; break;
case 'M': Motor_PWM = 130; break;
}
}
void IO_init(){
pinMode(PWMA, OUTPUT);
pinMode(DIRA1, OUTPUT);
pinMode(DIRA2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(DIRB1, OUTPUT);
pinMode(DIRB2, OUTPUT);
pinMode(PWMC, OUTPUT);
pinMode(DIRC1, OUTPUT);
pinMode(DIRC2, OUTPUT);
pinMode(PWMD, OUTPUT);
pinMode(DIRD1, OUTPUT);
pinMode(DIRD2, OUTPUT);
STOP();
}
void setup(){
int error,type;
Serial.begin(9600);
delay(300) ;
ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, false, false);
type = ps2x.readType();
switch (type) {
case 0:
Serial.print("Unknown Controller type found ");
break;
case 1:
Serial.print("DualShock Controller found ");
break;
case 2:
Serial.print("GuitarHero Controller found ");
break;
case 3:
Serial.print("Wireless Sony DualShock Controller found ");
break;
}
IO_init();
}
void loop() {
byte vibrate = 0;
UART_Control();
ps2x.read_gamepad(false, vibrate);
if (ps2x.Button(PSB_START)) {
Serial.println("Start");
Motor_PWM = 90;
ADVANCE();
}
if (ps2x.Button(PSB_PAD_UP)) {
Serial.println("Up held this hard: ");
Motor_PWM = 120;
ADVANCE();
}
if (ps2x.Button(PSB_PAD_DOWN)) {
Serial.println("Down held this hard: ");
Motor_PWM = 120;
BACK();
}
if (ps2x.Button(PSB_PAD_LEFT)) {
Serial.println("turn left ");
Motor_PWM = 120;
LEFT_1();
}
if (ps2x.Button(PSB_PAD_RIGHT)) {
Serial.println("turn right");
Motor_PWM = 120;
RIGHT_1();
}
if (ps2x.Button(PSB_SELECT)) {
Serial.println("stop");
STOP();
}
if (ps2x.Button(PSB_PINK)) {
Serial.println("motor_pmove_left");
LEFT_2();
}
if (ps2x.Button(PSB_RED)) {
Serial.println("motor_pmove_right");
RIGHT_2();
}
vibrate = ps2x.Analog(PSAB_CROSS);
if (ps2x.NewButtonState()) {
if(ps2x.Button(PSB_L3))
Serial.println("L3 pressed");
if(ps2x.Button(PSB_R3))
Serial.println("R3 pressed");
if(ps2x.Button(PSB_L2))
Serial.println("L2 pressed");
if(ps2x.Button(PSB_R2))
Serial.println("R2 pressed");
if(ps2x.Button(PSB_TRIANGLE))
Serial.println("Triangle pressed");
}
int LX,LY,RX,RY;
LY=ps2x.Analog(PSS_LY);
LX=ps2x.Analog(PSS_LX);
RY=ps2x.Analog(PSS_RY);
RX=ps2x.Analog(PSS_RX);
Serial.print("Stick Values:");
Serial.print(LY);
Serial.print(LX);
Serial.print(RY);
Serial.println(RX);
delay(20);
}