mbedでVS-C3を使ってみた

mbedでvstoneのコントローラVS-C3を使ってみました。その使い方をメモ。
このコントローラはPS2のコントローラ(DUALSHOCK2)と(信号の)互換性があるのでDUALSHOK2でも同様にmbedで扱えると思います。

利用するライブラリはSugaKoubouさんのPS_PADです。
https://developer.mbed.org/users/okini3939/code/PS_PAD/

サンプルプログラムはこちら。
https://developer.mbed.org/users/ds074704261/code/PSController_Sample/

接続方法はサンプルプログラムにコメントとして書いておきました。このエントリにも抜粋します。

/*
 * ======================
 * VS-C3/VS-RCV3 PIN
 * ======================
 * 1:NC  2:NC
 * 3:DAT 4:CMD
 * 5:SEL 6:CLK
 * 7:+5~7V 8:NC
 * 9:+3V 10:GND
 *
 */

この中で必要なのは

  • DAT
  • CMD
  • SEL
  • CLK
  • +3V
  • GND

以上6ピンです。

main.cppでは以下のようにして接続するピンを定義します。SPIを利用しているので、mbed(LPC1768/LPC1769)では利用できるピンはp5-p7またはp11-p13です。今回はp5-p7を利用しています。

mbed_pin

PS_PAD vsc3(p5, p6, p7, p21); 

PS_PAD.cppでは以下の順番で関数が定義されているので順番に気をつけてください。

PS_PAD::PS_PAD (PinName mosi, PinName miso, PinName sck, PinName cs) : _spi(mosi, miso, sck), _cs(cs) {
    _spi.format(8, 3);
    _spi.frequency(250000);
    _cs = 1;
    _vib1 = 0;
    _vib2 = 0;
    _connected = false;
}

名称については以下の通りです。

 信号名  SPIの信号名 
 DAT  MISO 
 CMD  MOSI 
 SEL  SS/CS 
 CLK  SCK 

あとはサンプルの通り、vsc3.poll();したあと、
vsc3.read(PS_PAD::PAD_CIRCLE)などでボタンの状態を取得できます。
ボタンは以下の通りです。

  • PAD_LEFT
  • PAD_BOTTOM
  • PAD_RIGHT
  • PAD_TOP
  • PAD_START
  • ANALOG_LEFT
  • ANALOG_RIGHT
  • PAD_SELECT
  • PAD_SQUARE
  • PAD_X
  • PAD_CIRCLE
  • PAD_TRIANGLE
  • PAD_R1
  • PAD_L1
  • PAD_R2
  • PAD_L2

アナログスティックの状態は以下の4つに分けられますが、PS_PAD.cppの中で現在値-0x80して128引かれているので注意が必要です。

  • ANALOG_RX
  • ANALOG_RY
  • ANALOG_LX
  • ANALOG_LY

ループのなかにwait()を入れるのを忘れないように注意してください。サンプルでは0.05sec確保しています。

VS-C3

V-controller3取扱説明書

ただ単に動かすだけならばインポートし、編集するだけで十分だとは思いますが、詳しく理解するためには以下のサイトが便利です。

プレイステーション用コントローラDUALSHOCK2でロボを動かす
http://homepage3.nifty.com/nisokuda-yahhoi/dualshock2.htm

【【【【【 デュアルショック2(SCPH-10010)の新機能使用方法 】】】】】
http://applause.elfmimi.jp/dualshock/millar/NT/dualshock_2.txt

【【【【【 デュアルショック(SCPH-1200)の解析 】】】】】
https://applause.elfmimi.jp/dualshock.txt

プレイステーション・PAD/メモリ・インターフェースの解析
http://kaele.com/~kashima/games/ps_jpn.txt

電子工作:DualShock2(PS2コントローラ)の信号解析サイトとコントローラ考察 | Scratchpad
http://www.usagi1975.com/20140731610/

ちなみにAVRで扱う場合はこちらのページが参考になるかと思います。
AVRでPS2コントローラーを使ってみた – 夕天の技術書
http://sekiten42.hatenablog.com/entry/2015/01/05/225304

コメント

  1. 河合章宏 より:

    大阪工業大学ロボットプロジェクトの河合です。
    mbed Nucleoでdualshock2を使おうと思い、ライブラリをいれてサンプルプログラムを参考にして、プログラムを書いたのですがうまくいきません。
    メインプログラムを添付しておくので、改善点があれば教えてください。

  2. 河合章宏 より:

    すみません
    添付できなかったのでメールを送ってもらえれば返信で添付します。

    • Tiryoh より:

      河合さん

      コメントありがとうございます。
      こちらにプログラムを保存してURLを貼っていただけますでしょうか?
      ttps://gist.github.com/

  3. 河合章宏 より:
  4. 河合章宏 より:

    ライブラリに関しては、いじっていません。

    • Tiryoh より:

      河合さん

      プログラム、拝見しました。
      プログラム自体には問題ないと思います。
      あとはあるとしたら接続ピンの問題だと思います。使っているマイコンボードの正式な型番はわかりますか?

  5. 河合章宏 より:

    Nucleo F401REを使っています。

    • Tiryoh より:

      河合さん

      私もF401REとLPC1769で試してみました。
      同じプログラムを利用しました(ピン番号のみ変更)。
      結果、LPC1769では問題ありませんでしたが、F401REではSPI通信がうまくいきませんでした。
      インクルードしているmbed.hにバグがある状態だと思われます。
      F401REのSPIには問題があることが報告されていましたので、そのうち修正されるとは思います。ですが、早めにDUALSHOCK2を使用したい場合には使うマイコンボードを変更されるのがよいかと思います。
      お役に立てず申し訳ないです。

  6. 河合章宏 より:

    自分一人では、どうにもならなかったので助かりました。
    ありがとうございます。