mbedで無線DualShock2を使う


1.はじめに

PS2のコントローラーを無線で使いたかったので、大阪日本橋でそれっぽいのをかってきました。が、逆電圧をかけてすぐに受信モジュールを殺しました。そこで、amazonにてこういうものをプライムして使ったときにちょっと詰まったので、その話。
mbedで有線のPS2を使うとき、pspad.hというライブラリをいつも使っていましたが、それがそのまま使えなかった(ちょっとずれて値が出力されると言える)ので、それの解決策です。
オシロスコープなどで波形を見たり,入力されたデータなどを保存していたのですが,写真とかをまったく残していなかったので省略します.需要があれば,コメントをいただけると何らかの対応をするかもです.

2.理論

PS2コントローラーは、SPI通信でデータを送信しています。SPI通信には4種類のモードがあり、PS2のはMode3が使われています。このモードの違いによって,クロックの立ち上がり/立ち下がりや,正論理/負論理の違いがあります.モードの詳細な内容はしなぷすさんのページが参考になります.購入したコントローラのSPI通信のモードが違ったようなので,クロックのタイミングを変更することで解決を試みました.

3.解決方法

pspad.hの56行目から82行目までを↓のように書き換えることで,クロックのタイミングを変更します.

    for(i=0; i<8; i++){
        // 送信データ
        if(send_data & 0x01) PS_CMD_H;
        else PS_CMD_L;

        PS_CLK_H; // クロックをHIGHに
        while(tm.read_us()/TM_PERI <= 2*i); //待機

        PS_CLK_L; // クロックをLOWに
        while(tm.read_us()/TM_PERI <= 2*i+1); // 待機
        recv_data |= (PS_DAT<<i); // 受信データ

        send_data >>= 1; // 送信データを1ビットずらす
    }

    PS_CMD_H; // CMDをHIGHに戻す
    PS_CLK_H; // CLKをHIGHに戻す

4.おわりに

ここに書いた解決方法は,あくまでもamazonでぽちったやつを動かす方法なので有線や,ほかのコントローラで有効か知りません.ベースとして使わせていただいたpspad.hの製作者の 太郎 九大 さん,ありがとうございます(SPI通信をすべて自力で実装はイケメン).

参考文献