###### tags: `Arduino` `Arduino 實作`
# PS2遙控-接收端程式
```cpp=
#include <Streaming.h>
#include <PS2X_lib.h> // 目前是1.6版
PS2X ps2x;
int error = 0;
byte type = 0;
byte vibrate = 0;
const int mtl[4] = {6,7,8,9};
const int mtr[4] = {2,3,4,5};
byte en[2] = {11,10};
byte sp = 15 0;
void(* resetFunc) (void) = 0;
void setup(){
Serial.begin(57600);
// 控制器接腳設置並驗證是否有錯誤: GamePad(時脈腳位, 命令腳位, 選取腳位, 資料腳位, 是否支援類比按鍵, 是否支援震動)
error = ps2x.config_gamepad(13,A1,A0,12, true, true);
while(error != 0) { // 如果控制器連接沒有問題,就顯示底下的訊息。
Serial<<"wait,"<<endl;
delay(1000);
resetFunc();
}
Serial<<"Found Controller, configured successful"<<endl;
type = ps2x.readType(); // 偵測控制器器的類型
switch(type) {
case 0:
Serial.println("Unknown Controller type"); // 未知的控制器類型
break;
case 1:
Serial.println("DualShock Controller Found"); // 發現DualShock控制器
break;
case 2:
Serial.println("GuitarHero Controller Found"); // 發現吉他英雄控制器
break;
}
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop(){
if(error == 1) // 如果沒發現任何控制器,則跳出迴圈。
return;
if(type == 1) { // 這是標準的DualShock控制器
ps2x.read_gamepad(false, vibrate); // 讀取控制器並且命令大的震動馬達以"vibrate"變數值的速度旋轉
if(ps2x.Button(PSB_START)) // 查看「開始」鍵是否被按住
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT)) // 查看「選擇」鍵是否被按住
Serial.println("Select is being held");
if(ps2x.Button(PSB_PAD_UP)) { // 若「上」按鍵被按著
Serial.print("Up held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);
}
if(ps2x.Button(PSB_PAD_RIGHT)){
Serial.print("Right held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);
}
if(ps2x.Button(PSB_PAD_LEFT)){
Serial.print("LEFT held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);
}
if(ps2x.Button(PSB_PAD_DOWN)){
Serial.print("DOWN held this hard: ");
Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);
}
vibrate = ps2x.Analog(PSAB_BLUE); // 依據你按著X按鍵的力道來調整馬達的震動強度
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_GREEN)) // 若被按下的是三角按鍵
Serial.println("Triangle pressed");
}
if(ps2x.ButtonPressed(PSB_RED)) // 若「按下」圈圈按鍵
Serial.println("Circle just pressed");
if(ps2x.ButtonReleased(PSB_PINK)) // 若「放開」方塊按鍵
Serial.println("Square just released");
if(ps2x.NewButtonState(PSB_BLUE)) // 若「按下」或「放開」叉叉按鍵
Serial.println("X just changed");
if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // 若按著PSB_L1或PSB_R1按鍵
{ // 顯示左右類比搖桿的值
Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY), DEC);
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);
}
}
if(ps2x.Button(PSB_L1)){
digitalWrite(mtl[0],0);
digitalWrite(mtl[1],1);
digitalWrite(mtl[2],1);
digitalWrite(mtl[3],0);
analogWrite(en[0],sp);
}else if(ps2x.Button(PSB_L2)){
digitalWrite(mtl[0],1);
digitalWrite(mtl[1],0);
digitalWrite(mtl[2],0);
digitalWrite(mtl[3],1);
analogWrite(en[0],sp);
}else{
digitalWrite(mtl[0],0);
digitalWrite(mtl[1],0);
digitalWrite(mtl[2],0);
digitalWrite(mtl[3],0);
analogWrite(en[0],0);
}
if(ps2x.Button(PSB_R1)){
digitalWrite(mtr[0],0);
digitalWrite(mtr[1],1);
digitalWrite(mtr[2],1);
digitalWrite(mtr[3],0);
analogWrite(en[1],sp);
}else if(ps2x.Button(PSB_R2)){
digitalWrite(mtr[0],1);
digitalWrite(mtr[1],0);
digitalWrite(mtr[2],0);
digitalWrite(mtr[3],1);
analogWrite(en[1],sp);
}else{
digitalWrite(mtr[0],0);
digitalWrite(mtr[1],0);
digitalWrite(mtr[2],0);
digitalWrite(mtr[3],0);
analogWrite(en[1],0);
}
delay(50);
}
```