まえがき
ながーいので、急ぐ方は以下の「本題」にお進みください。
今年の卒業研究発表会が今週土曜日(20日)にあります。いよいよ大詰めです。先週末までに要旨(A4版)をなんとか全員書き終え、本日、第1回目のプレゼン練習会でした。今年の研究の1つに格ゲーの自動防御システムを作っている方がいます。相手が攻撃してきたら画像認識して自動で防御する操作をゲーム機(Nintendo Switch)に対して送るという練習支援システムです。ゲームコントローラの操作に加えて、自動補助操作を送るため、来栖川電算社製のGame Controllerizerを利用させてもらっています。おなじみスイッチサイエンスから購入できます。このボードを利用するため40ピンヘッダをはんだづけする必要があるのですが、どうやらその学生さんがはんだづけ経験がなくて壊してしまったのかもといことでした。はんだづけ前まで動作していたがはんだづけ後に応答しなくなったとのことでした。
実はこのデバイスの開発者の方と一昨年末に大垣で開催されたミニメイカーフェアで知り合いましてそういう装置があることを教えてもらったところでした。自分なりに色々試したのですがわからず、お忙しいところ大変申し訳なかったのですが、連絡させていただいて動作確認方法など教えていただきました。それが先週末でした。結局、その装置はやはり故障していたようで、とりあえず新しいものをスイッチサイエンスに発注し、昨日、自宅に届いて動作させたところでした。到着した商品は確かに動作することを確認できました。学生さんにも渡すことができて、最終デモの映像が撮影できそうでよかったな。。。というところです。
このやりとりのときに色々教えてもらったり確認用のソースコードも提供していただいたので、自分のメモ用(すぐに忘れるはずなので)にここにまとめさせていただこうと思います。では、スタート。
本題
さて、本題です。用意する(した)ものは以下です。
- Arduino Nano(Arduino系ならなんでもいいはずですがピン配置が同じじゃないかもです)
- Raspberry Pi Zero(Raspi系ならなんでもいいはずですがピン配置が同じじゃないかもです)
- ブレッドボード
- ジャンパーワイヤー3本
- ピンヘッダ(3本あれば十分、Game Controllerizerに直ではんだづけするならピンヘッダは不要)
- USBポートが2つ以上ついたパソコン(WindowでもMacでもOKでした)
- USBケーブル(Nano用とRaspi用それぞれ)
まず、配線。Rapi〜Arduino間でUART通信するためジャンパーワイヤ3本を以下のように接続します(余談ですが、一般的にはUARTではTX-RXと交差するように接続するはずですが、ピン配列や基板上のマークを見る限りTX-TX、RX-RXという接続をしているかのようになります、たぶん、表記の意味が違うんだと思いますが勘違いしやすいので要注意です)。
PCとArduino NanoをUSBケーブルで接続し、Arduino IDEで以下のコード(Game Controllerizerの開発者の方からいただきました、公開許可は得ていませんが...たぶん、同じように問題のある方のためになるのでよいかと判断しています)をArduino Nanoに書き込みます。
const int LED_PIN = 13; uint16_t button_id = 0x01; uint8_t cmd[4]; void setup() { // G.C.との通信速度は115200固定 Serial.begin(115200); pinMode(LED_PIN, OUTPUT); } void loop() { // LED blink digitalWrite( LED_PIN, HIGH ); delay( 1000 ); digitalWrite( LED_PIN, LOW ); delay( 1000 ); // ボタンIDを0~15まで順に変更する button_id = button_id == 0x80 ? 0x01 : (button_id << 1); // G.C.むけコマンドの発行 // cmd-0 : コマンドの種類.詳細は一覧表参照. // - 0xC1 : ボタン操作コマンド cmd[0] = 0xc1; // cmd-1 : ボタンを押す時間 // - 0x00 : 特殊(基本使わない) // - 0x01~0x7F : n frameの間ボタンを押す // - 0xFF : 押しっぱなし cmd[1] = 0xFF; // cmd-2/3 : 16ボタンに対応.bitが1の場合,そのボタンを押す // 2つ以上のbitが同時に1の場合は,同時にボタンを押す cmd[2] = button_id; cmd[3] = button_id >> 8; // UARTでコマンドを送り出す // 送り出しペースは 10~20回/1sec程度にすること // あまりに早いとハングする Serial.write(cmd, 4); }
つづいて、Game ContollerizerとPCをUSBケーブルで接続します。Game ContollerizerはPCからみるとゲームコントローラとして認識されます。その操作信号をこのUSBケーブル経由で受け取る感じになります。操作情報をPCで見るためのツールが開発者サイトで用意されています。
使うのはHTML5 Gamepad Testerというツールです。Game ControllerizerがPCにコントローラとして認識されると、以下のような画面になります。これがちょっと難しい(サクッと認識されるときもあれば、USBケーブルを抜き差ししたり、Game Controllerizer上のRESETボタンを押したりしないと認識されない場合もありますのでちょっと試行錯誤してみてください)。上記のArduinoのコードが正常に動作すると、この画面では4〜11の◯が赤丸となり1秒感覚で順番に点灯していきます。
このときに、マイコンのランプ状態は以下のようになります。①の部分でLと表記されたLEDが1秒ごとに点滅します。そのときに一瞬ですがTXというLEDが点灯します。見にくいですがLEDを指で覆うと見やすくなります。TXが点灯したときにUART経由でGame Controllerizerに対して操作情報が送られるようです。
そして、Game Controllerizer上にもLEDがあると思います。②の部分です。PWRはUSBケーブルから給電されていれば常時点灯しています。RESETボタンを押下した直後にCMDが3回点滅します。これがGame Controllerizerが正常に初期化されたことを表すんだそうです。で、Arduinoから操作情報を受信するとこのCMDが一瞬点灯します。これでUART経由でデータを受信できていることがわかる、ということです。
以上がすべて動作すれば正常動作しているということになります。
以下の写真は正常動作している様子になります。WindowsでもMacでも動作確認できました。
破損したGame Controllerizerでは、ArduinoのTXが点灯しているのですが、Game ControllerizerのCMDは消灯したままでした。どういう状況かはハードウェア的な話しなのでわかりませんが、どこかの部品がはんだづけで焼損したものと思われます。
最後に、この確認をするときのポイントを3点、再度、挙げておきます。
- ジャンパーワイヤの接続は、ネットの資料だけみると一見して勘違いするケースがあると思います。教えていただいた開発者の方も私もよくミスすることがあると仰っていました。
- Game Controllerizerで操作情報を正常に受信したときにはCMDが点灯します。これが点灯しない限り、ジャンパーワイヤの結線か、Arduino等のUARTの送信元のコードやハードの設定ミスが考えられます。
- 確認用のHTML5 Gamepad TesterはEdge、Chrome、Braveで動作しました。Game ControllerizerがPCに認識されてブラウザ上に表示されるまでがちょっと試行錯誤が必要です。すぐに諦めずに色々と(ArduinoやGame ControllerizerのRESETボタン押下、USBケーブルの抜き差しなど)試してみてください。
長くなりましたが、一応、今、私の頭の中にあるメモでした。でわでわ。
最後になりましたが、素晴らしい機器を提供してくださり、ありがとうございました。来年度から学生実験やエンタメ作品制作などで色々使わせていただこうと思います。