Arduino結合PS2無線手把簡單上手
許多智慧車的專案控制方式很多,最簡單的用紅外線,很多則是用藍牙,但其實PS2無線手把如果用在遙控車子真的是非常適合。
但很多人覺得PS2手把的接收器要接很多線,又要用完全不熟的函式庫,會害怕有些困難,其實不會的啦,PS2的無線接收器上有9個PIN,但用得到的只有6個,其中還有GND和VCC,所以只要把另外4條線接對,就沒問題了!
那我們就開始做囉!首先最重要的,就是先安裝PS2X的函式庫。這個比較麻煩一點,因為無法從Arduino IDE的程式管理員中找到(目前為止),所以要自行去下庫,再把它放到電腦裡Arduino的libraries目錄裡。
下載網址:https://github.com/madsci1016/Arduino-PS2X
再來就是接線囉!不難的,下圖傑森把9個PIN的名稱都畫出來了,想弄錯也很難吧!
因為傑森想讓這個範例也可以用在PS2馬達擴展板上,所以接線方式就要照該板子的設計囉!
- Clock:13
- Command:11
- Attention:10
- Data:12
Ground接到GND,Power請接到3.3V哦!
接下來就可以把傑森寫的範例上傳到Arduino囉。
/*
本範程式為PS2X無線手把程式
請先安裝PS2X函式庫,網址:
https://github.com/madsci1016/Arduino-PS2X
傑森創工製作
粉絲團:
https://www.facebook.com/jasonshow
傑森創工部落格:
https://blog.jmaker.com.tw/
傑森創工賣場:https://www.jmaker.com.tw
*/
#include "PS2X_lib.h"
PS2X ps2x;
int error;
void setup() {
Serial.begin(9600);
//配對接收器
do {
//GamePad(clock, command, attention, data, Pressures?, Rumble?)
error = ps2x.config_gamepad(13, 11, 10, 12, true, true); //這行要和接線對應正確
if (error == 0) { Serial.print("Gamepad found!");break; }
else { delay(100); }
} while (1);
}
void loop(){
ps2x.read_gamepad(false, 0); //讀取手把狀態
//測試每一個按鈕和搖桿
if(ps2x.Button(PSB_START)) //Start鍵
Serial.println("Start is being held");
if(ps2x.Button(PSB_SELECT)) //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);
}
if(ps2x.NewButtonState(PSB_L3)) //L3鍵,NewButtonState按下不管多久只會觸發兩次(按下和放開)
Serial.println("L3 pressed");
if(ps2x.NewButtonState(PSB_R3)) //R3鍵
Serial.println("R3 pressed");
if(ps2x.NewButtonState(PSB_L2)) //L2鍵
Serial.println("L2 pressed");
if(ps2x.NewButtonState(PSB_R2)) //R2鍵
Serial.println("R2 pressed");
if(ps2x.NewButtonState(PSB_TRIANGLE)) //三角按鍵
Serial.println("Triangle pressed");
if(ps2x.NewButtonState(PSB_CIRCLE)) //圓型按鍵
Serial.println("Circle pressed");
if(ps2x.NewButtonState(PSB_CROSS)) //X按鍵
Serial.println("X pressed");
if(ps2x.NewButtonState(PSB_SQUARE)) //方型按鍵
Serial.println("Square pressed");
if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //按下L1或L2鍵,顯示兩個香菇頭的數值
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); //右,左右
}
delay(10);
}
這支程式真的沒什麼難度,主要是這行是設定4個PIN的編號:
ps2x.config_gamepad(13, 11, 10, 12, true, true);
然後這行是讀取手把傳來的訊息,用來分析操作者按了哪些按鈕。
read_gamepad(false, 0);
其它的程式碼就是讀取所有的按鈕或是搖桿,只要看一下就能理解了!
PS2無線手把常見的配件主要有2項:一個是方便接線的轉接板,一個就是整合PS2無線手把和馬達控制的擴展板。
如果你只需要PS2無線手把,不需要馬達,那建議弄個轉接板,接線會比較容易,PS2的那個無線接收器,接杜邦線真的有些辛苦。
PS2無線接收器轉接板賣場:https://reurl.cc/W4vvQ5
若是你要做車子,那真的強烈建議你用那塊PS2馬達擴展板了,基本上都不用接線了,程式寫一寫,車子就能跑了!
PS2無線手把馬達擴展板賣場:https://reurl.cc/31xW7X