ロビのシリアルバスその2
2015年12月3日
12月14日改訂


 前回はロビのシリアルバス経由で音声認識基板からデータを読み取ってロビ目に表示しました。
 今回はLED基板からデータを読み取ってロビ目にパターンを表示します。

 今までLED基板から目のLEDへの出力をArduinoのアナログ入力で読み取ってパターンデータに変換していました。
 しかし出力をHIとLOWの2値に変換していたので両目でも6ビットのデータにしか変換できないので64個のパターンしか定義できませんでした。
 また入力に6PIN使っているため両目に違うパターンを表示する様にするにはPIN数が足らなくなってしまいました。

 そこで今回、シリアルバスからLED基板の目のLEDに対する出力値を直接読み取っててれをパターンに変換します。
 また右目のパターンは右のLEDに対するデータ、左目のパターンは左のLEDに対するデータとします。
 理論的にはそれぞれRGBの値があるので256の3乗=16,777,216個のパターンが定義できる事になります。
 実際はArduinoのメモリの制限もあるので今回はB値のみ使って256種類のパターンで行いました。

 前回はArduinoの開発環境(IDE)のWireライブラリィを使っていたのですがバス衝突が起こってArduinoが途中でフリーズするという不具合がありました。
 そのため今回はSoftI2CMasterというライブラリィを使用しています。



 SoftI2CMasterの入手方法とArduino IDEへのインストール方法について説明します。
 ライブラリィは以下のURLよりダウンロードしてください。

  https://github.com/felias-fogg/SoftI2CMaster

 画面のDownload ZIPボタンてダウンロードできます。
 SoftI2CMaster-master.zipというZIPファイルがダウンロードされます。



 C:/Program Files/Arduino/librariesにSoftI2CMasterというフォルダーを作成します。
 なおこの場所はArduino IDEをインストールした場所やIDEのレビジョンで違う場合があります。
 SoftI2CMaster-master.zipを開いてSoftI2CMaster.hというファイルをSoftI2CMasterフォルダーに入れてください。
 これでArduinoのスケッチで#include <SoftI2CMaster.h>という記述でSoftI2CMasterが使用できます。
 なおIDEを立ち上げた時に使用できるライブラリィがチェックされるようなのでIDEが立ち上がっていた場合はSoftI2CMasterフォルダー作成後にIDEを再起動し直してください。

 ダウンロードしたZIPファイルにはサンプルプログラムが含まれています。
 この中のexamplesにI2CSanSoftというスケッチが含まれていますがこれは接続されているI2Cデバイスをスキャンするもので先日紹介したものと同じような機能があります。
 このスケッチはI2Cの入力ピンがD3とD4になっているため変更する必要があります。(A4,A5にするには下のコメントアウトの部分を生かす)
 またI2C_FASTMODEは1で定義した方がいいようです。
 なお起動時のSerial.begin(xxxxx)の通信速度は環境に合わせてください(通常は115200)

 このライブラリィがIDEのWireライブラリィと大きく違う所はデバイスアドレスの指定です。
 デバイスアドレスとREAD/WRITEフラグと一緒に引数で指定しますがアドレスを上位7ビットでREAD/WRITEフラグを下位1ビットで指定するためアドレスは1ビット左にシフトする必要があります。
 LED基板のアドレスは4ですがこのライブラリィでは8で指定する必要があります。

 なお再販版のLED基板は0x04でなく0x05のようです。
 動かない場合はアドレスのスキャンプログラムで実際のアドレスを調べてください。





 ArduinoとDMLEDの配線図です。
 写真はArduino NanoですがAeduino Unoも同じです。
 また青色DMTLEDと赤色DMLEDも同じ配線で構いません(Arduinoのプログラムを変えます)
 右目用LEDDと左目用LEDは同じ信号で制御するためArduinoに対して並列に接続します。
 ドットマトリクスLEDのピン番号は発光面をこちらに向けて文字印刷されている側面を上に向けた状態で書いています。
 配線図の写真もこれと同じ方向にしています。
 そのままロビの左目と右目になります。(文字印刷面が上側)

 ピン番号は上の右から1〜6で反時計回りで下に行って左から7〜12です。
 なお前回までは左右対称になるようにしていましたが今回は左右違うパターンを表示できるので右と左のROWは共通で同じPINに接続します。

  ・右目LED 6PINと左目LED 6PINをArduino D2の抵抗に接続(黒線1)
  ・右目LED 5PINと左目LED 5PINをArduino D3の抵抗に接続(緑線1)
  ・右目LED 4PINと左目LED 4PINをArduino D4の抵抗に接続(青線1)
  ・右目LED 9PINと左目LED 9PINをArduino D5の抵抗に接続(灰色線)
  ・右目LED 2PINと左目LED 2PINをArduino D6の抵抗に接続(青線2)
  ・右目LED 11PINと左目LED 11PINをArduino D7の抵抗に接続(緑線2)
  ・右目LED 12PINと左目LED 12PINをArduino D8の抵抗に接続(黒線2)
  ・左目LED 1PINをArduino D9に接続(赤線1)
  ・左目LED 3PINをArduino D10に接続(橙線1)
  ・左目LED 10PINをArduino D11に接続(ピンク線1)
  ・左目LED 7PINをArduino D12に接続(黄色線1)
  ・左目LED 8PINをArduino D13に接続(茶色線1)
  ・右目LED 1PINをArduino A0に接続(赤線2)
  ・右目LED 3PINをArduino A1に接続(橙線2)
  ・右目LED 10PINをArduino A2に接続(ピンク線2)
  ・右目LED 7PINをArduino D0(RX)に接続(黄色線2)
  ・右目LED 8PINをArduino D1(TXT)に接続(茶色線2)

 前回までは抵抗は33Ωのものを使っていましたが走査回数が今までの7回から10回(両目分)に増えて少し暗くなったので10Ωのものを使いました。(一時的に流れる電流がスペックよりオーバーしているので注意してください)


 簡単に抵抗が変えられるように今回ICソケットでこういうものを作ってみました。

 シリアルバスはLED基板のコネクターと接続していますがどの基板のコネクターでも構いません。

  ・GNDをArduinoのGNDと接続(黒線)
  ・電源をArdduinoのVINと接続(赤線)
  ・SCD(データ)をArduinoのA4(アナログピン)と接続(青線)
  ・SCL(クロック)をArduinoのA5(アナログピン)と接続(緑線)



 今回使用したスケッチ(プログラム)です。

 robi_eye_i2c.txt

 これをコピーアンドペースト(メモ帳でコピー、Arduinoで編集→貼付け)でArduinoで開いているスケッチを書き換えてください。

 →アイコンでコンパイルとマイコンに書込みを行います。
 この時スケッチの保存先を聞いてきますので任意のフォルダー名前で保存しておいてください。

 赤色DMLEDを使う場合はアノード(+)とカソード(−)が逆になるのでdigitalWriteの第2引数のLOWとHIGHを入れ替えてください。

 ひとつのパターンが5個のデータ(LEDの行)で左目のパターンとして定義されていて2進数の7桁(LEDの列)で定義されていて0の場合LEDが消え1の場合はLEDが点灯します。

 パターンを変える場合はこのデータの0と1の値を変えてください。

 右と左のLEDのROWを左右対称になるように接続した場合は使用するdata_mask2をコメントアウトしている方を使用してください。

 intervalはI2Cからデータを取得するインターバルを指定します。
 大きくするとパターン変化の反応時間が長くなりますがあまり小さい値にすると間違ったパターンデータを拾いやすくなります。

 デバイスのアドレスはintervalはI2Cからデータを取得するインターバルを指定します。

 i2c_adrはLED基板のデバイスアドレスですがSoftI2CMasterの場合1ビット左にシフト(×2)しています。
 なお再販版のLED基板は4でなく5のようですので10に変更してください。



 ロビのプログラムでのパターンの表示方法を説明します。
 標準のプログラムではサーボの位置指定の命令と一緒に目と口のLEDの色を指定しています。
 RM4をメモ帳などテキストエディターで見るとPOSExxxxブロックに<mem_w size="2" adr="0x0a00"> という命令があります。
 これはサーボを動かすため位置やトルクを16進数(0x****)で指定しています。
 この64番目からLEDの色を指定する数値となります。
 左目LEDのR(赤)の値、左目LEDのG(緑)の値、左目LEDのB(青)の値、右目LEDのR(赤)の値、右目LEDのG(緑)の値、右目LEDのB(青)の値、口LEDの値の順です。
 値は0x0000〜0x00ff(10進数で255)でそれぞれのLEDの明るさを表します。
 通常の色を表すRGB値と同じですがハードの特性上、値と実際の明るさは正比例しません。

 今回は右目と左目のB(青)の値でパターンデータを指定します。
 R(赤)とG(緑)の値は参照しないので0x0000でも元のデータのまま(既存プログラムを変更する場合)でも構いません。

 ロビモーションエディター2.70でパターンを簡単に指定できるようにしました。
 ロビモーションエディターメイン画面のLEDの詳細ボタンでLED詳細設定ダイアログを開きます。



 パターンのプルダウンリストから表示させたいパターンを選択すると現在選択中のポーズでこのパターンが表示されます。
 パターン番号と実際に表示されるパターンの対応はArduinoに転送するスケッチ(プログラム)のデータ部分を参照してください。
 リモート接続ができる環境ならリモート接続をしておいてリモート送信をチェックしておくとパターンを選択する毎にロビにそのパターンが表示されます。

 パターンを選択した後に既存プログラムの一括変更ボタンを押すと既存のロビプログラムに対して表示パターンが自動的に設定されます。

 ロビモーションエディターがプログラムからLEDの表示部分を見つけ出しこれをパターンデータに置き換えます。
 本機能は直接プログラムを書き換えるのでオリジナルのプログラムは必ずバックアップを取って置いてください。
 ロビの標準プログラム以外も本機能で変更できますが標準プログラムやモーションエディターで出力されたプログラムと同じポーズ命令でLEDの設定がされていなければいけません。
 動画のロビが大吉と占った時実行されるプログラム(5\414やったー大吉だよ9.RM4)は本機能を使って大吉と表示されるデータに置き換えています。
 標準のロビのメインプログラムのアイドリング時はパターン0が表示されます。
 ロビ設定ファイルエディター3.70でアイドリング時(音声認識待ち)の表示パターンを指定できるようにしました。
 ロビ設定ファイルエディターメイン画面のメインプログラムボタンでメインプログラム設定ダイアログを開きます。



 表情パターンを選択すると目にドットマトリックスLEDを設置した時にアイドリングの表情パターンが設定できます。
 なお表示パターンを設定した場合、オリジナルのようにアイドリング時に点滅するとパターンが変わってしまうので点滅なしをチェックしてください。


 実際にこのプログラムを動かした動画です。

     

 今回はArduinoでやりましたがPICマイコンでも可能だと思います。
 興味のある方は是非チャレンジしてみてはいかがでしょう。
 なお本改造はロビ本体への影響を及ぼす可能性があるのであくまでも自己責任という事でお願いします。

目次に戻る