2019年11月18日月曜日

WiredControllerというArduinoからI2C接続で使えるコントローラー(有線リモコン)を作ってみた


背景

ESP32やArduinoを使ってロボットを作る際にI2C通信で利用できるコントローラー(有線リモコン)が欲しかったので、WiredControllerという装置を作ってみました。
同様のコントローラーが欲しい人に使ってもらえたら嬉しいので、情報を共有します。

使ったもの

  • コントローラーを使いたい装置
    今回はM5Stackを利用しました。
  • コントローラーを使いたい装置にプログラムを書き込めるPC
    今回はArduino IDEでの使い方を共有します。
    M5Stackを利用するため、Arduino IDEにESP32のボード情報M5Stackのライブラリをインストールしてある前提で話を進めます。
  • WiredController
    I2C接続で利用できるコントローラー(有線リモコン)です。
    スイッチサイエンスで買えます。
    WiredController - スイッチサイエンス

装置とWiredControllerを接続

I2Cの信号線を装置に接続してください。
M5Stackなら固定用の突起を切断したgroveのケーブルで接続できます。



I2Cを3.3Vにpull upしたい場合は、I2Cのジャンパを盛ってください。
M5Stackで利用する場合は既にI2Cがpull upされているので不要です。


通常WiredControllerはアドレス0x20で動作していますが、「Jumper to change address」と書かれているジャンパを盛ると0x21で動作します。
2個のコントローラーを同時に接続したい場合や、アドレス0x21でコントローラーを利用したい場合は、コントローラーの上記のジャンパを盛ってください。

ライブラリをインストール

WiredControllerを少ないプログラムの記述量で使えるように、WiredContoller_asukiaaaというライブラリを公開しています。
Arduino IDEのライブラリマネージャーからインストールしてください。

ライブラリマネージャーはArduino IDEのスケッチ -> ライブラリをインクルード -> ライブラリを管理 を選ぶと開けます。

ライブラリマネージャーの検索欄に「WiredController」などと入力すると、WiredController_asukiaaaが出てくるので、インストールしてください。


ライブラリを利用して動作確認

シリアル通信で情報を確認

シリアル通信可能な装置(ほとんどのArduino)で行える動作確認方法です。

ファイル -> スケッチ例 -> WiredController -> ReadAndWrite を開き、装置に書き込んでください。


シリアルモニタを開くと、コントローラーとやり取りしている値を確認できます。



M5StackのLCDで情報を確認

LCDが付いたM5Stackで行える動作確認方法です。

ファイル -> スケッチ例 -> WiredController -> ReadAndWrite を開き、装置に書き込んでください。


M5StackのLCDにコントローラーとやり取りしている値が表示されます。


プログラムの概要


使用準備

利用するI2Cバスを引数にして、WiredControllerを呼び出します。
WiredControllerには初期化関数はありませんが、利用するI2CバスのWireをbeginしてください。
WiredController_asukiaaa controller(&Wire);

void setup() {
  Wire.begin();
}

値を書き込み

WiredController_asukiaaa_WriteInfoという型を使って、コントローラーに値を書き込めます。
write関数の戻り値が0なら書き込みが成功したことを意味します。
記事を買いている時点で対応しているのはLED1からLED4までの表示制御です。
WiredController_asukiaaa_WriteInfo wInfo;

void loop() {
  wInfo.led1 = false;
  wInfo.led2 = false;
  wInfo.led3 = false;
  wInfo.led4 = true;
  if (controller.write(wInfo) == 0) {
    // succeeded writing
  } else {
    // failed writing
  }
}


値を読み込み

WiredController_asukiaaa_ReadInfoという型で、コントローラーからの情報を受け取れます。
read関数の戻り値が0なら書き込みが成功したことを意味します。
記事を買いている時点で対応しているのは、これらです。
  • ボタン上下左右
  • ジョイスティックの上下アナログ値(1000~0: 下が0、上が1000)
  • ジョイスティックの左右アナログ値(1000~0: 左が0、右が1000)
  • ジョイスティックの押し込み
WiredController_asukiaaa_ReadInfo rInfo;

String getBooleanResultStr(bool target) {
  return target ? "true" : "false";
}

void loop() {
  if (controller.read(&rInfo) == 0) {
    Serial.println("JoystickHorizontal: " + String(rInfo.joystickHorizontal));
    Serial.println("JoystickVertical: " + String(rInfo.joystickVertical));
    Serial.println("btnTop: " + getBooleanResultStr(rInfo.btnTop));
    Serial.println("btnLeft: " + getBooleanResultStr(rInfo.btnLeft));
    Serial.println("btnRight: " + getBooleanResultStr(rInfo.btnRight));
    Serial.println("btnBottom: " + getBooleanResultStr(rInfo.btnBottom));
    Serial.println("btnJoy: " + getBooleanResultStr(rInfo.btnJoy));
  } else {
    Serial.println("Cannot read info from controller.");
  }
}

まとめ

I2Cで制御できるコントローラの値を、Arduino IDEで開発するM5Stackで、ライブラリを利用してやりとりできました。
ジョイスティックやボタンでの操作をしたい装置を作るときなどに、良かったら使ってみてください。

更新履歴

2019.11.28 スイッチサイエンスの販売ページのリンクを追加しました。

0 件のコメント :