#include <PS2X_lib.h>
PS2X ps2x;
//right now, the library does NOT support hot-pluggable controllers, meaning
//you must always either restart your Arduino after you connect the controller,
//or call config_gamepad(pins) again after connecting the controller.
//说明:线连接好后,ps2手柄,前车往前移动,后-车往后移动....
int error = 0;
byte type = 0;
byte vibrate = 0;
// 电机控制引脚;
#define IN1 4
#define IN2 5
#define IN3 6
#define IN4 7
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(57600);
delay(300) ;
error = ps2x.config_gamepad(13, 11, 10, 12, true, true); //GamePad(clock, command, attention, data, Pressures?, Rumble?)
if (error == 0) {
Serial.println("发现控制器,配置成功!successful");
//Serial.println("尝试所有的按钮,X将振动控制器,更快的为你按困难;");
//Serial.println("持有L1或R1将打印出的模拟值。");
//Serial.println("去
http://www.billporter.info更新和报告错误。");
}
else if (error == 1)
Serial.println("没有发现控制器,检查线路");
else if (error == 2)
Serial.println("控制器发现但不接受命令");
else if (error == 3)
Serial.println("控制器拒绝进入按钮模式,可能不支持它");
type = ps2x.readType();
switch (type) {
case 0:
Serial.println("未知的控制器类型");
break;
case 1:
Serial.println("发现dualshock手柄控制器");
break;
case 2:
Serial.println("发现GuitarHero手柄控制器");
break;
}
}
void loop() {
/* 你必须阅读手柄新值
ps2x read_gamepad(小电机开/关,大运动强度从0 - 255)
如果你不使轰鸣,使用ps2x.read_gamepad ();没有值
至少你应该称之为一次
*/
if (error == 1)
return;
if (type == 2) {
ps2x.read_gamepad(); //read controller
if (ps2x.ButtonPressed(GREEN_FRET))
Serial.println("Green压紧");
if (ps2x.ButtonPressed(RED_FRET))
Serial.println("Red压紧");
if (ps2x.ButtonPressed(YELLOW_FRET))
Serial.println("Yellow压紧");
if (ps2x.ButtonPressed(BLUE_FRET))
Serial.println("Blue压紧");
if (ps2x.ButtonPressed(ORANGE_FRET))
Serial.println("Orange压紧");
if (ps2x.ButtonPressed(STAR_POWER))
Serial.println("电源开启命令");
if (ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed
Serial.println("向上");
if (ps2x.Button(DOWN_STRUM))
Serial.println("向下");
if (ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed
Serial.println("Start按下");
if (ps2x.Button(PSB_SELECT))
Serial.println("Select按下");
if (ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE
{
Serial.print("摇杆:");
Serial.println(ps2x.Analog(WHAMMY_BAR), DEC);
}
}
else { //DualShock Controller
ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed
if (ps2x.Button(PSB_START)){ //will be TRUE as long as button is pressed
Serial.println("Start按下");
}else if (ps2x.Button(PSB_SELECT)){
Serial.println("Select按下");
}else if (ps2x.Button(PSB_PAD_UP)) { // 前
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
Serial.print("---------向前---------");
digitalWrite(IN1, LOW); //电机1 低电频
digitalWrite(IN2, HIGH); //电机2 高电频
digitalWrite(IN3, HIGH);//电机3 高电频
digitalWrite(IN4, LOW); //电机4 低电频
}else if (ps2x.Button(PSB_PAD_RIGHT)) { // 右
Serial.print("---------右转---------");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}else if (ps2x.Button(PSB_PAD_LEFT)) { // 左
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
Serial.print("---------左转--------- ");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}else if (ps2x.Button(PSB_PAD_DOWN)) { // 后
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
Serial.print("---------后退---------");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}else if(ps2x.Button(PSB_SELECT)){ // SELECT
Serial.print("---------停---------");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}else{ // 没有任何操作,停止电机转动
Serial.print("---------停---------");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
vibrate = ps2x.Analog(PSAB_BLUE); //this will set the large motor vibrate speed based on
//how hard you press the blue (X) button
if (ps2x.NewButtonState()) //will be TRUE if any button changes state (on to off, or off to on)
{
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_GREEN))
Serial.println("Triangle pressed");
}
if (ps2x.ButtonPressed(PSB_RED)) //will be TRUE if button was JUST pressed
Serial.println("Circle just pressed");
if (ps2x.ButtonReleased(PSB_PINK)) //will be TRUE if button was JUST released
Serial.println("Square just released");
if (ps2x.NewButtonState(PSB_BLUE)) //will be TRUE if button was JUST pressed OR released
Serial.println("X just changed");
if (ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE
{
Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC);
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC);
}
}
delay(50);
}