« 2007年12月 | トップページ | 2008年3月 »

2008年1月30日 (水)

週刊myRobotを作ろう(87)

■更新情報 ユニリモコンでリピーター改良(2008/2/4)

■ユニリモコンによる「列車でGO!」
ご存じの方もいらっしゃるかとは思いますが、かって「デジQトレイン」なる赤外線コントロールの鉄道模型(おもちゃ?)が、コナミより発売されていました。500k1a
ちょうど2002年5月頃だったと思いますが、ID-01ユニリモコンと同様に赤外線(IR)を利用したコントロールで、複数車両そして、複数のポイントをコントロール出来るというコンセプトの元に開発され、第一弾として発売された「新幹線500系基本運転セット」と「EF58+24系25形客車」を手にいれ、レイアウトのプランをあれこれ考えながら電動切替ポイントが発売されるのを待ち続けておりました。

ところが数か月待っても電動ポイントは発売されず、他の趣味(ラジコンヘリなど)に熱中したあまり、「デジQトレイン」の事など、すっかり忘れ去っていました。
そして数年経って思い出した時には既に遅く、「デジQトレイン」は何故か販売中止になっており、どうしても欲しかった電動ポイントなど数々の商品を手に入れる事が出来ずにいました。

◇ヒント
”た”さんから、「ユニリモコンでラジコンカーQ-STEERをコントロールした」とのメールを頂き、早速私もトライしてみました。
ところが、ラジコンカーのQ-STEERはスピードコントロールが出来ないため、あっという間にコントロール範囲外のところに走り去り、自分の中ではID-01でコントロールするには非常に難しい・・・という結論に達しました。

そこで思い出したのが、「デジQトレイン」です。これなら、決められた軌道の上を走るだけですので問題なさそうです。
早速トライして、楕円軌道の上を走らせて見ましたが、前進、停止、バックするだけの単調な動きだけでは面白さに欠け、ブログにレポートする事もありませんでした。

ところが最近になり、「デジQトレイン」の未開封の新古品が安い値段で出回り始め、やっと念願の電動切替ポイントを手に入れる事が出来ました。
そこで、引込み線から、本線へ、そして引き込み線へ戻す・・・などのストーリーが考えられ、更には複数車両でのコントロールなども、ID-01のユニリモコンを介す事により高度なプログラミング化出来そうです。
そのような訳で、ID-01を使った「デジQトレイン」のコントロールプログラミングにトライしてみる事にしました。

◇リアルタイムのコントロール
ID-01でコントロールに先立ち、「デジQトレイン」のIR(近赤外線)コントロールを分析する必要があります。
まず、「デジQトレイン」のコントローラーを調べてみましょう。Id01_92_29
  
ご覧のように「デジQトレイン」のコントローラーには、「①スピードコントローラー」、「②前/後進切替」、「③4つのID切替」、「④8つのLineスイッチ」「⑤車両/線路分岐(ポイント)」がついています。
③と④の組み合わせで、全部で8×4つまり32台の車両と、同じ数だけの線路分岐(ポイント)がコントロールできるようになっています。大掛かりなレイアウトになると、複数のコントローラーに役割分担をさせての運用が理想であると思われます。
更にこのコントローラーは、リアルタイムで速度コントロールを行う事が可能な事から、6個の赤外線LEDは1/4秒というスピードで常時点滅を繰り返し信号を出しています。Id01_92_28
赤外線LEDの点滅をビデオで撮影、GIFアニメ化した
     
◇ユニコマンダーへの取り込み方法
ID-01のユニコマンダーには、このようなリアルタイムのコントロール信号(常時点滅)を取り込み、復元する事は不可能です。

そこで、「デジQトレイン」のコントローラーが点滅した瞬間をユニコマンダーに登録してみる事にしました。

コツは登録する直前まで、「デジQトレイン」のコントローラーの赤外線LED部分に蓋をしておき、登録のビープ音とともに、1/4秒だけチラッと蓋をあけ、直ぐに閉めるようにします。再確認の登録も同様に行い、このように、手間は掛かりますが、ひとつひとつ登録していけば、問題なく取り込みが出来る事がわかりました。

時間は掛かりましたが、ユニリモコンから、各列車の走行及び、ポイントの切替は問題なく行えました。

◇レイアウト
実際に走らせる「デジQトレイン」のレイアウト自体はシンプルな形(単線の楕円線路と2つの退避線)を考えてみました。片方の列車は待避線に入れてあるので、一編成の列車は楕円線路で周回する事が可能です。Id01_92_30
   
◇レイアウト変更
何度も後述するテストするうちに、列車が停止するタイミングを外し、オーバーランして脱線という事が度々あり、ポイントを4つ使用したレイアウト変更を行いました。
こちら側と向こうと側にある待避線の車止めを廃止して、前後とも本線に接続しました。これによってオーバーランしても脱線しません。
Id01_92_35
新レイアウト(向こうと、こちら側に待避線がある)
    
◇ユニコマンダーへの登録内容
実際にどのような動きが必要なのか、やってみなければ分かりませんので、登録する内容は出来るだけシンプルにする事にしました。

●列車の制御
各列車の動きは次の4通りで登録します。
①「高速前進」
②「中速前進」
③「停止」
④「中速後進」
この動きを、列車1(ID=1、LINE=1)、列車2(ID=1,LINE=2)に割り当てます。

●線路分岐ポイントの切替
レイアウト変更に伴い、分岐ポイントは4つになり、コントローラーを2つに変更し、呼び名も2つの待避線単位に呼ぶことにしました。
○待避線A
ポイントA(ID=2、LINE=1)、ポイントB(ID=2、LINE=2)
○待避線B
ポイントC(ID=2、LINE=3)、ポイントD(ID=2、LINE=4)


分岐ポイントの切替は、ボタンを押す毎に、「ON」「OFF」の信号が切り替わり、「待避側」「本線側」と切り替わった方向のLEDが点灯します。Id01_92_31
電動ポイントには表示装置が装備されている
切替方向のLEDと、設定した番号のID番号とLINE番号

   
4つのポイント切替の組み合わせを各々行っていては複雑になりますので、ABの各待避線ごとに本線、待避線の切替をシンクロして行うようにしました。
必要とあれば各々別々に動かすことも可能です。
①待避線A(本線)、待避線B(本線)
②待避線A(分岐)、待避線B(本線)
③待避線A(本線)、待避線B(分岐)
これらを、ユニコマンダーのNO40~59に登録していきます。


◇ユニリモコンでリピーター
とりあえず、ユニリモコンで「デジQトレイン」をコントロールする仕組みが出来ましたが、動作がイマイチ安定しません。
そのような状態でプログラムしても、確実に動く保障は望めませんので、とりあえず、ID-01経由でテレビリモコンによる操作を行うプログラミングを行いました。
最初から、リピーター(中継器)的な使用での双方向通信(送信と受信)になってしまいました。

◇プログラムの構成
いちいち組み立てるのは面倒なので、とりあえずレイアウトは最小規模にして、パネルに貼り付けるようにしました。
コントロールも簡単シンプルにして、1編成のコントロールと、ポイントの切替をテレビリモコンで行うようにプログラムしてみました。
実際にテストしてみて、今回は高速運転を使用しない事にしました


①電源ボタン 0 
電源)プログラム終了


②テレビチャンネル

列車1コントロール
 前進(ノーマルスピード) 

 停止 
 後退 


列車2コントロール
 前進(ノーマルスピード) 
 停止 
 後退 8

●ポイント切替
 待避線A(本線)、待避線B(本線) 10 
 待避線A(分岐)、待避線B(本線) 11
 待避線A(本線)、待避線B(分岐) 12

プログラミングは、以前のTVリモコンによるプログラムを改造しただけです。Id01_92_38

    
◇問題点
簡単だと思ったポイントの切替で躓いてしまいました。
冒頭にお話したように、「デジQトレイン」のコントロールはリアルタイムに絶え間なくコントロール信号が出ています。
ところが、ID-01に登録できたのは、その一断片に過ぎません。
ユニコマンダーから送信されたIR信号が、タイミング良く電動ポイントに届けば問題なく作動します。
しかし、実際には数回リモコンボタンを押さないと動作しない時もあります。

この問題を解消すべく、IR信号の発光間隔を調整したり、1コマンドでに数回発光させたりして、色々とトライ中してみたところ、発光時間を2秒以上に延長する事で
ポイント切り替えの問題は解消する事が分かりました。
何故2秒も?と思われるかもしれませんが、各電動ポイントの信号受付のタイミングが2秒毎のようで、おまけに、切り替えタイミングは各電動ポイントごとにバラバラに動作しているからです。
    
◇プログラミング
当初、IR(遠赤外線)受信と、IR送信をループさせようと考えました。
これなら、電動ポイントの発光時間を短くしても、数分の1秒ごとに点灯しますので、常時点灯と同等の効果があります。


●IR受信部
テレビリモコンの信号を受付した時点で各動作Sw(またはFlg)を書き換えます。
各動作Swは、
列車1、列車2、ポイント切替えの動作指示用です。
●IR送信
IR送信は、テレビリモコンの受信が有ろうと無かろうと、各動作Swの値(列車1、列車2、ポイント切替え)に応じたコントロール信号を、1/2秒間だけ送信します。Id01_92_37_2

   
ところが、VCL上の制約が立ちはだかりました。
IR(遠赤外線)の受信は、「Wait for命令」しか使えないのです。
すなわち、リモコンボタンを押して、何かの信号を受信出来た場合のみにしかプログラムはループしてくれないのです。
「Read命令」が使用できれば問題ないのですが・・・・ 残念です。

仕方がないので、{Waint for命令」を使用し、電動ポイント切り替え信号の発光時間を2秒間にしました。
テストしたところ、ほぼ問題なく切替えることが出来るようになりました。Id01_92_36

本線を通過する列車1と、待避線の列車2(各画像クリックで拡大)
     
ただし、電動ポイント切り替え信号を流しているこの2秒間は、他の処理が行えません。
①列車の制御
テレビコマンダーの信号が受付れませんので、その間、列車の発信、停止などが行えなくなります。そのような訳で、列車のオーバーラン→脱線が続いたため、レイアウトを変更せざるを得なくなってしまったのです。
②列車の動作
「デジQトレイン」の列車は、コントロール信号が途絶えると5秒間後に停止してしまいます。
理屈では、タイミングよく「前進」のボタンを押していれば良いわけですが、ポイント切り替え操作などもあって、約1/4周走っては止まるの繰り返しです。

今回のテストで、テレビリモコンの操作と、リアルタイム「デジQトレイン」のコントロールを行う、双方向通信のプログラムは、ユニリモコンには向かない事が分かりました。
おそらく、ポイント切り替え部分をはずせば、もう少し軽く動く筈です。
「デジQトレイン」は販売が終了した事もあって、新たに手に入れるのは難しいかと思い、今回のプログラムは、ご希望が無い限りは公開はしないことにします。

「デジQトレイン」をコントロールするにあたり、バックパックに搭載したユニリモコンと、の銀メタボールの全方位アンテナが大変有効に機能しました事をレポートしておきます。
この記事の詳細は『週刊myRobotを作ろう(83)』(2007/11/30付)の中にある「ユニリモコンをバックパックに内蔵」に記載されていますので、ご興味のある方は、宜しければご覧ください。Id01_90_21
「デジQトレイン」のコントロールに適した全方位アンテナ
   
次回は自動運転のプログラミングにトライする事にします。
つづく
(2008/2/4)


■電飾版「短の大足(みじのおおあし)」
『「週刊myRobotを作ろう(64)」(2007/6/26)』)』「短いけど凄いんです」の項でご紹介した、「短の大足(みじのおおあし)」を覚えていらっしゃいますか?Id01_69_15
当時、ラッチさんに作成して頂いた「短の大足(みじのおおあし)」は現在も2号機に取り付けてあり、いかんなく効力を発揮しております。
その後、1号機にも取り付けたいと思いましたが、旋盤、ボール盤を使用した加工・制作を行う事は私には無理なので、そのままになっております。

その後、KOBAさんより、簡易版の「短の大足(みじのおおあし)」を発表して頂きましたが、これなら出来そうだなあ・・・と思いつつ、他の事に手を出して、現在まで何も作成せず・・になっています。
尚、「短の大足(みじのおおあし)」についての効能や、開発コンセプト等については、『「週刊myRobotを作ろう(64)」(2007/6/26)』「短いけど凄いんです」の項をご覧いただければ・・・・と思います。

そんなおり、久しぶりにジローさんから、画像が送られてきました。Img_4687
  
「短の大足(みじのおおあし)」の電飾版だそうで、相変わらず職人技で美しく作られています。
併せて、「掲示板」にも記事を投稿されたようです。

職人ジローさんは「説明書」をいっさい作ってくれません。
そこで、メールで何回も質問し、その時添付された画像を含めて、まとめてみました。

◇制作手順
用意するものは、ID-01のオリジナル後輪ステー一式と、車輪直径50mmのキャスター、アクリル板、止めるネジ類、電飾装置(ブルーLED、フレキシブルボード)などです。

1)後輪ステーの加工
後輪ステーの後部を、二箇所ほど(画像の赤太線①と②)切り離します。Id01_92_27
①の切断位置は左側のネジ穴から約15mmの位置で、②の切断位置は後部端から約7mmの位置です。
切断箇所は、全体の長さを決定する部分ですので、各自、お好みの長さでカットされても良いとの事ですが、強度的にはジローさんがカットされた位置で良さそうな気がします。

後部端②の部分を、①の切断位置、画像のような感じでカッチリと接着させます。この時、左右の位置がピッタリと合うように確認してから接着する事が重要です。Img_4755
接着後、パテで凹凸を整え、サンドペーパーで形よく仕上げます。

2)透明アクリルステー
実際にキャスター部分の軸を受け、ブルーLEDで光る、今回のコアの部分です。
こんなアクリルの棒を何処で手に入れたかと思いましたら、なんと、厚さ3~5mmのアクリル板を7枚貼り合わせ・・・との事です。Img_4692
    
大きさは、後輪ステーの窪みに形状を合わせなければなりませんので、画像のようにステーにアクリル板を宛がい、切断位置に合わせてけがきをされた・・・との事です。Img_4717
もしくは、ステーに合わせた型紙をあらかじめ作っておき、アクリル板にけがいていく方法でも良いかと思われます。

アクリル板をカットするには、アクリルカッターで半分弱位までカットし、手あるいは、ペンチなどで、ポキッと折るように切断する・・・との事です。Img_4716
    
そして、アクリル板専用の接着材で張り合わせます。
全体的に、少し大きめに作成し、ステーに合わせながら何回もやすりがけして、ピタッと合わさる大きさに仕上げるのがコツ・・・との事です。

完成したアクリルステーは画像のような格好、大きさになります。Img_4693
出来上がったアクリルステーの上部には、同じアクリルの飾り板を付けられたようですが、ブルーのクリア塗料が塗られています。
後述するパテで作成した軸受けなどの目隠し用との事でした。

3)パテで作る軸受け
張り合わせたアクリルステーに、直接キャスターの金属ネジを差し込むと、強度的にヒビ割れする恐れがあるため、バテで軸受けを作成されたとの事です。

キャスターのネジ部分は11mmありますので、パテを4mm厚位に巻きつけます。Img_4629
この辺りは、プラリペアで作成しても良いかもしれませんね。
ネジの部分に軽くグリスを塗布しておくと、一昼夜おいて乾いた後、簡単に取り外す事ができます。

一回取り外して、バリなどを取り去り、軽く整形しておきます。
そのあと、アクリルステーに直径15~16mm位の穴をあけ、先ほど作成した軸受けの外壁をヤスリ掛けしながらピッタリ合わさるように調整していきます。Img_4632
   
●軸受け穴作成時の注意事項
直径50mmのキャスターを用いますと、ID-01の後ろ側がかなり持ち上がります。
キャスターの軸は、この持ち上がった状態で、前後左右どこから見ても垂直になっていなければいけません。
左右の傾きがあると直進しませんし、前後の傾きがあると、スムースな方向転換ができません。
かなりシビアに、この実質的な垂直穴をあけてください。決して「アクリルステーに対しての垂直では有りません」ので、お気を付けください。

形状としては完成しましたので、ステー部分にはめ込み、取り付ける穴を二箇所ほどあけ、ボルト、あるいはネジで取り付けを行います。
特にこの部分は、走行時に大きな力が加わりますので、頑丈にしっかりと取り付ける事が必要です。

4)電飾装置
まず、3個のブルーLEDをフレキシブルボードに画像のように取り付けます。Img_4697
先ほど完成したアクリル棒の前部分に3つのLED用の穴を明け、取り付けた・・・との事です。Img_4727
電源ソースとしては、足の部分にあるライトから取り出すか、3Vくらいのボタン電池で別電源を用意しても良いでしょう。Img_4748
    
お話を伺い各画像を眺めてみると、相変わらず手抜きをされない職人技という事が良くわかりました。
ジローさん、大変素晴らしい作品のご紹介、有難うございました。
(2008/1/30)

■あとがき
先日、久しぶりに東京に雪が降りましたが、積もらずに地面にふれては、はかなく消えていきました。

そして今日、犬達の散歩に出かけると、道端に生えている「たんぱぽ」に、つぼみが付いて、黄色い花の一部が顔を出しかけていました。多分、明日には可憐な花が咲くのでは・・・と思っています。
もう、そこまで春が来ているようですね。Id01_92_32

| | コメント (0)

2008年1月23日 (水)

週刊myRobotちょっとひといき(6)

■更新情報 ラジコンヘリAirWolfの飛行 (2008/1/27)
■更新情報 火星探査機画像に人影? (2008/1/25)



■「大ロボット博」見聞

大ロボット博(2007/10/23~2008/1/27)」が、東京上野にある国立科学博物館で開催されています。
最終日までにはなんとか行きたいという事で、なんとか1/22(火)に見学する事ができました。

「大ロボット博」の入り口は、科学博物館脇、D51蒸気機関車の奥の方にあります。Id01_92_01
        
「歩く、奏でる、踊る、日本の物づくりの粋を見よ!」というキャッチフレーズの書いたパンフレットをもらい会場に入ると、優雅なショパンのノクターンが聞こえてきました。
見ると自動演奏ピアノが曲を奏でています。遠い昔、ピアノを習っていた頃を想い出しました。Id01_92_21
    
世界の中で、ロボットの開発を見ると、日本は「ヒューマノイド型」、「生活介助/医療」など、より人間に身近なロボットの研究が多くされています。欧米での機能中心のロボット開発とは一味異なるようで、世界から注目さ浴びています。

この博覧会に展示中のロボットは、産業用ロボット、介助ロボット、研究中のロボット、癒し系ロボット、アニメロボット、からくり人形など、大型から、超小型ロボット迄が一堂に集められ、なかなか見ごたえがあります。

会場内は、一切、ストロボ、フラッシュ撮影は禁止されていますので、薄暗い被写体を撮影するのは容易ではありません。
こんな事なら明るいレンズを持って来れば良かった・・・と悔いてみても仕方が有りません。
帰宅してから撮影データーをチェックすると、暗いところでは「1/3秒」「1/6秒」など手持ち撮影では厳しい場所が多く、拡大してみると多くの画像がブレテーラー(カメラ振れ画像)でした。
持っていくなら、ビデオカメラの方が良いかもしれません。

◇からくりの実演
連日午前11時からは特設ステージで催し物が有り、その日は『からくり「流鏑馬」と「文字書き人形」の実演』が行われました。
最初に「文字書き人形」の実演が行われました。Id01_92_22
(何を演目するかは日替わりのようで、事前にWEBサイトなどで確認が必要です)

●「文字書き人形」
文字書き人形は、本来なら手動でハンドルを回しますが、モーター駆動に改造されていました。
最初に「梅」という文字を人形がさらさらと書いていき、書き終わると、書面がクルリとお客の方に向きを変え、見事な書筆を披露してくれます。
こんどは、人形の下に隠くされているカラクリを蓋を外しての実演です。Id01_92_02

向かって右奥に多数のカムがあり、人形各部の動きがプログラムされている(画像クリックで拡大します)

普段なら、なかなか見る事が出来ない「カム」と「たこ糸」の巧みな動きを、つぶさに観察する事ができました。
今度は「寿」という字を、さらさらと滑らかに書き上げていきます。

江戸からくりの素材には、木、紙、タコ糸、動力元には、重り、ゼンマイ(鯨のヒゲ)、水銀、水などを使用しています。
そして、複雑な動きを演出しているのが、回転するカムで、いくつものカムを同時に回転させる事で、腕、体、頭、その他の動きが演じられ、何度でも同じシンクロした動きになるわけです。
基本的には、二足歩行ロボットに色々な動きを各関節毎にプログラミングするのと同様の行為になると思います。
科学の粋を集めた現代のロボット達も、江戸からくりに負けてはいられませんね。

●「流鏑馬」
「流鏑馬」は、皆様ご存知の通り、馬で失踪しながら、馬上から矢をつがえ、弓で射る的を射る競技です。

このカラクリには、三つの的があり、馬にまたがった侍が、左からスタートして、右に向かって馬を走らせ、次々に的を弓で射るようになっています。Id01_92_16
  
動力はゼンマイのようで、最初に、長いひもを引いて、馬を左のスタート地点にセットします。トリガーを外せば、馬が動く、矢を番える、弓を引くというシーケンスを3回繰り返す仕組みです。
2回実演しましたが、一回目は全て的に当たり、見物客は大喝采でした。
2度目は、全て外れました。
どうやら、何センチ(何寸)動いたら弓を射るtという繰り返しで動くようにプログラムされているようで、スタート位置がずれていると、後の動きは全てずれてしまいます。
何事も「最初が肝心!」というわけですね。

◇アニメ、癒し系ロボット
往年の鉄腕アトムに始まり、アニメ界の有名ロボットが展示されていました。Id01_92_10
  
アニメのドラエモンはロボットだったのですね。
大好物のドラヤキと伴に展示されていて、なかなか愛嬌があります。Id01_92_09
  
お年寄りの集う場所でも人気がある癒し系型ロボットは、お子さんにも大人気でした。Id01_92_08_2
画像のアザラシロボットは35万円とか・・・

◇介助/防災/警護ロボット
介助する方、ヘルパーさん達へ、介助仕事の負担を少なくする目的で開発されたパワーアシスト機能が付いたモービルスーツです。介助以外にも色々な方面で活躍しそうですね。Id01_92_12
      
火災、震災などの災害時のレスキューや、地雷撤去などに役立つロボットも多数出品されていました。
二次災害を防ぐ意味からも、どんどん実践で活躍して欲しいものです。
ある意味では、月や火星で活躍した探査ロボットもこの類に入るかもしれません。Id01_92_13
  
実際に実用化されてきているビル内の警備ロボットです。
ビル内部のマップを元に、ルートに従って警備を行い、不審者を発見すると灯火で威嚇し、画像などの情報をセンターに通報します。Id01_92_14_2
   
◇空飛ぶロボット
災害現場や火山活動など危険な場所などに、無人で飛来し監視活動が行えます。Id01_92_06
外国では軍事用にも、大小さまざまな物が出始め、偵察、攻撃など、これからバリエーションが増えていきそうです。

◇自動車メーカーのロボット
日本の大手自動車メーカーも、競ってロボットの開発をしています。Id01_92_05_2
一人乗りロボ、トランペット演奏のエンターテイメントロボ

二足歩行ロボットのASSIMOは、テレビCMでも良くみかけますね。
ASSIMOが開発順に並んでいましたが、どんどん小型化の方向へ進んでいるようです。Id01_92_04_2
   
◇コミニュケーションロボット
音声により、お客さまと対話が出来るロボットが人気を呼んでいます。Id01_92_03
ワカマルはこの会場でも大人気
  

Id01_92_11 家電メーカーも家庭用のコミニュケーションロボットを開発中

◇国立科学博物館
科学博物館は「地球館」と「日本館」に分かれています。
今回は、このうち「地球館」を駆け足で見てきました。
地球に生息する多くの生き物や、科学、物理など幅広い展示がされていました。Id01_92_17
   
江戸からくりも展示されていて、有名な「お茶運び人形」、静電気により発電をする「エレキテル」などもありました。Id01_92_18
江戸からくり「茶運び人形」
    
Id01_92_19_2 江戸からくり「エレキテル」
  
   
帰り際に思った事は、改めてゆっくりと時間をかけて見学したいと心から思いました。Id01_92_20
出口付近にある巨大な鯨のオブジェが見送ってくれました

■AirWolfの飛行ビデオ
この前、KENさんの「ロボットの集まり」で、ラジコンヘリの「AirWolf」を飛行させました。

その模様をジローさんに、携帯電話のムービーで撮って頂きました。
途中で、倒しても起き上がる「コロボット」を倒す攻撃を行い、2回目で倒しましたが、携帯ムービーの時間の制約からカットされていました。宜しければご覧ください。


下の画面クリックで、より大きな動画をご覧頂けます。

AirWolfの飛行ビデオ
AirWolfの飛行ビデオ
(2008/1/27)


■デアゴから「MY MUSIC STUDIO」
この度、デアゴ社から「週刊MY MUSIC STUDIO」(初回のみ490円)が発売されました。

「楽器を弾けなくても、楽譜が読めなくても、パソコンで音楽をクリエイト出来る!!」などとの歌い文句が書いてあります。

初回は490円、2回以降は1190円で、2号にはマイク付きヘッドホンが付いてきますので、Skypeなどにも使用できそうです。

◇構成
『音楽製作ソフトSingerSongWriter(SSW)』と『ソフト・シンセサイザーVirtualSoundCanvas(VSC)』の2つのソフトウェアが同梱されているCDに入っており、手持ちのPCにインストール出来るようになっています。
最初は機能や音源が限定されていますが、各号を購入するたびに追加されていき、同時に新曲がリリースされます。

初回はバインダー付きで販売されていましたので、早速購入し、インストールしてみました。
WinXPマシンは問題無くインストールできましたが、WinVistaマシンにはインストールできません。
説明を良く見ると、ウィルスチェックプログラムなどは停止するように・・・という注意書きが有り、その通りにすると無事インストールが出来ました。

インストールしたソフトを起動すると、このような画面が現れます。
(この画像はデフォルトの設定から多少いじくってあります)Id01_92_23
SSWの画面(クリックすると拡大します)

未完成と、完成品の曲データーがあり、未完成のデーターに、各楽器の足らないパートを、貼り付けていけば完成です。

パートを追加するたびに、再生していくと、だんだんと曲が完成していくのが分かります。

ここ何号かは追加して、遊んでみようか・・・と思っています。

■火星探査機画像に人影?
「大ロボット博」で色々なロボットを見てきて、そういえば探査ロボットなどもあったな・・・と思い出していたところ、とんでもないニュースが報道されました。

今朝テレビをつけたら、2004年にNASAが火星に送り込んだ、探査ロボット”Spirit”が撮影した画像に、「人間の姿のようなものが移っていた・・」と報道されていました。
以前にも人面岩などの報道がなされ、色々議論がなされてきました。
わたし個人としては、火星人が居ても良いのでは・・・と思い、色々調べてみる事にしました。

インターネットで報道されている画像はあまり良くなかったので、直接、NASAのWebサイトを調べてみました。そして、"Mars Exploration Rover Misshon"というWebサイトの中に、その元となった画像がありました。
Id01_92_26a
NASAのWebサイトよりDL
画像左端にある赤丸印に人影が(画像クリックで拡大)


横12758×3487ピクセルという途方もなく大きな画像でしたが、拡大していくと、確かに人影らしいものが現れてきました。
これを拡大していくと、次第に人間のような画像になりました。Id01_92_26b


Id01_92_26c_2
Id01_92_26d_2
Id01_92_26e
人影なのか、はたまた単なる岩なのか?(画像クリックで拡大)

この画像を、どのようにとらえるかは皆様のご想像におまかせします。

火星の画像は、昔見た”STAR WARS”第一作のルークの住んでいた地形に重なってしまいました。
全長40cmの”R2D2”を横に、なんとなく感激してしまいました。

それにしても、ロボットの仲間の探査ロボ君達は、地球以外の宇宙でも活躍しているのですね。Rover_main_2

画像はNASAの”Rover on the martian surface”

ロボ仲間に、そしてID-01に乾杯!!
(2008/1/25)


■あとがき
「大ロボット博」が開催されている上野の国立科学博物館は、月に一回休館となります。
この博物館以外にも、動物園、他の美術館全てが閉館となりますので、スケジュールを確かめてから行った方が宜しいかと思います。
実は、1/21(月)に行ったところ、そのまさかの閉館の日でした。
春になれば、桜並木が見事なこの辺り、今はなにもなく、北風がやけに冷たく感じられました。

| | コメント (0)

2008年1月19日 (土)

週刊myRobotを作ろう(86)

■更新情報 テレビリモコンブログラム (2008/1/20)

今年初めてのmyRobotの記事になります。
本年もどうぞ宜しくお願いします。

■ブレインOSのアップデート
イタリアデアゴ社のWebサイトにブレインOSのアップデートが2007/12/14付けでUPされています。
とりあえず、ZIPファイルをダウンロードして解凍し、ID-01のブレインOSをアップデートしてみました。Id01_91_23
”BRN-15JP”から”BRN-16JP”になった

ID-01の胸のディスプレイには、ご覧のように”BRN-16JP”と表示されています。
いろいろ動作テストをしてみましたが、特に問題は無い様です。

「週刊myRobt」が90号で完了してしまったこれからは、CD-ROM5などは来る術も無く、このような形でアップデートするしか方法が無いのでしょうか・・・・
Version1.6をダウンロードするには、ここをクリックすれば可能ですが、インストール時に出るDOSプロンプトのインフォメーションは、(当然ながら)イタリア語です。
日本のデアゴさんからは何の通達が出ていませんので、先行してダウンロード及びインストールされる方は自己責任でお願いします。
尚、問題があるようでしたら、CD-ROM4の”BRN-15JP”には再インストールすれば戻る事が可能です。
    
■プログラムを改良する・・・
以前から気になっていたのですが、VCL(Visual C-like)で組んだプログラムでは、左右の旋回が片車輪停止、反対側の車輪が動く、いわゆる急旋回としてしか組むことができません。
前進運動中に軽く進行方向を修正させ、そのまま直進させたい時など、急旋回は興ざめです。

◇穏旋回
これに対し、両車輪が回転しながらも、片方の車輪が反対側より遅くなる事により、穏やかな旋回(以後、穏旋回といいます)を行うには、PC_Control、Mobile_Control、C-Cでは可能なものの、VCLEではプログラミングが不可能でした。
従って、従来のVCLEで作成したユニリモコンのプログラムでは、なにかぎこちない旋回しか出来ずに不満に思っていました。
C-Like周りの資料を調べていたところ、”I2Cプロトコル”で穏旋回が出来る事が分りました。
”I2Cプロトコル”の解説を読むと、「I2Cバス上のモジュール間の通信は、それぞれのモジュールが使用可能なバーチャル・レジストリの書き込み/読み込みによって行われる。」と記載されており、沢山のコマンド群が記載されています。
早速、これにとりかかろうと思った矢先、年末から体調を崩しダウンしてしまいました。Id01_91_22
    
◇フルスピード
先日、KENさんから「遂にT-Droidなみの88回転/分を実現しました!」とのメールが届きました。
内容は、C-Likeで”I2Cプロトコル”を用いたBASE制御により、「PIDコントロールなしのパラメーターによる移動」でスピードが100%出る・・・という内容で、数行のプログラムが添付されていました。
このプログラム及び記事については、KENさんのブログにある「遂に実現!ロボ君フルスピード!」をご覧ください。

ID-01が移動する場合、通常はPIDコントロール(エンコーダーによるパルス制御)により、左右の回転がシンクロするように制御されております。この場合、最速でも100%の速度を出すことは出来ません。
KENさんのブログによりますと、車輪の回転でMAX88回転/分に対し、PIDコントロール有りの現在の回転数は実に49回転/分だそうです。ID-01の走行スピードに不満を持たれている方が多いのは、このせいです。

一方、このPIDコントロールを無くする事により100%のスピードが実現します。
この100%のスピードが「T-Droidなみの88回転/分」という事になります。
良い事づくめのようですが、左右の回転が制御されていない事から、左右の回転数の同調がとれず、個々のモーターボックス特性の僅かな差異から、直進する事が難しくなります。

◇I2Cプロトコル
KENさんに紹介していただいた、この突っ走りモードのコア部分を分析してみると、”I2Cプロトコル”でした。
これで年末に成し得なかった、同じI2Cプロトコル”で動作する「穏旋回」が、難なく可能になった事になります。

早速、テレビリモコンのプログラムに、「穏旋回」と、KENさんの「突っ走り」の機能を組み込み、テストを開始しました。
「Boost(突っ走り)」モードにすると、僅かながら左に曲がっていきます。
おそらく、左右のモーターボックスの僅かな特性の違いなのでしょう・・・・
全く同じ回転にするのは、かなり難しいかもしれませんね。

◇CL(C-Like)によるプログラミング
”I2Cプロトコル”はCL上でしか動作しませんので、今回はCLでプログラミングしてあります。
本来は、分かりやすいVCLでのプログラムで解説しながら・・・と思ったのですが、今回不可能ですので、ご了承ください。

■テレビリモコンの改良
従来のテレビリモコンプログラムでは、リモコンによる物を掴むとき用に微調整可能な、左右旋回はアングル指定45度、15度旋回を行えるようにしてありますので、この機能は残す事にしました。
併せて、「Boost(突っ走り)」モードを加えます。
今回は、「多機能リモコン」以外に、「一般のテレビリモコン(1~12)」でも使える機能限定版の2つのプログラムを用意する事にしました。

◇旋回モード
●穏旋回
穏旋回させるには、「走行ボタン」を押して前進させてから「左(右)旋回ボタン」を押すと、緩やかに旋回します。
穏旋回中、さらに同方向の旋回ボタンを押す事により急旋回(方車輪が止まった状態)に移るようにしてあります。
「前進」→「左(右)旋回」(穏旋回)→「左(右)旋回」(急旋回)という感じです。
そのままにしていますと、何時までも旋回を続けますので、「前進」あるいは「停止」ボタンを押して抜け出す事が出来ます。

●アングル指定旋回

尚、従来のアングル指定の旋回は、「停止」「後退」状態から入る事により可能です。
「停止」→「左(右)旋回」、「後退」→「左(右)旋回」

◇Boost(突っ走り)モード
KENさんが解説している「PIDコントロール無しの100%走行」モードです。
ID-01にしては、かなり速いな・・・・という位のスピードが出ます。
ただしスピードが楽しめる反面、バッテリーの減りには気をつける必要があります。
私は屋上で動作・走行テストをしていますが、Mobile ControlでB.T接続して、モバイルフォンのモニター画面で電圧をチェックしながら走行させています。
この走行モードですと、瞬間的に電圧がかなり低下しますので、このBoostパワーは、ここぞ・・という時に使用された方が良いと思います。

◇テレビリモコンの割り当て
先ほどもふれましたが、今回「多機能リモコン」と「普通のテレビリモコン」の2通りのプログラムをダウンロードできるようにしました。

重複しますが、以前「週刊myRobotを作ろう(84)」でご紹介した記事を使用して、まず「多機能リモコン」のコントロールの割り当てを説明します。
Id01_90_22
  
●多機能リモコン
前回とほとんど同仕様ですが、16に「Boost(突っ走り)モード」を追加しました。
①電源ボタン
プログラム終了
②ヘッドに関するセクション
各種警報、首の左右上下、中立、写真撮影、指の開閉
③ロボットの移動と手動きセクション
前後左右、Uターン、左右腕上下、腰上げ下げ
④音声の録音などに使用予定
多機能リモコンのプログラム概要は、こんなところです。

○詳細(赤字はユニリモコン割り当て番号)
①電源ボタン 0 
電源)プログラム終了
②セクション
1)クラクションと足のビーコン点灯 
2)サイレンと赤LED点滅 
3)口笛と緑LED点滅 
4)首左回転 
5)センター位置(左右動作) 5
6)首右回転 
7)上を向く 
8)センター位置(上下動作) 8 
9)下を向く 
10)手の開閉(トグル動作) 10
(トクル動作とは、一回押すたびに「開」または「閉」を、順番に繰り返します)
11)空き 11
12)写真撮影(赤LED点滅、目点滅、シャッター音) 12
③移動セクション
左側 +)左腕上へ 26
    -)左腕下へ 27

真ん中の4つのスイッチ
 上側) 緑LED点灯(トグル動作) 13
 2番目) 黄LED点灯(トグル動作) 14
 3番目) デジタル出力4(トグル動作) 15
 4番目) Boost(突っ走り)モード 16

右側 +)右腕上へ 28
    -)左腕下へ 29 

左列2ボタン
上側)左旋回15度 17
下側)180度ターン 18

クロスバータイプ
真ん中セレクトスイッチ
上)前進 21
左)左旋回(穏旋回と45度) 22
センタボタン)停止 25
右)右旋回(穏旋回と45度) 23
下)後進 24

右列2ボタン
上側)右旋回15度 19
下側)腰上げ下げ(トグル動作) 20
④音声録音セクション
未定義 30

●一般テレビリモコン

一般テレビリモコンでは、操作ボタンが少ない事から、多機能リモコンの機能を抜粋してアサインしました。Id01_90_22a
  
使用するのは、①電源スイッチと、②のチャンネル(1~12)ボタンだけです。
画像のように、「前(5)」「後(11)」「左(7)」「右(9)」と十字型を想定、真ん中の8で停止のように配列しました。
そして、「前進(5)」の真上に「Boost(2)」をアサインしました。

○詳細(赤字はユニリモコン割り当て番号)
①電源ボタン 0 
電源)プログラム終了

②チャンネルボタン
1)写真撮影(赤LED点滅、目点滅、シャッター音) 1
2)Boost(突っ走り)モード 
3)サイレンと赤LED点滅 
4)左旋回15度 
5)前進 
6)右旋回15度 
7)左旋回(穏旋回/45度) 
8)停止 
9)右旋回(穏旋回/45度) 
10)手の開閉(トグル動作) 10
(トクル動作とは、一回押すたびに「開」または「閉」を、順番に繰り返します)
11)後進 11
12)180度ターン 12

とりあえず主要な機能はモーラしています。

●PC_Controlによる登録方法
「多機能リモコン」と「一般のテレビリモコン」どちらの登録も、PC_Controlによる登録方法で行うと簡単に行えます。
週刊myRobotを作ろう(84)」の同項目名で詳細が載っておりますので、宜しければご参考にされて頂ければ・・・と思います。

◇「多機能リモコン」用、「一般テレビリモコン」用のプログラム公開
今回は2つのプログラムを公開します。
どちらもC-Likeで組みました。
「多機能リモコン」用は20以上の割付、「一般テレビリモコン」用は13の割付を行う事により、ID-01を自由にコントロールする事が可能です。

どちらのプログラムにも、前回同様、「プログラムロック防止の対応」として、リモコンのボタンを押した後、0.8秒間は次の命令を受け付けないようにポーズが掛かるようにしてあります。ただし、この対処はあくまでもプログラムロックが起こりにくくなるという対処ですので、完璧ではありません。どうぞご了承ください。

プログラムは、「ファイルのダンロード形式」と、その後に「ソースリスト形式」の2つの方式で公開しております。
お好きな方法で取り込んで頂き、参考頂ければ・・・と思っております。

(ご注意)
プログラムをダウンロードしてお使い頂くのはご自由ですが、あくまでも自己責任でご使用ください。

下の行からプログラムをダウンロードします。そして拡張子clikeで適当なフォルダーに保存して、VCLEで開いてください。
私は、”Remot_Control03Ux.clike”という名前で保存しました。
(03Uの後ろのxは、バージョンが更新されるたびに変わるので仮名をつけました)
プログラムをダウンロードされるときは、下の「ダウンロードでのご注意」をご覧ください。

*****************************************
{多機能リモコン用プログラムダウンロード}
「Remot_Control03Ub.clike」をダウンロード 

*****************************************

現在”Remot Control03Ub.clike”が最新バージョンです (2008/01/20)

*****************************************
{一般リモコン用プログラムダウンロード}
「Remot_Control01e.clike」をダウンロード 

*****************************************

現在”Remot Control01e.clike”が最新バージョンです (2008/01/20)

「ダウンロードでのご注意」
ファイルのダンロードに関しては、拡張子が”xml”に変わってしまいますので、お手数ですが、以下の方法でダンロードされてください。

1)上記ダウンロー
「Remot_Control03x.clike」をダウンロード を右クリックし、「対象をファイルに保存」を選択します。Id01_90_11
    
2)フィル名が、”RemotControl03x.xml”と出てきますので、後ろ3文字"xml"を消して、”clike”という文字を半角英字で入力して、任意のフォルダーに保存します。Id01_90_12_2

①"xml"3文字を、”clike”に変えて、②保存する
(画像クリックで拡大します)

■テレビリモコンプログラム
プログラムは「掲示板」で良く使われているプログラムソース形式です。

ソース形式のプログラムは、カット&ペーストで、テキストエディターに読み込み、適当な名前で保存してC Editorで読み込んでご利用下さい。

◇多機能リモコン用
ここから下です------------------------------
/**
*
* @author fumi
* @version 1.0
*/

#include "c-like.h"
#include "robot.h"

counter Flag1 = new(counter);
counter FlagD1 = new(counter);
counter FlagD2 = new(counter);
counter FlagD3 = new(counter);
counter FlagHand = new(counter);
counter FlagHip = new(counter);
counter FlagD4 = new(counter);
counter FlagFine = new(counter);
counter FlagLR = new(counter);

declare( behavior(Action) );

void Forward();
void Back();
void Stop();
void Right();
void Left();
void Init();
void Fine();
void Right15();
void Left15();
void Turn();
void HomePos();
void TakePic();
void Boost();

define( behavior(Main))
{
Init();
start(Action);
}

define( behavior(Action) )
{
local(urc) = wait_for (urc, update);
if (urc_compare(&local(urc), 0))
{
  say_phrase(4);
  Fine();
  say_phrase(22);
  stop(Action);
}
else
{
}
if (urc_compare(&local(urc), 21))
{
  say_phrase(27);
  Forward();
}
else
{
  if (urc_compare(&local(urc), 22))
  {
   say_phrase(23);
   Left();
  }
  else
  {
   if (urc_compare(&local(urc), 25))
   {
    say_phrase(4);
    Stop();
   }
   else
   {
    if (urc_compare(&local(urc), 23))
    {
     say_phrase(24);
     Right();
    }
    else
    {
     if (urc_compare(&local(urc), 24))
     {
      say_phrase(28);
      Back();
     }
     else
     {
      if (urc_compare(&local(urc), 17))
      {
       say_phrase(23);
       Left15();
      }
      else
      {
       if (urc_compare(&local(urc), 19))
       {
        say_phrase(24);
        Right15();
       }
       else
       {
        if (urc_compare(&local(urc), 18))
        {
         say_phrase(60);
         Turn();
        }
        else
        {
         if (urc_compare(&local(urc), 16))
         {
          say_phrase(78);
          Boost();
         }
         else
         {
         }
        }
       }
      }
     }
    }
   }
  }
}
if (urc_compare(&local(urc), 26))
{
  left_arm_r(3);
}
else
{
  if (urc_compare(&local(urc), 27))
  {
   left_arm_r(-3);
  }
  else
  {
   if (urc_compare(&local(urc), 28))
   {
    right_arm_r(3);
   }
   else
   {
    if (urc_compare(&local(urc), 29))
    {
     right_arm_r(-3);
    }
    else
    {
     if (urc_compare(&local(urc), 10))
     {
      if (get(FlagHand) == 0)
      {
       say_phrase(11);
       hand_close(4);
       set(FlagHand,1);
      }
      else
      {
       say_phrase(12);
       hand_open();
       set(FlagHand,0);
      }
     }
     else
     {
      if (urc_compare(&local(urc), 20))
      {
       if (get(FlagHip) == 0)
       {
        base_up();
        set(FlagHip,1);
       }
       else
       {
        base_down();
        set(FlagHip,0);
       }
      }
      else
      {
      }
     }
    }
   }
  }
}
if (urc_compare(&local(urc), 4))
{
  head_pan_r(-4);
}
else
{
  if (urc_compare(&local(urc), 5))
  {
   head_pan(6);
  }
  else
  {
   if (urc_compare(&local(urc), 6))
   {
    head_pan_r(4);
   }
   else
   {
    if (urc_compare(&local(urc), 7))
    {
     head_tilt_r(4);
    }
    else
    {
     if (urc_compare(&local(urc), 8))
     {
      head_tilt(2);
     }
     else
     {
      if (urc_compare(&local(urc), 9))
      {
       head_tilt_r(-4);
      }
      else
      {
       if (urc_compare(&local(urc), 12))
       {
        TakePic();
       }
       else
       {
       }
      }
     }
    }
   }
  }
}
if (urc_compare(&local(urc), 1))
{
  lights(true);
  play_sound(1);
  lights(false);
}
else
{
  if (urc_compare(&local(urc), 2))
  {
   led_blink(LED_RED);
   play_sound(2);
   led_off(LED_RED);
  }
  else
  {
   if (urc_compare(&local(urc), 3))
   {
    led_blink(LED_GREEN);
    play_sound(5);
    if (get(FlagD1) == 0)
    {
     led_off(LED_GREEN);
    }
    else
    {
     led_off(LED_GREEN);
     led_on(LED_GREEN);
    }
   }
   else
   {
    if (urc_compare(&local(urc), 13))
    {
     if (get(FlagD1) == 0)
     {
      led_on(LED_GREEN);
      set(FlagD1,1);
     }
     else
     {
      led_off(LED_GREEN);
      set(FlagD1,0);
     }
    }
    else
    {
     if (urc_compare(&local(urc), 14))
     {
      if (get(FlagD2) == 0)
      {
       led_on(LED_YELLOW);
       set_output(3,ACTIVE);
       set(FlagD2,1);
      }
      else
      {
       led_off(LED_YELLOW);
       set_output(3,INACTIVE);
       set(FlagD2,0);
      }
     }
     else
     {
      if (urc_compare(&local(urc), 15))
      {
       if (get(FlagD3) == 0)
       {
        set_output(4,ACTIVE);
        set(FlagD3,1);
       }
       else
       {
        set_output(4,INACTIVE);
        set(FlagD3,0);
       }
      }
      else
      {
       if (urc_compare(&local(urc), 99))
       {
        if (get(FlagD4) == 0)
        {
         lights(true);
         set(FlagD4,1);
        }
        else
        {
         lights(false);
         set(FlagD4,0);
        }
       }
       else
       {
       }
      }
     }
    }
   }
  }
}
msleep(800);
}

void Forward()
{
if (get(Flag1) == 8)
{
  Stop();
}
else
{
}
led_off(LED_ALL);
led_on(LED_GREEN);
unsigned char buf;
buf = 0X02;
i2c_write(42,1,&buf,1);
buf = 0X00;
i2c_write(42,11,&buf,1);
i2c_write(42,12,&buf,1);
set(Flag1,20);
set(FlagLR,0);
}

void Back()
{
if (get(Flag1) >= 20)
{
  Stop();
}
else
{
}
if (get(Flag1) != 8)
{
  led_off(LED_ALL);
  led_blink(LED_YELLOW);
  move_speed(-20);
  move_speed(-40);
  move_speed(-60);
  set(Flag1,8);
}
else
{
}
set(FlagLR,0);
}

void Stop()
{
led_off(LED_ALL);
led_on(LED_RED);
base_stop();
set(Flag1,0);
set(FlagLR,0);
}

void Right()
{
if (get(Flag1) >= 20)
{
  led_off(LED_ALL);
  led_blink(LED_YELLOW_RIGHT);
  if (get(FlagLR) == 1)
  {
   unsigned char buf;
   buf = 0X41;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
   set(FlagLR,2);
  }
  else
  {
   unsigned char buf;
   buf = 0X21;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
  }
  set(FlagLR,1);
}
else
{
  Stop();
  led_off(LED_ALL);
  led_blink(LED_YELLOW_RIGHT);
  turn(45,25);
  led_off(LED_ALL);
}
}

void Left()
{
if (get(Flag1) >= 20)
{
  led_off(LED_ALL);
  led_blink(LED_YELLOW_LEFT);
  if (get(FlagLR) == 5)
  {
   unsigned char buf;
   buf = 0X40;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
   set(FlagLR,6);
  }
  else
  {
   unsigned char buf;
   buf = 0X20;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
  }
  set(FlagLR,5);
}
else
{
  Stop();
  led_off(LED_ALL);
  led_blink(LED_YELLOW_LEFT);
  turn(45,-25);
  led_off(LED_ALL);
}
}

void Init()
{
set(Flag1,0);
set(FlagD1,0);
set(FlagD2,0);
set(FlagD3,0);
set(FlagD4,0);
set(FlagHand,0);
set(FlagHip,0);
set(FlagFine,0);
set(FlagLR,0);
config_gpio(3,OUTPUT);
config_gpio(4,OUTPUT);
HomePos();
say_phrase(114);
led_off(LED_ALL);
led_blink(LED_GREEN);
say_phrase(21);
led_off(LED_ALL);
}

void Fine()
{
Stop();
led_off(LED_ALL);
led_blink(LED_GREEN);
set(FlagFine,1);
HomePos();
if (get(FlagHand) == 1)
{
  hand_open();
}
else
{
}
lights(false);
set_output(3,INACTIVE);
set_output(4,INACTIVE);
led_off(LED_ALL);
}

void Right15()
{
Stop();
led_off(LED_ALL);
led_blink(LED_YELLOW_RIGHT);
turn(15,20);
led_off(LED_ALL);
set(FlagLR,0);
}

void Left15()
{
Stop();
led_off(LED_ALL);
led_blink(LED_YELLOW_LEFT);
turn(15,-20);
led_off(LED_ALL);
set(FlagLR,0);
}

void Turn()
{
Stop();
led_off(LED_ALL);
led_blink(LED_YELLOW_RIGHT);
turn(180,25);
led_off(LED_ALL);
set(FlagLR,0);
}

void HomePos()
{
set_blocking(false);
head_tilt(2);
if (get(FlagFine) == 0)
{
  left_arm(15);
  right_arm(7);
}
else
{
  left_arm(0);
  right_arm(0);
}
base_down();
lights(false);
set_blocking(true);
head_pan(6);
}

void TakePic()
{
led_blink(LED_RED);
say_phrase(58);
if (get(FlagD2) == 0)
{
  led_on(LED_YELLOW);
  set_output(3,ACTIVE);
}
else
{
}
take_picture();
play_sound(11);
led_off(LED_RED);
if (get(FlagD2) == 0)
{
  led_off(LED_YELLOW);
  set_output(3,INACTIVE);
}
else
{
}
}

void Boost()
{
if (get(Flag1) == 8)
{
  Stop();
}
else
{
}
led_off(LED_ALL);
led_on(LED_GREEN);
led_blink(LED_RED);
unsigned char buf;
buf = 0X42;
i2c_write(42,1,&buf,1);
buf = 0X00;
i2c_write(42,11,&buf,1);
i2c_write(42,12,&buf,1);
set(Flag1,21);
set(FlagLR,0);
}

ここから上です-------------------------------------
   

◇一般テレビリモコン用
ここから下です------------------------------
/**
*
* @author fumi
* @version 1.0
*/

#include "c-like.h"
#include "robot.h"

counter Flag1 = new(counter);
counter FlagD1 = new(counter);
counter FlagD2 = new(counter);
counter FlagD3 = new(counter);
counter FlagHand = new(counter);
counter FlagHip = new(counter);
counter FlagD4 = new(counter);
counter FlagFine = new(counter);
counter FlagLR = new(counter);

declare( behavior(Action) );

void Forward();
void Back();
void Stop();
void Right();
void Left();
void Init();
void Fine();
void Right15();
void Left15();
void Turn();
void HomePos();
void TakePic();
void Boost();

define( behavior(Main))
{
Init();
start(Action);
}

define( behavior(Action) )
{
local(urc) = wait_for (urc, update);
if (urc_compare(&local(urc), 0))
{
  say_phrase(4);
  Fine();
  say_phrase(22);
  stop(Action);
}
else
{
}
if (urc_compare(&local(urc), 5))
{
  say_phrase(27);
  Forward();
}
else
{
  if (urc_compare(&local(urc), 7))
  {
   say_phrase(23);
   Left();
  }
  else
  {
   if (urc_compare(&local(urc), 8))
   {
    say_phrase(4);
    Stop();
   }
   else
   {
    if (urc_compare(&local(urc), 9))
    {
     say_phrase(24);
     Right();
    }
    else
    {
     if (urc_compare(&local(urc), 11))
     {
      say_phrase(28);
      Back();
     }
     else
     {
      if (urc_compare(&local(urc), 4))
      {
       say_phrase(23);
       Left15();
      }
      else
      {
       if (urc_compare(&local(urc), 6))
       {
        say_phrase(24);
        Right15();
       }
       else
       {
        if (urc_compare(&local(urc), 12))
        {
         say_phrase(60);
         Turn();
        }
        else
        {
         if (urc_compare(&local(urc), 2))
         {
          say_phrase(78);
          Boost();
         }
         else
         {
         }
        }
       }
      }
     }
    }
   }
  }
}
if (urc_compare(&local(urc), 1))
{
  TakePic();
}
else
{
  if (urc_compare(&local(urc), 3))
  {
   led_blink(LED_RED);
   play_sound(2);
   led_off(LED_RED);
  }
  else
  {
   if (urc_compare(&local(urc), 10))
   {
    if (get(FlagHand) == 0)
    {
     say_phrase(11);
     hand_close(4);
     set(FlagHand,1);
    }
    else
    {
     say_phrase(12);
     hand_open();
     set(FlagHand,0);
    }
   }
   else
   {
    if (urc_compare(&local(urc), 20))
    {
     if (get(FlagHip) == 0)
     {
      base_up();
      set(FlagHip,1);
     }
     else
     {
      base_down();
      set(FlagHip,0);
     }
    }
    else
    {
    }
   }
  }
}
msleep(800);
}

void Forward()
{
if (get(Flag1) == 8)
{
  Stop();
}
else
{
}
led_off(LED_ALL);
led_on(LED_GREEN);
unsigned char buf;
buf = 0X02;
i2c_write(42,1,&buf,1);
buf = 0X00;
i2c_write(42,11,&buf,1);
i2c_write(42,12,&buf,1);
set(Flag1,20);
set(FlagLR,0);
}

void Back()
{
if (get(Flag1) >= 20)
{
  Stop();
}
else
{
}
if (get(Flag1) != 8)
{
  led_off(LED_ALL);
  led_blink(LED_YELLOW);
  move_speed(-20);
  move_speed(-40);
  move_speed(-60);
  set(Flag1,8);
}
else
{
}
set(FlagLR,0);
}

void Stop()
{
led_off(LED_ALL);
led_on(LED_RED);
base_stop();
set(Flag1,0);
set(FlagLR,0);
}

void Right()
{
if (get(Flag1) >= 20)
{
  led_off(LED_ALL);
  led_blink(LED_YELLOW_RIGHT);
  if (get(FlagLR) == 1)
  {
   unsigned char buf;
   buf = 0X41;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
   set(FlagLR,2);
   set(FlagLR,2);
  }
  else
  {
   unsigned char buf;
   buf = 0X21;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
  }
  set(FlagLR,1);
}
else
{
  Stop();
  led_off(LED_ALL);
  led_blink(LED_YELLOW_RIGHT);
  turn(45,25);
  led_off(LED_ALL);
}
}

void Left()
{
if (get(Flag1) >= 20)
{
  led_off(LED_ALL);
  led_blink(LED_YELLOW_LEFT);
  if (get(FlagLR) == 5)
  {
   unsigned char buf;
   buf = 0X40;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
   set(FlagLR,6);
  }
  else
  {
   unsigned char buf;
   buf = 0X20;
   i2c_write(42,3,&buf,1);
   buf = 0X00;
   i2c_write(42,11,&buf,1);
   i2c_write(42,12,&buf,1);
  }
  set(FlagLR,5);
}
else
{
  Stop();
  led_off(LED_ALL);
  led_blink(LED_YELLOW_LEFT);
  turn(45,-25);
  led_off(LED_ALL);
}
}

void Init()
{
set(Flag1,0);
set(FlagD1,0);
set(FlagD2,0);
set(FlagD3,0);
set(FlagD4,0);
set(FlagHand,0);
set(FlagHip,0);
set(FlagFine,0);
set(FlagLR,0);
config_gpio(3,OUTPUT);
config_gpio(4,OUTPUT);
HomePos();
say_phrase(114);
led_off(LED_ALL);
led_blink(LED_GREEN);
say_phrase(21);
led_off(LED_ALL);
}

void Fine()
{
Stop();
led_off(LED_ALL);
led_blink(LED_GREEN);
set(FlagFine,1);
HomePos();
if (get(FlagHand) == 1)
{
  hand_open();
}
else
{
}
lights(false);
set_output(3,INACTIVE);
set_output(4,INACTIVE);
led_off(LED_ALL);
}

void Right15()
{
Stop();
led_off(LED_ALL);
led_blink(LED_YELLOW_RIGHT);
turn(15,20);
led_off(LED_ALL);
set(FlagLR,0);
}

void Left15()
{
Stop();
led_off(LED_ALL);
led_blink(LED_YELLOW_LEFT);
turn(15,-20);
led_off(LED_ALL);
set(FlagLR,0);
}

void Turn()
{
Stop();
led_off(LED_ALL);
led_blink(LED_YELLOW_RIGHT);
turn(180,25);
led_off(LED_ALL);
set(FlagLR,0);
}

void HomePos()
{
set_blocking(false);
head_tilt(2);
if (get(FlagFine) == 0)
{
  left_arm(15);
  right_arm(7);
}
else
{
  left_arm(0);
  right_arm(0);
}
base_down();
lights(false);
set_blocking(true);
head_pan(6);
}

void TakePic()
{
led_blink(LED_RED);
say_phrase(58);
if (get(FlagD2) == 0)
{
  led_on(LED_YELLOW);
  set_output(3,ACTIVE);
}
else
{
}
take_picture();
play_sound(11);
led_off(LED_RED);
if (get(FlagD2) == 0)
{
  led_off(LED_YELLOW);
  set_output(3,INACTIVE);
}
else
{
}
}

void Boost()
{
if (get(Flag1) == 8)
{
  Stop();
}
else
{
}
led_off(LED_ALL);
led_on(LED_GREEN);
led_blink(LED_RED);
unsigned char buf;
buf = 0X42;
i2c_write(42,1,&buf,1);
buf = 0X00;
i2c_write(42,11,&buf,1);
i2c_write(42,12,&buf,1);

set(Flag1,21);
set(FlagLR,0);
}

ここから上です-------------------------------------
 

◇ご注意
尚、動作に関しましては、プログラムが正常に処理されて、ロボ君の各機能が動作する状態にあり、且正しく動いてくれて・・・という前提条件が付きます。
また、検証途中でもありますので、プログラミングミスが多々あるかと思います。
実際に走行させる方は、思わぬ動きをする場合もありますので、広めの場所で、周囲の安全を確認してから、注意をはらいながら走行させる必要があります。
もし、動作中にロボ君が何かに引っかかってそのままにしていると、モーターが止まり過電流が流れ、ボードから煙が・・・などのトラブルも考えられます。
ロボ君がひっかかったらすぐに持ち上げ、速やかに電源を切るなどの処理が必要です。
ご使用にあたっては、あくまでも自己責任でお願いします。

また、実際に検証された方で、バグ等お気付きの点がございましたら、是非、ご意見をコメントでお寄せ下さい。
(2008/1/19)

■あとがき
年末に体調を崩して以来、やっとID-01の作業を開始できました。
今回の作業は、以前作成したプログラムの手直しでしたので、比較的容易にとりかかれました。

| | コメント (4)

2008年1月 7日 (月)

週刊myRobotちょっとひといき(5)

■更新情報 物体回避 (2008/1/13) 

新年おめでとうございます。
今年からは、完成したID-01でいろいろな事を試す事ができますね。
本年もどうぞ宜しくお願いいたします。

3DCGによる年賀のご挨拶
3DCGによる年賀のご挨拶

年末から体調を崩してブログの更新が滞っておりました。
怠けついでに、全長40cmのR2D2のトイロボットを手に入れてしまいました。Id01_91_14
並んで見ると背丈はほぼ同じようです(画面クリックで拡大)
    
STARWARS R2-D2 Interactive
ご覧のように、ID-01とほぼ同等の背格好のスターウォーズでおなじみの、R2D2のトイロボットで、アメリカのHasbro社から発売されています。

このトイロボットは2005年に発売されましたが、スターウォーズファン以外の方にも根強い人気が有り、結構品薄状態が続いていました。
毎年、クリスマスシーズンを中心に再販売を繰り返してきました。
私も早いうちに欲しかったのですがなかなか手に入らず、やっと今年2008年新年早々、この輸入品を入手することが出来ました。
英文のマニュアルには「対象年齢8歳以上」とかかれています。
リモコンなどは一切なく、ロボットに与える命令はすべて音声で行います。しかも、流暢なネイティブイングリッシュで離さないと認識してもらえないようです。

◇動作テスト

●電源ON
お尻についている電源SWをONにすると、ヘッドが左右に200度ほど回転し、頭のLEDが青と赤に交互に点滅し、”Powering UP(イニシャライズ)”を始めます。この間、約30~40秒かかり青赤のLEDが同時に点灯し消灯したら、いよいよ準備完了になります。(尚、下の動画では”Powering UP”の時間を割愛してあります)

●走行ロックボタン
R2D2のおなかにある赤いボタンが「走行ロックボタン」で、これを押さない限り突然走りだしたりする危険はありません。
ID-01にも是非取り付けたい機能ですね。

●動画
とりあえず最初に音声によるコマンドのテスト(走行ロック状態)を行い動画に撮ってみました。
上手でない私の英語を披露するわけにもいかず、合成音声に差し替えてあります。
宜しければご覧下さい。
下の画面をクリックすると動画がご覧いただけます
R2D2 Interctive (1)
R2D2 Interctive (1)

◇走行

”Go on Patrol”というと、部屋中を走行してくれて、ID-01同様に適度に障害物を回避してくれます。それもなかなかスムーズに回避します。
走行による、障害物回避等の様子は、いずれ動画に撮ってUPしたいと思います。

◇機能・構造
●走行系
ID-01と同様に、①ひとつの自由輪及び、②左右の主車輪で走行します。Id01_91_16
裏側から見たR2D2です

①自由輪
ID-01は自由輪が尾輪なのに対し、R2D2は前輪になります。
トラックボールのような大きな球体が、360度自由に回転するようになっています。

②左右の主車輪
ID-01同様、左右の車輪は独立して回転します。
ただ、R2D2の走行について関心したことは、ID-01よりも直進が何故かスムースです。
まだ分解していないので構造は未確認ですが、ロボット本体内部で左右回転軸が直結しており、左回転の時は左を切り離し、右回転の時は右を切り離すだけという、非常にシンプルな構造なのかもしれません。
ID-01も、直進の時だけ、左右の回転軸を直結するクラッチ機構などを設ければ良いようにも思われるのですが・・・
と、思いつつ、足を分解したところ左右の足部分に独立したモーターが入っており、直結説はあえなく幕を閉じました。

障害物回避も素晴らしく、細い机の脚をされいに回避してしまったのには驚かされました。
ID-01よりも、遥かに安いトイロボットでさえこれだけの性能があるとなると、ID-01も改良の余地が多々ありそうな気がします。

●センサー
搭載されているセンサーは、ID-01に比べて種類も少なくシンプルですが、非常に機能的に設計されています。
あるのは、①2対の超音波センサーと、②遠赤外線センサーだけですが、夫々、障害物回避、音源方向特定、タッチ感知、人間・動物感知などが行えます。Id01_91_15
2種類のセンサーが機能的にレイアウトされている
       
①2対の超音波センサー
ID-01は2つの送信部、そして3つの受信ユニットがありますが、R2D2では、たった2個の超音波センサーユニットで左右の送・受信を行っています。
仕組みは、2対の超音波センサーが左右に60度ほど開いていてLRの差異を検知します。
さらに、ヘッドを回転させる事により広い角度をセンシングする構造になっています。詳しくは「物体回避行動」の項で説明したいと思います。
そして、R2D2に音声でコマンドを告げると、声のした方に首を向けます。
これは、ID-01でもおなじみの複数のマイクによる音源方向探知機能によるもので、2組の超音波センサーが、ステレオマイクを兼ねています。
そして、タッチセンサーつまり、頭をたたいたりする音をこのマイクで感知していると思われます。驚きのマルチセンサーユニットですね。

②遠赤外線(IR)センサー
インフラレッド(IR)のセンサーにより、人間や、動物が近くにいるかどうかの判断を行います。
良く見ると真ん中に仕切りがあり、左右検知できる仕組みになっているようです。
障害物回避行動中は、人間や動物がR2D2に近づいたりすると暫く停止して待っています。これに対し、最初から止まっているものに関しては、回避行動を行うだけのようです。
良く出来ていますね。
隠しコマンドのようですが、”Follow me!”と命令すると、自分の後を追従してくるようです。
そして追従性はあまり良くないとの事で、手をかざすなどしてフォローしてやる必要が有りそうです。
何れテストしたいと思っています。

●へッド部の回転
ID-01と比べて、このヘッド部はなんと小気味良く素早く動くのでしょうか・・・
前掲した動画でもお分かりのように、相手の音源方向を向いたり、LED,サウンドとシンクロして感情表現をしたりと、かなり動きが効果的です。
ID-01のように首のチルトが無いのに何故ここまで感情が豊かなのでしょうか・・・
的を得たヘッドが回転するタイミング、それに合わせたサウンド、LEDの明滅もさる事ながら、小気味の良いヘッドの回転速度もそれに加担しているような気もします。

一方、ID-01の首の動作が遅いと感じるのは私だけでしょうか・・・
ID-01も、動作スピードのアップが必要かもしれません。
これを機に、改造サーボなどの仕組みを利用して、素早く動かす時が到来したのかもしれません。今年の目標にしてみます。

◇パワーソース
気になるパワーソースですが、マニュアルには、アルカリで単一電池×4本、単三電池×4本と書いてあり、なかなかの大食いの気配です。
常時、単一のアルカリ電池を4本を交換ともなると、コストがかさむのが目に見えていますので、今回は、ID-01でも使用してしている充電可能な”eneloop”を使用する事にしました。
eneloopは単三型しかないので、100円ショップで手に入れた「単三→単一変換アダプター」を使用してみました。Id01_91_18
    
背中の蓋をあけて、最初に単三を4本セットしますが、ご覧のようにかなり変則的なレイアウトですね。
そしてその上に覆いかぶさるように、単一を4本セットしていきます。Id01_91_17
単三電池×4本(左側)、その上に単一電池×4本(右側) 
        
走行を主体にする場合は、容量の大きな単一電池を使用する必要があるかもしれません。現在のところ、ある程度の走行動作を含めて遊んでいますが、8本の単三型eneloopで結構楽しめています。

◇物体回避
超音波センサーの項で少しふれてみましたが、R2D2は物体回避をするのに、2対の超音波センサーと、首の回転運動を行う事により、実に見事に物体回避を行っています。

まずは次の動画をご覧ください。

下の画面をクリックすると動画がご覧頂けます。
R2D2 Interctive (2)
R2D2 Interctive (2)
  
ご覧になってお分かりのように、首の動きを含めて実にきれいに無駄なく物体回避を行います。
動画では5つの動作を分析してみました。
①正面からの回避、②右方面への回避、 ③左方面への回避、 ④正面からの回避、 ⑤斜め右方向からの進入

このうち①と④は正面からの回避を行っていますが、真正面から進入した場合は、必ず左に回避する事が分かりました。
①の場合、壁を回避した後、床に置いた小さな物体も回避している様子がお分かりいただけます。
⑤の場合は、真っ直ぐより若干右斜めに進入していますが、全くためらわずに右に回避行動を行っています。

●物体回避の原理
○超音波センサー
トイロボットR2D2を真上から見た画像です。
Id01_91_19
ご覧のように、2組の超音波センサーが左右に約50度くらいの開き具合で取り付けられています。
ID-01同様、超音波で前方との距離を計測して、距離が近くなってきた場合、物体回避行動に移ります。
物体回避行動に移る前に、左右どちらの方向によけるか、2対の超音波センサーの差異を計測します。

①④の進入のように、前方の障害物が真正面にある場合は、左右の距離はL=Rになります。

②や⑤の進入の場合は、左右の距離はL<Rになります。⑤の場合も僅かですが、Rの距離の方が大きくなるわけです。

③の進入の場合は、L>Rになります。

○物体回避動作
動画のなかでスローのリプレイ画面をご覧頂くとお分かりのように、R2D2は物体回避運動に入ると、左右どちらに回避する場合も、15度くらい右に頭を振り、また正面を向きます。
その後、正面で計測したLRの差異により異なった行動を起こします。


①③④の場合

正面で計測した左右の差異は、L=R及び、L>Rです。この場合、左後方に頭を回転させ、障害物が無ければ、ボディを左回転させ、そして前進します。つまり、物体を左に向きを変え回避した事になります。

②⑤の場合

正面で計測した左右の差異が、L<Rの場合、右後方に頭を回転させ、障害物が無ければ、ボディを右回転させ、そして前進します。
つまり、物体を右に向きを変え回避した事になります。

これらの動きを滑らかに、且つ、ピポパという効果音を入れながら回避する行動は、映画「STARWARS」をのR2D2を思い出し、見ていて気持ちの良いものだと感じました。
しかし、あくまでもトイロボットですから、物体回避も完璧ではないようです。
袋小路に入ってしまうと、左右の回避運動の繰り返しになってしまいます。
この辺りは、今後ID-01と「物体回避」の知恵比べをしてみようかとも、考えております。

尚、前方に人間、動物などの熱源を感じると、暫く停止して、相手がどいてくれるのを待つなどの動作がプログラムされているようです。


ある時、私の言った言葉をどう理解したのか定かではありませんが、手や人の顔の追跡モードになった事があります。
R2D2の前で手を左右に振ると、ヘッド部を手を動かした分だけトラッキングします。
おそらく、左右のIRセンサーと、あるいは超音波センサーを併用しているのかもしれませんが、このモードにはどのような言葉を言ったら良いのやら、良くわかっていません。

●試していないコマンド
まだまだ、数ある音声コマンドを試していません
Id01_91_20_2
    
このトイロボットは、数年前に発売されたもので、設計はかなり年季が入っている筈ですが、まだまだ面白く楽しめます。
すべてのコマンドを試していませんので、これから新しい発見がありそうです。
何か分かりましたら、追ってレポートしたいと思います。
(2008/1/13)


■あとがき
冒頭にお話しましたように、今年の正月は体調を崩し寝正月になってしまいました。
頭痛、めまいが伴っていたせいか、PCや、テレビをあまり見る事が出来ず、ぼーっと、部屋から窓の明かりを見ていました。
普段の生活では余り気にしていない、日照時間の変化に気がつきました。
ついこの前では夕方4時を過ぎると夜のとばりが降りてきていたのですが、冬至を過ぎてからは、すぐ暗くならずに、日一日と日が長くなってきました。
寒い冬も、もうあと少し、春がすぐそばまでやってきているようです。

他のロボットの長所を研究して、ID-01の改良に結び付けたいという思いからレポートしました。おかげでかなりの改善、改良点が見えてきました。

併行して、二足歩行ロボットのサーボモーターの改造に係る研究を始めました。
暑い時期が来るまでに走行部分の改造を行い、電流消費の改善、直進性の確保など、そして、他の可動部分のレスポンス向上などに役立てたい・・・と思っています。

今年もいろいろやる事が出てきたようで(しかもメカニカルな部分で)、かなり面白くなりそうな予感がします。
あらためまして、本年もよろしくお願いします。

| | コメント (16)

« 2007年12月 | トップページ | 2008年3月 »