###### 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); } ```