許多智慧車的專案控制方式很多,最簡單的用紅外線,很多則是用藍牙,但其實PS2無線手把如果用在遙控車子真的是非常適合。

但很多人覺得PS2手把的接收器要接很多線,又要用完全不熟的函式庫,會害怕有些困難,其實不會的啦,PS2的無線接收器上有9個PIN,但用得到的只有6個,其中還有GND和VCC,所以只要把另外4條線接對,就沒問題了!

那我們就開始做囉!首先最重要的,就是先安裝PS2X的函式庫。這個比較麻煩一點,因為無法從Arduino IDE的程式管理員中找到(目前為止),所以要自行去下庫,再把它放到電腦裡Arduino的libraries目錄裡。

下載網址:https://github.com/madsci1016/Arduino-PS2X

再來就是接線囉!不難的,下圖傑森把9個PIN的名稱都畫出來了,想弄錯也很難吧!

PS-1

因為傑森想讓這個範例也可以用在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