ロボゼロをお掃除ロボットにしてみる
2012年6月30日


 デアゴスティーニの週刊ロボゼロにはいくつかのプログラムが内蔵されています。
 しかし出来合いのプログラムを動かしていただけではつまらないので自分でプログラムを作っています。

 最初に作ったプログラムの実行動画です。
 今回はもう少し凝って音を付けてリモコンで操作できるようにしています。
 私の場合、モーションエディタ→プログラムエディタで作成していますが違うやり方もあると思いますのでひとつの参考にしてください。

 まずモーションエディタでサーボの位置を決めていきます。
 RXコントローラメニューよりモーションエディタを開いて「新規追加」ボタンでモーションを新規作成します。
 この時「現在のモーションデータを転記しますか?」と聞いてきますが転記しないのでキャンセルボタンを押します。
 一覧より今回作成するモーションデータを選択して「選択モーションを編集」ボタンを押してモーションデータ作成画面を開きます。



 次にRXコントローラメニューよりポーズエディタを開きます。  ロボゼロを接続しておいてオンラインをチェックします。
 「ホームに戻す」ボタンを押してロボゼロがホーム位置に戻る事を確認します。
 まずポーズエディタでホウキを持たせるポーズにします。
 スライダーでサーボの位置を決めていきますがこのスライダーはあまり使い勝手が良くなく予期せぬ位置に動いてしまい最悪サーボのギアを破損します。



 微調整ボタン(上部左の-5〜+5ボタン=緑囲み)が便利です。
 このボタンを使うには動かしたいサーボの青い値(赤囲み)を10位に設定しておきます。
 こうしておいて微調整ボタンを押すと先ほど指定した値にボタンの値をかけて移動してくれます。

 最初のポースが決まったらモーションデータ作成画面の「新規追加」ボタンを押して設定したポーズを登録します。
 移行時間というのはそのポーズの位置まで移動する秒数で、大きいとゆっくり小さいと素早く移動します。
 ゴルフのショットなどは素早くクラブを振りたい時は0秒にします。
 また体全体を使った大きな動きはこの値を大きくしておかないと素早く動いてしまいます。
 今回は最初のポーズとホームボジョンに戻す時は3秒でそれ以外は1秒にしています。

 名前と移行時間を変更する場合は作成画面のデータ一覧で作成されたデータをダブルクリックします。



 なおこの時各サーボの値を直接変更する事もできます。
 変更したら「登録して閉じる」ボタンを押して最初のデータを確定します。

 次の動作のポーズを定義します。  次のホウキを握る動作なので両手のサーボを操作してホウキを握るポーズにします。
 次のポーズを決める時は前のポーズが起点になりますので次のポーズを決める時は前のポーズにセットしておく必要があります。
 途中電源を落としたりしてロボゼロの姿勢が変わった場合は、ポーズエディタの登録画面で前のデータをダブルクリックするとそのポーズにしてくれます。



 ホームポジションは最後にロボゼロをホームポジションに戻すためのデータでポーズエディタの「ホームに戻す」ボタンでロボゼロをホーム位置に戻してからデータを新規追加します。
 全ての定義が終わったら必ず登録画面の「保存」ボタンを押して下さい。
 この画面はデータ更新の確認メッセージが出ないようなので保存を忘れて画面を閉じたりコントローラを終了すると折角作ったデータがパァになってしまいます。(一度やってしまいました)
 更新した所で一連の動きを確認します。
 まず最初のデータをダブルクリックで開きます。  その位置にロボゼロがそのポーズになります。
 次に「登録して次の行へ」ボタンを押します。  次のデータを開いてそのポーズに移行します。
 この時ゆっくりと移行するので移行時間のチェックはできません。

 次にモーションデータをプログラムに変換します。
 RXコントローラメニューよりプログラムエディタを開いて「新規登録」ボタンでプログラムを新規登録します。
 次に「読出し」ボタンで登録したプログラムを開きます。
 何も入っていないのでエディタ画面は空白のままです。(編集対象のプログラムを指定するためこの操作は必要なようです)
 次に「モーションデータ取り込み」ボタンで先ほど登録したモーションデータを読み込みます。



 先ほど登録したモーションデータをダブルクリックします。
 「OKでプログラム取り込み。キャンセルでMotionCall形式になります」のメッセージに対してOKボタンをクリックします。
 MOVEコマンドの引数に変換されてエディタの画面に表示されます。
 この時点で移行時間も含めて全体の動作テストが行えます。
 ロボゼロをつないでオンライン状態(ポーズエディタのオンラインチェック)でプログラムエディタの「実行」ボタンを押します。
 ロボゼロにプログラムが転送されてプログラムが開始されます。
 OKであれば「保存」ボタンでプログラムを更新します。

 次にプログラムをロボゼロに転送します。
 RXコントローラメニューよりプログラムの書き込みを開きます。
 この時ロボゼロを接続してオンラインをチェックしておく必要があります。



 転送先として適当なプログラムを置き換えます。
 今回はリモコンの3ボタンに割り当てられている右アッパーを置き換えました。
 リモコンの3ボタンに割り当てられているプログラムのFile番号は15です。

 書き込む時はロボゼロをPCに接続しておいてオンラインをチェックしておきます。
 プログラム一覧から「レレレのおじさん」とFile番号15を選択しておきます。
 この時、File番号15のプログラム名はNO DATAとなっているはずです。
 次に「ファイルへ書込」ボタンを押してプログラムをコンパイル/転送してください。
 File15のプログラム名が「レレレのおじさん」となるのを確認してください。
 この時、転送先側を選択していないとFile5が書き換えられてしまいます。  File5は起動プログラムでこれが書き換えられるとロボゼロが起動できなくなってしまいますので注意してください。
 もし書き換えられてしまった場合や起動がうまくいかなくなった場合はセットアップの「HSWB-04F-SDカード作成処理」を行ってSDカードを初期状態に戻してから再び書き込みを行ってください。
 なお68号のCDから05SCR.txt(オリジナルの起動プログラム)を直接SDカードに転送しても構いません。
 これでリモコンの3ボタンでモーションエディタで作成したプログラムが動くはずです。

 次に条件分岐を使ってもう少しプログラムらしくします。
 本来プログラムエディタでプログラムを編集できるようになっていますが、このエディタコピーアンドペーストができないなど非常に使いにくいです。
 そこでいつも使い慣れたテキストエディタでプログラムを編集します。
 RXコントローラメニューよりプログラムエディタを開いて「新規登録」ボタンでプログラムを新規登録します。
 Windows標準のメモ帳(NotePad)でも構いません。
 私はいつもマイクロソフトのビジュアルスタジオのテキストエディタを使っています。(このページもそれで書いています)

 プログラムエディタの「読出し」ボタンで登録したプログラムを開きます。
 「外部書出」ボタンでテキストファイルに書き出します。

 プログラムはこのルソースファイル(テキストファイ)をベースに機能を追加していくようにします。
 コントローラのプログラムエディタでプログラムを修正した場合も「外部書出」機能で常にプログラムと一致させておくようにします。
 このソースファイル(テキストファイル)をテキストエディタで編集します。

;レレレのおじさん
;初期位置
MOVE(1202,-141,-117,-516,0,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,0,398,-23,234,-800,7200)
;停止ボタンが押されるまで待つ
V130=0
:START
JUMPIF(V130,=,0,START)
;ほうきを握る
MOVE(1202,-141,-117,-516,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-800,2400)
;掃く回数
V100=10
:LOOP
;ホウキ左
MOVE(1202,-141,-117,-398,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-588,516,-23,234,-800,2400)
;ホウキ右
MOVE(1202,-141,-117,-898,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-588,200,-23,234,-800,2400)
;繰り返し
V100=V100-1
JUMPIF(V100,>,0,LOOP)
;ホウキ戻す
MOVE(1202,-141,-117,-516,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-800,2400)
;左手放す
MOVE(1202,-141,-117,-500,0,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-800,2400)
;左手上げる
MOVE(1852,-141,-117,-200,0,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-900,2400)
;レレレのポーズ
MOVE(1852,-141,-117,-500,633,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-900,2400)
;停止ボタンが押されるまで待つ
V130=0
:STOP
JUMPIF(V130,=,0,STOP)
;ホームポジション
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)

 モーションデータからプログラムに変換した場合、モーションデータの名前はコメントに落としてくれますがデータの名前は落としてくれないのでテキストエディタで入力しておきます。
 行の先頭に;(半角セミコロン)を付けるとコメント行です。
 ホウキ右、ホウキ左の行を10回繰り返すようにしています。
 V100は繰り返しのカウンターです。
 V100=10で繰り返しの回数をセットしています。
 :LOOPはラベルと言ってプログラム内での場所を表しています。
 ホウキ右のMOVE命令の後のV100=V100-1は繰り返しカウンターから1を引く命令です。
 一回実行すると9になります。
 次のJUMPIF(V100,>,0,LOOP)でこのカウンターが0より大きいかどうかで次のプログラムの行き先がきますります。
 もし0より大きい場合はラベルLOOPに飛びます。(ホウキ左の前まで戻ります)
 それ以外の場合は通常のプログラムと同じ次の行を実行します。
 1回目に9になるので10回ちゃんと繰り返すか不安になりますが9回目は1なのでLOOPに戻ります。
 そして10回目が終了すると時0になって初めてループから抜けるのでちゃんと10回繰り返します。

 リモコンボタンの制御部分は同じように条件分岐で処理できます。
 V130はリモコンの●ボタンで値が変わる変数のようです。
 おそらく●ボタンが押されると1?に変更されるのだと思います。
 V130=0で押されていない状態にします。(やらなくてもよいかも知れませんが通常のプログラムでも変数の値は不定なので初期化は必ずに行った方がよいと思います)
 :STARTは押されていない時に戻るラベルです。
 JUMPIF(V130,=,0,START)は、V130の値が0(押されていない状態)の時はSTARTに戻る条件分岐です。
 普通のプログラムだと戻り先と条件分岐の間にはWAITのような命令を置いてしばらく経ってからボタンの状態を見るのですが、提供プログラムでも置いていなかったのでそれに従っています。
 :STOP以下も同じ処理で●ボタンが押されるとホームポジションに戻りプログラムを終了します。

 プログラムの編集が終わったらテキストファイルを更新してRXコントローラのプログラムエディタの「外部読込」ボタンで更新したファイルを読み込みます。
 この時、前のプログラムを消しておかないと前のプログラムの後に追加されてしまいます。
 また別のプログラムとして新規登録して新たに作り直しても構いません。
 後は先ほどやったのと同じ手順でプログラムの更新と書き換えを行います。
 書き換えは前のFile番号と同じにすれば前のプログラムが上書きされます。

 次にロボゼロから音を出してみます。
 ロボゼロから音を出すには素材の音声ファイルを作成する必要があります。
 Windows7で提供されているサウンドレコーダーは機能がお粗末でこの作業には向いていません。
 私はWindows7を使っていますがサウンドレコーダーは今だとXPで提供されていたサウンドレコーダを愛用しています。
 これだと今回のロボゼロ用の音声ファイル形式にも出力できますし簡単な編集作業も出来ます。
 私はいつもコンテンツをネットから探して来てPCのイヤホン端子とマイク端子をオーディオケーブルで直結してこのサウンドレコーダーで録音しています。

 録音編集したサウンドファイルをサウンドレコーダーで「名前を付けて保存」でWAVファイルに保存します。
 この時「変更ボタン」を押してサウンドの形式を指定します。



 形式をPCMにして属性を11.025 kHz, 8ビット,モノラルに設定します

 複雑な編集が必要な場合はQuckTime Player も良く使います。
 この場合はエクスポート(ライセンスが必要)で出力します。
 エクスポートする時に「オプション」ボタンで出力形式を設定します。



 コンテンツのWAVファイルを編集する際のコツとしては音として使う部分より少し大きめの範囲を残しておきます。
 ロボゼロのハードとのずれが生じるので再生範囲はプログラムのパラメータで微調整します。
 なお今回はひとつのWAVファイルの2ヶ所別の部分を使っています。(途中の不要部分は編集でカットしています)

 ロボゼロのスピーカーは小さいので音量は多少大きめにしておきます。(あまり大きいと音が割れてしまいますので注意してください)
 フリーソフトでも音量を大きくしたり編集できるものもありますので探してみてください。

 次にプログラムをソースファイル(外部書出で出力したテキストファイル)をテキストエディタで編集して音声の出力部分を追加できるようにします。

;レレレのおじさん
;初期位置
MOVE(1202,-141,-117,-516,0,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,0,398,-23,234,-800,7200)
;停止ボタンが押されるまで待つ
V130=0
:START
JUMPIF(V130,=,0,START)
;「おでかけですか」音声
V00=20
V01=0
V02=0
V03=30
V04=0
SOUND
WAIT(200)
;ほうきを握る
MOVE(1202,-141,-117,-516,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-800,2400)
;掃く回数
V100=10
:LOOP
;ホウキ左
MOVE(1202,-141,-117,-398,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-588,516,-23,234,-800,2400)
;ホウキ右
MOVE(1202,-141,-117,-898,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-588,200,-23,234,-800,2400)
;繰り返し
V100=V100-1
JUMPIF(V100,>,0,LOOP)
;ホウキ戻す
MOVE(1202,-141,-117,-516,562,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-800,2400)
;左手放す
MOVE(1202,-141,-117,-500,0,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-800,2400)
;左手上げる
MOVE(1852,-141,-117,-200,0,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-900,2400)
;レレレのポーズ
MOVE(1852,-141,-117,-500,633,-23,-47,0,0,0,-79,0,0,56,0,0,0,71,0,-586,398,-23,234,-900,2400)
;「レレレのれ」の音声
V00=20
V01=60
V02=0
V03=30
V04=0
SOUND
;停止ボタンが押されるまで待つ
V130=0
:STOP
JUMPIF(V130,=,0,STOP)
;ホームポジション
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7200)

 V00〜V04が音声用のパラメータです。
 音声ファイルは通常のプログラム(XXSCR.txt)としてロボゼロに転送します。
 V00はこのFile番号を指定します。今回は20SCR.txtで転送するのでV00=20としています。
 V01は音声が入っているWAVEファイルの位置(セクター番号)で最初の部分は先頭から再生するので0を指定しています。
 非圧縮のPCMはセクタ番号と時間が比例しています。
 1セクタは0.0468秒なので時間からセクター番号が計算できます。
 例えば先頭から1秒後は1÷0.0468なので21.5(四捨五入で22)となります。
 しかしハードのずれや丸め誤差で厳密に定義してもずれてしまうのでおおまかに1秒=20セクターで計算しても構わないと思います。
 V02はV01が32767を超える時に指定しますがV01で約27分表せるので通常の場合0で構わないと思います。

 V03は再生時間で同じくセクター数で表します。
 この例では30=1.4秒となっていますが実際は1秒位が再生されています。
 V04は先ほどと同じくV03の桁あふれの場合指定するパラメータで通常の場合0で構わないと思います。

 次のSOUNDは実際に音を鳴らす命令です。
 何回も同じ音を鳴らすのであればパラメータはそのままで構わないのでSOUNDだけ繰り返します。
 次のWAIT(200)はサウンドが鳴っているあいだ次の命令を実行しないようにするためです。
 引数の200は処理を待つ時間で200が1秒を表します。
 1秒以上ませる時はこの命令を繰り替えします。

 後半の部分にまた音声を鳴らしている部分がありますがV01とV03を指定します。
 同じ音声ファイルを使っているので開始位置が60=2.8秒となっています。
 再生時間はたまたま同じですが違う場合はその値を指定します。
 なおV00,V02,V04は一回目と同じなのでセットする行を省略できますが後からプログラムを見た時に分かりやすいように再度設定し直しています。

 音声ファイルはXXSCR.txtというファイル名に変更しておく必要があります。
 なおこの番号のオリジナルのプログラムが書き換えられるため必要に応じて変更してください。

 ファイルはWindowsで直接SDカードのものを書き換えても構わないようですが、開始のセクタ番号によっては音が変になってしまう事がありました。
 このような場合はコントローラのHSWB04FDATフォルダのファイルを上書きしておいてからセットアップのHSWB-04F-SDカードの作成処理でSDカードの初期化で転送を行ってください。

 音声ファイルが転送できたところでロボゼロをPCに接続してプログラムエディタの「実行」ボタンで実際にプログラムを実行して音声を鳴らします。
 この時音声がずれていたらV01とV03の値を変更して正しく再生できるよう調整してください。

 正常に再生されるようになったら「保存」ボタンでプログラムを更新して先ほどの手順でプログラムの転送を行ってください。



 プログラムの実行動画です。

     

 実際にお掃除ロボットとして使えると思っていませんでしたのでプログラムの性能についてはご勘弁ください。

 またこれとは別に音声機能を使ってデアゴスティーニのオリジナルプログラムをいじっていします。
 よろしかったら
こちらからダウンロードしてみてください。
 なお今回行ったロボゼロのSDカードの書き換えは、ロボゼロ本体への影響を伴うのであくまでも自己責任という事でお願いします。

目次に戻る