ch_myu2

マニュアル2に戻る。

MYUロボを動かそう

ロボットの準備

ロボットなど外部機器制御を行うための環境設定と使う教材を解説する。

ドリトルとの接続

ロボットを制御するためには、ローカル版のドリトルが必要である。ドリトルが動いているコンピュータとロボットは、シリアルケーブルで接続する。コンピュータにシリアルポートが存在しない場合には、市販のUSBシリアル変換ケーブルを利用する。*1ドリトルから通信するポートは、システムオブジェクトのシリアルポート選択で実行時に選択できる。*2

ロボット

本書ではMYUロボというロボットでのプログラミングを解説する。

本書で扱うロボットは、スタジオミュウで開発・販売されている製品である。この製品は、CPUにPICを採用している。このCPUにはメモリやI/O(外部インターフェース)の機能が搭載されており、ドリトルから転送したプログラムを解釈して、自律的に動作することが可能である。転送できるプログラムの上限は127バイト(688タイプは255バイト)である。

画像

本書では、車型のロボットである「ミュウロボ基本セット」の利用を想定している。

画像

写真で左側の先頭には衝突検出用のスイッチ(触覚センサー)があり、壁などの障害物を検出できる。2個の前輪にはそれぞれモーターが取り付けられており、左右を独立して回転することができる。この方式は、2個のモーターを制御することから2軸制御と呼ばれる。両方を同時に回転させると直進する。左右に曲がるときは、片方の車輪だけを回転させる。写真の中央にはモーターと基板の動作に使われる電池ボックスがある。写真の右側には電気部品が取り付けられた基板があり、ロボットの頭脳として、モーターの制御やスイッチの監視などを行っている。

「3軸ミュウロボ基本セット」を利用することで、モーターを3個使った3軸制御も可能である。2軸では2個のモーターを使って移動する動作が基本になるが、3軸ではもう1個のモーターを使って、物を運ぶといった作業を行うことができる。

画像

対話的な操作による動作確認

プログラムを転送して自律的に動作させる前に、ロボットに線をつないだ状態で対話的に動作を確認することが可能である。次のプログラムでは、ボタンを押すたびにロボ太に命令を送り、リモコンの動作を行っている。

画像

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
ロボ太!ひらけごま。
前進ボタン=ボタン!"前進" 作る -220 150 位置。
前進ボタン:動作=「ロボ太!前進」。
後進ボタン=ボタン!"後進" 作る 0 150 位置。
後進ボタン:動作=「ロボ太!後退」。
左前ボタン=ボタン!"左回り" 作る -220 100 位置。
左前ボタン:動作=「ロボ太!左回り」。
右前ボタン=ボタン!"右回り" 作る 0 100 位置。
右前ボタン:動作=「ロボ太!右回り」。
停止ボタン=ボタン!"停止" 作る -110 40 位置。
停止ボタン:動作=「ロボ太!停止」。
音1ボタン=ボタン!"音1" 作る -220 -20 位置。
音1ボタン:動作=「ロボ太!15 電子音」。
音2ボタン=ボタン!"音2" 作る -220 -70 位置。
音2ボタン:動作=「ロボ太!16 電子音」。
ロボ太!とじろごま。

ロボットを動かそう

プログラムの記述

MYUロボットの制御プログラムの基本形を示す。先頭の行では、MYUロボットを使うプログラムを作成することを示している。2行目では、ドリトル上でロボットを扱うためのロボ太という名前のMYUオブジェクトを作っている。3行目からは、ロボットに転送するプログラムをメソッドとして定義している。ロボットに転送するプログラムは、はじめロボットおわりロボットの間に記述する。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。

 //ここに制御プログラムを書く

ロボ太!おわりロボット」。

実際のプログラムを示す。ロボット制御のプログラムでは、「前進」や「右回り」の単位は0.1秒である。次のプログラムは、ロボットが1秒間前進し、0.5秒間右に回転する動作を表している。表に使用できる命令の例を示す。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 ロボ太!10 前進 5 右回り。
ロボ太!おわりロボット」。

ロボットの命令(一部)

命令用途使用例
はじめロボット制御プログラムの先頭を示すロボ太!はじめロボット。
おわりロボット制御プログラムの末尾を示すロボ太!おわりロボット。
前進両輪の前転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 前進。
後退両輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 後退。
右回り左車輪の前転、右車輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 右回り。
左回り右車輪の前転、左車輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 右回り。
停止すべてのモータを停止させた後、パラメータの値×0.1秒間だけ待つロボ太!10 停止。
繰り返し脱出繰り返しブロックの中に書き、繰り返しを中断して次に進むロボ太!繰り返し脱出。
繰り返す指定した回数だけブロックを実行する「ロボ太!5 ブザー 2 時間」!3 繰り返す。
入力あり指定した番号の入力がONならブロックを実行する「ロボ太!2 入力あり」!なら「ロボ太!10 後退」実行。

プログラムの実行

プログラムを作成したら、ロボットに転送して実行する。

ドリトルを実行しているコンピュータとロボットは、あらかじめ転送ケーブルで接続しておく。

ドリトルの「実行!」ボタンを押すと、実行画面に「画面実行」ボタンと「転送」ボタンが表示される。

画像
 

画像

「画面実行」ボタンを押すと、画面上のミュウロボがプログラムを実行する。エラーが表示された場合は、プログラムを修正してから再度実行する。

「転送」ボタンを押すと、ロボットへの転送が行われる。「ピ・・」という音が鳴り、最後に「ピピ」という音が鳴れば、正常に転送が終了したことが分かる。正常に転送されたら、転送ケーブルをロボットから抜く。

ロボットに転送されたプログラムの実行を開始する方法は2種類ある。ひとつは、先頭のタッチスイッチを押す方法である。今回のテキストでは、この方法で説明している。もうひとつの方法としては、「!はじめロボット」に続けてパワーオンスタートを書いておくと、電源を入れたときにプログラムが実行される。これらの方法は、好みや状況に応じて使い分けることができる。

転送されたプログラムは電源を切った後もロボットに記憶されている。電源を入れ、タッチスイッチを押すことで再度実行することが可能である。

モーターの性質

このロボットでは、「前進」などのモーターの動作に関する命令が実行されると、次にモーターに関する命令が実行されるまで動作を継続する性質がある。そのため、確実に1秒間だけモーターを動作させたい場合には、「10 前進」 と書くだけでなく、「10 前進 停止」のように、明示的に動作の停止を記述する必要がある。

ロボットがこのような性質を持つことで、モーターの動作と並行して「スイッチの入力を監視する」「音を鳴らす」といった処理を行うことが可能になる。

繰り返し

繰り返しを使うと、命令を繰り返して実行できる。次のプログラムは、「前進して右回り」を10回繰り返す。結果としてロボットは多角形を描くように移動する。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 「ロボ太!10 前進 5 右回り」!10 繰り返す。
ロボ太!おわりロボット」。

画像

繰り返しの回数を省略した場合は、無限回という意味になり、無限ループとして、いつまでも繰り返して命令を実行し続ける。無限ループを使う場合には、ある条件が成り立ったときに繰り返しから抜けるために繰り返し脱出と組み合わせて使うことが多い。

次のプログラムを実行すると、ロボットは多角形を描くように移動するが、タッチスイッチで障害物を検出するとループを抜ける。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 「ロボ太!10 前進。
  「ロボ太!2 入力あり」!なら「ロボ太!繰り返し脱出」実行。
  ロボ太!5 右回り。
 」!繰り返す。
 ロボ太!10 後退 停止。
ロボ太!おわりロボット」。

迷路を抜けよう

想定するコース

この章では、迷路を抜けるプログラムを考える。想定するコースを図に示す。大きさは180cm×90cm(たたみ一畳分)程度を想定している。

画像

移動距離で迷路を抜ける

最初に、壁にぶつからないように、進む距離を調整してゴールに至るプログラムを作成する。すると、図のように「壁の直前まで前進する、右を向く、次の壁の直前まで前進する、左を向く、...」という形のプログラムが考えられる。

画像

ロボットを制御するプログラムは画面のオブジェクトを操作するタートルグラフィックスと似ているが、前進や回転を距離や角度で指定するのではなく、モータを回転する時間で指定する点が異なっている。実際にどれくらいの距離を移動し、どれくらいの角度を回転するのかは、実行して確認する必要がある。

ゴールに到達できるように何度も試行錯誤を行っていると、最初に調整した動きとずれてくることがある。プログラムで指定するのはモータを回す時間だけであるため、摩擦や電池の消耗などの原因により、実行を繰り返すうちに、同じプログラムでも動作が微妙に異なる場合がある。つまりこの方法では、ある状態のときにうまくゴールに到達できたとしても、次に実行したときにゴールに到達できる保証はない。

スイッチ入力の検出

今回使用しているロボットの先頭には衝突検出用の触覚スイッチが取り付けられており、右が2番、左が3番の入力に接続されている。このスイッチを利用すると、前進して壁に衝突したことを検知できるので、電池の消耗や個体差に影響されない確実な動作を実現できる。

ここでは、「前進し、障害物を感知したら後退して向きを変える」という動作を繰り返すプログラムを説明する。

次のプログラムで、

「ロボ太!2 入力なし」!の間「ロボ太!前進」実行。

により1番のスイッチが押されていない間
その結果、スイッチが押されるまで 「前進」 が繰り返し実行され、スイッチが押されたときに

ロボ太!10 後退 10 右回り。

が実行されることになる。表に命令の例を示す。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 ロボ太!10 前進。
 「
  「ロボ太!3 入力なし」!の間「ロボ太!前進」実行。
  ロボ太!10 後退 10 右回り。
 」!繰り返す。
ロボ太!おわりロボット」。

ロボットの命令(一部)

命令用途使用例
停止すべてのモータを停止させた後、パラメータの値(×0.1秒間)だけ待つロボ太!10 停止。
リミットスイッチ1番センサに入力があるまで直前の動作を続けるロボ太!リミットスイッチ。
電子音第1パラメータの時間だけ、第2パラメータの音程でブザーを鳴らす。音程は数字が大きいほど低いロボ太!10 40 ブザー。
繰り返す指定した回数だけブロックを実行する「ロボ太!5 ブザー 2 時間」!3 繰り返す。
繰り返し脱出繰り返しブロックの中に書き、繰り返しを中断して次に進むロボ太!繰り返し脱出。
入力あり...実行指定した番号の入力がONならブロックを実行する「ロボ太!2 入力あり」!なら「ロボ太!10 後退」実行。
の間...実行指定した条件が成り立つ間、ブロックを繰り返して実行する「ロボ太!2 入力あり」!の間「ロボ太!後退」実行。
実行脱出「の間...実行」ブロックの中に書き、繰り返しを中断して次に進むロボ太!実行脱出。

* 参考1: 入力があるときだけ実行する方法

動きながらスイッチの入力を検出するプログラムは、複数の方法で書くことができる。ここでは繰り返しの中で、入力があったときだけ特定の動作を行う方法を示す。書き方は異なるが、前の例と動作は同じである。

ロボ太!10 後退 10 右回り。

が実行されることになる。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 ロボ太!10 前進。
 「ロボ太!前進。
  「ロボ太!3 入力あり」!なら「ロボ太!10 後退 10 右回り」実行。
 」!繰り返す。
ロボ太!おわりロボット」。

* 参考2: 入力があるまでプログラムの実行を止める方法

ここでは繰り返しの中で、入力がない間、特定の動作を行う方法を示す。書き方は異なるが、前の例と動作は同じである。

次のプログラムで、リミットスイッチは1番入力に接続されたセンサ(スイッチ)が押されるまでプログラムの進行を止める。その結果、ロボットは直前の 「前進」 の実行を維持することになり、前進を続ける。スイッチが押されたときには、プログラムの進行が再開されるため、その後の

ロボ太!10 後退 10 右回り。

が実行されることになる。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 ロボ太!10 前進。
 「ロボ太!前進。
  ロボ太!リミットスイッチ。
  ロボ太!10 後退 10 右回り。
 」!繰り返す。
ロボ太!おわりロボット」。

画像

ユーザー定義命令

ユーザー定義命令は独自の命令を定義する。

ロボットオブジェクト:命令=「...」。

次のプログラムでは、音楽の演奏と、障害物を感知したときの動作を「演奏」 と 「Uターン」 という命令として定義している。実行する命令は

「ロボ太!2 入力あり」!なら「ロボ太!演奏 Uターン」実行。

と記述できるため、「2番の入力があった場合はメロディを演奏してUターンする」のように、プログラムを素直に読み下せるようになり、プログラムの読みやすさを向上させることができる。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
ミュウロボ:演奏=「ロボ太!
 2 48 電子音 2 46 電子音 2 44 電子音 2 42 電子音
 2 40 電子音 2 38 電子音 2 36 電子音 2 34 電子音
」。
ミュウロボ:Uターン=「ロボ太!10 後退 10 右回り」。
実行命令=「ロボ太!はじめロボット。
 ロボ太!演奏。
 「ロボ太!前進。
  「ロボ太!2 入力あり」!なら「ロボ太!停止 演奏 Uターン」実行。
 」!繰り返す。
ロボ太!おわりロボット」。

ものを運ぼう

想定するコート

このActivityでは、ロボットにアームとモータを追加することで、物を運んだり仕事をさせるプログラムを考える*3。想定するコートを図に示す。大きさは180cm×90cm(たたみ一畳分)のコンパネ(建築工事用の合板)を想定している。コートの中央に2×4材を置き、その上に荷物としてスチロールなどの緩衝材をばらまいておく。

画像

ロボットの拡張

ロボットには3個目のモータと、荷物を運ぶためのバケットとそれを支えるアームを取り付ける。アームの回転を検知するために、本体の上部にタッチスイッチを2個取り付け、衝突検知用のタッチスイッチも前後に取り付けて配線する。ロボットの構造を図に示す。ここでは、前の衝突検知用スイッチを1番、前の角度検知用スイッチを2番、後ろの角度検知用スイッチを3番、後ろの衝突検知用スイッチを4番にした。

画像

画像

ものを運ぶプログラム

中央の資材置場からゴールまで荷物を運ぶプログラムの流れは次のようになる。

  1. ぶつかるまで前進: 資材置場に向かって進み、前のタッチスイッチが押されたら止まる。
  2. アームを持ち上げる: アームを少し持ち上げて、バケットの中に資材を入れる。
  3. ぶつかるまで後退: ゴールに向かって後退し、後ろのタッチスイッチが押されたら止まる。
  4. 荷物を後ろに落とす: アームを後ろに回し、後ろにある角度検知用のタッチスイッチが押されたら止まる。
  5. アームを戻す: アームを前に回し、前にある角度検知用のタッチスイッチが押されたら止まる。

この流れをプログラムで書くと次のようになる。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
実行命令=「ロボ太!はじめロボット。
 ロボ太!パワーオンスタート。
 「ロボ太!1 入力なし」!の間「ロボ太!前進」実行。
 ロボ太!5 モーター左。
 「ロボ太!4 入力なし」!の間「ロボ太!後退」実行。
 「ロボ太!3 入力なし」!の間「ロボ太!モーター左」実行。
 「ロボ太!2 入力なし」!の間「ロボ太!モーター右」実行。
ロボ太!おわりロボット」。

命令の定義

プログラムが複雑になってくると、どの行でどのような処理をしているのかが、分かりづらくなってくる。このようなときはユーザー定義命令を使い、プログラムの処理に名前を付けることで理解しやすいプログラムにできる。

この流れをプログラムで書くと次のようになる。それぞれの処理に「ぶつかるまで前進」のような名前を付けてユーザー定義命令にしている。プログラムの最初でこのような定義を行っておくことで、プログラムの中で個々の処理を具体的なイメージを持ちながら読むことが可能になる。

システム!"myurobo" 使う。
ロボ太=ミュウロボ!作る。
ミュウロボ:ぶつかるまで前進=「「ロボ太!1 入力なし」!の間「ロボ太!前進」実行」。
ミュウロボ:アームを持ち上げる=「ロボ太!5 モーター左」。
ミュウロボ:ぶつかるまで後退=「「ロボ太!4 入力なし」!の間「ロボ太!後退」実行」。
ミュウロボ:荷物を後ろに落とす=「「ロボ太!3 入力なし」!の間「ロボ太!モーター左」実行」。
ミュウロボ:アームを戻す=「「ロボ太!2 入力なし」!の間「ロボ太!モーター右」実行」。
実行命令=「ロボ太!はじめロボット。
 ロボ太!パワーオンスタート。
 ロボ太!ぶつかるまで前進。
 ロボ太!アームを持ち上げる。
 ロボ太!ぶつかるまで後退。
 ロボ太!荷物を後ろに落とす。
 ロボ太!アームを戻す。
ロボ太!おわりロボット」。

ロボットの命令

命令用途使用例
はじめロボット制御プログラムの先頭を示すロボ太!はじめロボット。
おわりロボット制御プログラムの末尾を示すロボ太!おわりロボット。
パワーオンスタート電源オンで実行を開始するロボ太!パワーオンスタート。
前進両輪の前転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 前進。
後退両輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 後退。
右回り左車輪の前転、右車輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 右回り。
左回り右車輪の前転、左車輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 右回り。
停止すべてのモータを停止させた後、パラメータの値×0.1秒間だけ待つロボ太!10 停止。
右前右車輪の前転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 右前。
左前左車輪の前転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 左前。
右後右車輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 右後。
左後左車輪の後転を開始し、パラメータの値×0.1秒間だけ待つロボ太!10 左後。
モーター右第3モーターを右回転し、パラメータの値×0.1秒間だけ待つロボ太!10 モーター右。
モーター左第3モーターを左回転し、パラメータの値×0.1秒間だけ待つロボ太!10 モーター左。
繰り返す指定した回数だけブロックを実行する「ロボ太!5 ブザー 2 時間」!3 繰り返す。
繰り返し脱出繰り返しブロックの中に書き、繰り返しを中断して次に進むロボ太!繰り返し脱出。
入力あり指定した番号の入力がONならブロックを実行する「ロボ太!2 入力あり」!なら「ロボ太!10 後退」実行。
入力なし指定した番号の入力がOFFならブロックを実行する「ロボ太!2 入力なし」!なら「ロボ太!10 後退」実行。
リミットスイッチ1番センサに入力があるまで直前の動作を続けるロボ太!リミットスイッチ。
の間...実行指定した条件が成り立つ間、ブロックを繰り返して実行する「ロボ太!2 入力あり」!の間「ロボ太!後退」実行。
実行脱出「の間...実行」ブロックの中に書き、繰り返しを中断して次に進むロボ太!実行脱出。

ロボットの命令(続き)

命令用途使用例
ブザーパラメータの回数だけブザーを鳴らすロボ太!10 ブザー。
電子音第1パラメータの時間だけ、第2パラメータの音程でブザーを鳴らす。音程は数字が大きいほど低いロボ太!10 40 ブザー。

*1 本書では、Windowsは秋月電子通商の「USB・シリアル変換ケーブル」で、Macではバッファローコクヨサプライの「Arvel USBシリアルケーブル SRC06USB」にチップメーカーのサイト(http://www.ftdichip.com/Drivers/VCP.htm)からドライバをインストールして動作を確認しています。
*2 あらかじめ調べる場合は、Windowsであればデバイスマネージャの「ポート(COM と LPT)」のCOMの部分を調べることができる。Macでは設定が必要な場合がある。「はじめに」(p.mac_install )を参照。
*3 このActivityには、「3軸ミュウロボ基本セット」(sec_myurobo )が必要です。

Theme designed by Dining tables
Coder Mothers Day | EZwpthemes |modified by QHM Temps

powered by Quick Homepage Maker 5.0
based on PukiWiki 1.4.7 License is GPL. QHM

最新の更新 RSS  Valid XHTML 1.0 Transitional