創るたのしみを応援

Cytron PS2シールドをArduinoで動かしてみた

PS2コントローラを手軽に使えるArduino Shieldを動かしてみた。操作性が良いプレステ2のコントローラを使って、ロボットを制御できるようになります。

準備

使用するハードウェア

  • Arduino Uno [suzaku-shop code=’Pololu-2191′]
  • Cytron PS2 SHIELD [suzaku-shop code=’CYTRON-SHIELD-PS2′]
  • PS2コントローラー
  • USBケーブル (Arduino書き込み・通信用)

[itemlink post_id=”245″]

開発環境

  • Windows7
  • ArduinoIDE 1.8.5

ArduinoIDEへライブラリの追加

Cytron社が出している専用ライブラリがGithubで公開されているのでダウンロードします。
https://github.com/CytronTechnologies/Cytron_PS2Shield


ArduinoIDEを開いて、上のバーの”スケッチ”→”ライブラリをインクルード”→”Zip形式のライブラリをインストール…”を押して先ほどダウンロードしたファイルを選択します。

接続方法

今回使ったのはシールド版なので差し込むだけで接続は完了です。

関数とボタンの割り当て

ボタン系

// readButton関数
name.readButton(引数);

// "name"は、宣言時の任意の文字列
// 戻り値は、unsigned char型

この関数に調べたいボタンの引数を代入することで、ボタンが押されているか押されていないか判定できます。†††

戻り値

  • 0: 押されている状態
  • 1: 押されていない状態

引数一覧(ボタン一覧)

  • PS2_SELECT
  • PS2_JOYSTICK_LEFT
  • PS2_JOYSTICK_RIGHT
  • PS2_START
  • PS2_LEFT
  • PS2_RIGHT
  • PS2_UP
  • PS2_DOWN
  • PS2_LEFT1
  • PS2_LEFT2
  • PS2_RIGHT1
  • PS2_RIGHT2
  • PS2_TRIANGLE
  • PS2_CIRCLE
  • PS2_CROSS
  • PS2_SQUARE

ジョイスティック系

先ほどと同じreadButton関数に、調べたいスティックの軸の引数を代入することで、現在のスティックの座標を調べることができます。

戻り値

  • 0~255 (AXIS系)
  • 0~100 (UP, DOWN, LEFT, RIGHT系)

引数一覧(ジョイスティック)

  • PS2_JOYSTICK_LEFT_X_AXIS
  • PS2_JOYSTICK_LEFT_Y_AXIS
  • PS2_JOYSTICK_RIGHT_X_AXIS
  • PS2_JOYSTICK_RIGHT_Y_AXIS
  • PS2_JOYSTICK_RIGHT_UP
  • PS2_JOYSTICK_RIGHT_DOWN
  • PS2_JOYSTICK_RIGHT_LEFT
  • PS2_JOYSTICK_RIGHT_RIGHT
  • PS2_JOYSTICK_LEFT_UP
  • PS2_JOYSTICK_LEFT_DOWN
  • PS2_JOYSTICK_LEFT_LEFT
  • PS2_JOYSTICK_LEFT_RIGHT

モーター系

// vibrate関数
name.vibrate(motor,value);

// "name"は、宣言時の任意の文字列
// 戻り値なし

関数に、下の表の引数を代入すると、コントローラのモーターを動かすことができます。

引数motorvalue
Bigmotor00~255
Smallmotor10 or 1

プログラム

簡単に動作テストのコードを書いてみました。

左スティックのx座標とy座標の値がシリアルモニタに表示されます。またセレクトボタンを押すとArduino Uno上のLEDが点灯します。

#include <Cytron_PS2Shield.h>
#include <SoftwareSerial.h>

Cytron_PS2Shield ps2(2,3);

/* 初期設定 */
void setup() {
  ps2.begin(9600);
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

/* メイン */
void loop() {
  //check select_button
  if(ps2.readButton(PS2_SELECT)==0){
    digitalWrite(LED_BUILTIN,HIGH);
  }
  else{
    digitalWrite(LED_BUILTIN,LOW);
  }
  //check LEFT_X_joystick
  Serial.print("X Axis val:");
  Serial.print(ps2.readButton(PS2_JOYSTICK_LEFT_X_AXIS));
  Serial.print(" ");
  Serial.print("Y Axis val:");
  Serial.println(ps2.readButton(PS2_JOYSTICK_LEFT_Y_AXIS));
  delay(50);
}

動作確認

ボタンもスティックも正常に動作しました。

シリアルモニタでジョイスティックの値を確認すると、x座標y座標共に0~255の間で値が返ってくることが分かりました。触っていないときは中央値である128が返ってきます。以下の画像はデーシートから引用した画像です。

接続から動作までArduinoなら簡単にできました。Robo-Oneなどのロボットを動かすときに役立ちそうですね。

参考サイト

[itemlink post_id=”245″]