ロビの目のパターン表示その2
2015年11月13日
2015年11月16日改訂
2015年12月3日改訂
前回はロビの目に仕込んだドットマトリックスLED(以下DMLEDと記載)をPCで制御してパターンを表示していました。
今回はロビのプログラムで表示パターンを制御してみます。
標準のロビは目のLEDはプログラムで表示色を切替えています。
この仕組みを応用して表示パターンを切替えます。
目のLEDは口のLED基板でマイコンボード信号をLEDのRGBに分解して実際の電圧レベルで目のLED基板に送っているようです。
今回はこのRGBの電圧をArduinoのアナログに入力にしてパターンデータに変換します。
アナログ入力なので細かく分解できるのですが今回はしきい値を決めてLOWからHIGHかの2値化します。
なおロビのLEDはカソード接続になっているようでLOWの場合に点灯するようです。
これをRGBで検出するので片方のLEDで3ビットのデータに変換できます。
両目なので6ビットになり64パターン定義できます。
Arduino nanoの場合、ドットデータを64パターン定義するとメモリーオーバになってしまいます。
スケッチのドットのデータですが分かりやすいように0と1で1ドット1バイトで定義しています。
データの型を工夫すればArduino nanoでも64パターン定義できると思いますが今回は32パターンで行いました。
ArduinoとDMLEDの配線は前回のままです。
接続の詳細やDMLEDの設置方法については前回の記事を参照してください。
アナログ入力ですが目のLED基板との接続ケーブルを利用します。
接続ケーブルを切断してメスのジャンパー線に結線すればそのままArduinoに接続できます。
切断したくなかったのでコネクターに1芯のリード線を差しこんでジャンパーに結線しました。
前回はUSBのバスパワーからArduinoの電源を取っていましたが今回はUSB接続しないのでArduinoに電源を供給する必要があります。
電源はロビの信号線(音声認識ボードや口のLED基板に接続されている4本のケーブル)から取ります。
口のLED基板に接続するケーブルを分岐してメスのジャンパー線を結線すればそのままArduinoに接続できます。
このケーブルも切断したくなかったのでコネクターの裏側に1芯のリード線を差しこんでジャンパーに結線しました。
なおこのケーブルは5Vより高い電圧が流れているのでArduinoに接続する場合は必ずVIN PINに接続してください。
VIN PINの入力はレギュレータを介するので6〜20V(推奨7〜12V)の範囲なら構いません。
口のLED基板とArduinoの接続は以下の通りです
・口のLED基板の入力コネクター(写真下側)の右端のケーブル(黒線)をArduinoのGND PINにつなげる
・口のLED基板の入力コネクター(写真下側)の右から2番目のケーブル(赤線)をArduinoのVIN PINにつなげる
・右目のLED基板の入力コネクター(写真右側)の左から3番目のケーブル(青線)をArduinoのA0 PINにつなげる
・右目のLED基板の入力コネクター(写真右側)の左から2番目のケーブル(緑線)をArduinoのA1 PINにつなげる
・右目のLED基板の入力コネクター(写真右側)の左端のケーブル(黄色線)をArduinoのA2 PINにつなげる
・左目のLED基板の入力コネクター(写真左側)の左から3番目のケーブル(青線)をArduinoのA3 PINにつなげる
・左目のLED基板の入力コネクター(写真左側)の左から2番目のケーブル(緑線)をArduinoのA4 PINにつなげる
・左目のLED基板の入力コネクター(写真左側)の左から3番目のケーブル(黄色線)をArduinoのA5 PINにつなげる
今回使用したスケッチ(プログラム)です。
robi_eye.txt
これをコピーアンドペースト(メモ帳でコピー、Arduinoで編集→貼付け)でArduinoで開いているスケッチを書き換えてください。
→アイコンでコンパイルとマイコンに書込みを行います。
この時スケッチの保存先を聞いてきますので任意のフォルダー名前で保存しておいてください。
なおスケッチ転送ためUSBで接続する時はロビの電源を入れない方がいいかも知れません。
USBで電源供給しながらアナログ入力の接続(ロビに電源を入れる)をしたらその後USBからの電源供給ができなくなりました。
VIN PINから電源を供給すればUSB接続ができて正常に使えるのでるシリアル接続回路は壊れていないと思います。
たまたま購入した中国製のArduino互換機がそうなるだけかも知れませんが注意してください。
赤色DMLEDを使う場合はアノード(+)とカソード(−)が逆になるのでdigitalWriteの第2引数のLOWとHIGHを入れ替えてください。
64パターンでやる場合は1行目のpattern_count=32を64に書き変えてください。
またデータは32パターン分しか定義さていないのでD32以降を追加してください。
ひとつのパターンが5個のデータ(LEDの行)で左目のパターンとして定義されていて2進数の7桁(LEDの列)で定義されていて0の場合LEDが消え1の場合はLEDが点灯します。
パターンを変える場合はこのデータの0と1の値を変えてください。
パターン54はロビがアイドリングの時の目の色(橙色)で変換されるパターンです。
ロビ設定ファイルエディターでもアイドリング時のパターンは変えれますがここのデータを変えてもパターンを変える事ができます。
ロビのプログラムでのパターンの表示方法を説明します。
標準のプログラムではサーボの位置指定の命令と一緒に目と口の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値と同じですがハードの特性上、値と実際の明るさは正比例しません。
この値でパターンを指定する方法歩ですが。まずパターンの番号を6桁の2進数で表します。
例えば22という数字は6桁2進数で書くと001110になります。
これを0なら0x0000、1なら0x00ffという数字に置き換えます。
22の場合、0x0000,0x0000,0x00ff,0x00ff,0x00ff,0x0000となります。
これをそのままサーボ移動命令の64番目69番目の数字に置き換えればパターン22が表示されます。
今回ロビモーションエディター2.60でパターンを簡単に指定できるようにしました。
ロビモーションエディターメイン画面のLEDの詳細ボタンでLED詳細設定ダイアログを開きます。
パターンのプルダウンリストから表示させたいパターンを選択すると現在選択中のポーズでこのパターンが表示されます。
パターン番号と実際に表示されるパターンの対応はArduinoに転送するスケッチ(プログラム)のデータ部分を参照してください。
リモート接続ができる環境ならリモート接続をしておいてリモート送信をチェックしておくとパターンを選択する毎にロビにそのパターンが表示されます。
パターンを選択した後に既存プログラムの一括変更ボタンを押すと既存のロビプログラムに対して表示パターンが自動的に設定されます。
ロビモーションエディターがプログラムからLEDの表示部分を見つけ出しこれをパターンデータに置き換えます。
本機能は直接プログラムを書き換えるのでオリジナルのプログラムは必ずバックアップを取って置いてください。
ロビの標準プログラム以外も本機能で変更できますが標準プログラムやモーションエディターで出力されたプログラムと同じポーズ命令でLEDの設定がされていなければいけません。
動画のロビがチョキを出した時実行されるプログラム(5\434じゃんけんチョキ9.RM4)は本機能を使ってチョキのパターンに置き換えています。
標準のロビのメインプログラムのアイドリング時はパターン22が表示されます。
ロビ設定ファイルエディター3.65でアイドリング時(音声認識待ち)の表示パターンを指定できるようにしました。
ロビ設定ファイルエディターメイン画面のメインプログラムボタンでメインプログラム設定ダイアログを開きます。
表情パターンを選択すると目にドットマトリックスLEDを設置した時にアイドリングの表情パターンが設定できます。
なお表示パターンを設定した場合は通常LEDのようにアイドリング時には点滅しません。
ロビモーションエディター、ロビ設定ファイルエディター共にパターンは32までしか指定できません。
設定ファイルに項目追加する事によって64パターンまで指定できるようになります。
ロビモーションエディター(RBMotion.ini)
[POSE]
PATTERN_COUNT=64
ロビ設定ファイルエディター(RBEdit.ini)
[FILE]
PATTERN_COUNT=64
最新版のロビモーションエディターとロビ設定ファイルエディターはシリアルバスによるパターンコントロールをサポートしています。
従って今回の方法に対しては使う事はできません。
シリアルバスによるパターンコントロールについてはこちらを参照してください。
実際にこのプログラムを動かした動画です。
今回はArduinoでやりましたがPICマイコンでも可能だと思います。
興味のある方は是非チャレンジしてみてはいかがでしょう。
なお本改造はロビ本体への影響を及ぼす可能性があるのであくまでも自己責任という事でお願いします。
目次に戻る