とある件で、友人に私の紹介文を書いてもらうことがありました。書いてもらったのがこれです。
『人生=ロボット』になっちゃった人。
機械関係の教育を受けていないため、体当たりで技術を習得した。
母校の職員となって学生にロボットのなんたるかを教育している。
紹介文を書いてくれた友人に感謝しつつも、なにかが引っかかります。
というわけで皆さんこんにちは、大阪工業大学ものづくりセンターの近藤です。Beauto Chaserレポートの第4回目となります。今回はBeauto Builder NEOを使い「光を追いかけるプログラム」の応用や、ライントレース、自動落下回避のプログラムなど、さまざまなプログラム作成に挑戦していきたいと思います。
● 光を追いかけるプログラムの改良(ボタン停止機能付)
前回作成した光を追いかけるプログラムを改良し、さまざまな機能を追加してみました。前回作成したプログラムでは実行した後、停止するための処理を作っていないために、電源スイッチをOFFにしないと停止できないという問題があります。
このままでは不便なため、CPUボードのボタンを押すことによりプログラムを終了させる機能を追加しました。といっても条件分岐を1つ付け加えただけの簡単な処理です。これにより光を追いかける処理を実行し続け、ボタンを押したときに停止できるようにしました。【図1】がそのフローチャートです。
|
|
【図1】光を追いかけるプログラムにボタン停止機能付けた場合のフローチャート
|
【画面1】Beauto Builder NEOでボタン停止機能を付加した状態
|
Beauto Builder NEOで書くと【図1】となりました。センサ1の値が2000以下のとき前進、値が2001以上のときに左旋回を行ないます。2つ目の分岐でボタンが押されているかを判別し、押されているならEND(プログラム終了)、押されていないなら1つ目の条件分岐ブロックに戻るようにしました。ボタンが押されていないときは0、押されたときは1という値がCPUボードに送られます。また、この値の変化はBeauto ChaserとパソコンをUSBケーブルでつなぎ、通信している状態のとき、ブロックセンサエリアで確認することができます。条件分岐ブロックの条件を「1」「と同じ?」を選ぶことでボタンが押されたときにYESの矢印につながるブロック停止(1.5秒)を実行することができます。停止する時間の設定は、好きな時間でよいでしょう。どうせ次の処理がEND(プログラムの終了)となっていますので特に気にしなくても問題ありません。0.1秒停止してからプログラムが終了するか、3.0秒停止してからプログラムが終了するかだけの違いですね。
|
|
|
CPUボードのボタンが押されたとき、1という情報がCPUボードに送られます。ブロックセンサエリアでその状況を確認することができます
|
【画面2】また、最後の停止の動作は必ず必要です。この図のように停止ブロックを使わずにYESの矢印をENDにつなげるとプログラムは終了しますが、モーターの動作命令は直前のブロックを実行し続けてしまいます。直前の動作命令を消すためには停止ブロックが必要です
|
【動画】光を追いかける処理、ボタンを押して止まる処理もうまく実行することができました
|
● 音声や繰り返しを使う
続いてブザーを鳴らす機能を使って、Beauto Chaserがどのような処理をしているかを理解しやすくするため、「光を追いかけるプログラム(ボタン停止機能付)」を改良してみたいと思います。先ほどのフローチャートにブザーを鳴らす処理を追加しました【図2】。まずセンサで光を発見したかどうかを確認する条件分岐の処理を行なう前に、プログラムが無事に開始したことを表す音(シ#とファを交互に6回)を鳴らしました。このような処理を最初に入れることで、プログラムが正常に書き込めているか、プログラムが正しい順番で起動しているか、プログラムが暴走していないかを確認することができます。ロボット競技会などでは「あわててプログラムを書き込み試合に臨んだが書き込むべきプログラムが間違っていた」、ロボカップなどでも「間違えてキーパーにシューターのプログラムを入れてしまった!」なんてこともよく聞く話なので、ブザーの音階によって、どのプログラムを入れたかを判別できるようにするとよいかもしれません。
また、「旋回し光を探す」「前進し光を追いかける」処理の部分にもブザーを鳴らす処理を追加しました。今回作成したプログラムでは前進、左旋回の2通りの動きしかなく、あまり意味がありませんが、どのような行動を取っているかを音で示すことにより、例えばロボカップジュニアの試合などの複雑な行動を行なう際、プログラムのどの部分を実行しているかをわかりやすくすることができます。Beauto Chaserで参加することができるロボカップジュニアやBeautoロボコンなどのロボット競技会に出場したいと思っている方は是非試してみて下さい。
|
|
【図2】プログラムの流れをわかりやすく解説するため、フローチャートのループをあえて正しくない方法で記載しています。ループで挟まれたブロックの処理を6回繰り返すと次の処理を実行すると考えて下さい
|
【画面3】ブザーを鳴らす処理を追加したところ
|
Beauto Builder NEOでプログラムを作成すると【画面3】のようになりました。先ほど作った「光を追いかけるプログラム(ボタン停止機能付)」の部分はそのまま流用しました。最初のブザー(シ#、ファ)を交互に6回ピロピロと鳴らす処理は「繰り返しのブロック」でコンパクトにまとめました。ブザーブロックを12個も書くと大変ですからね。このときセンサ・ブロックエリアの「時間まで待つ」チェックボックスにチェックを入れて下さい。ブザーが鳴り終える時間まで次のアクションを停止させることができます。
前進ブロックの後には「ド」、左旋回ブロックの後に「シ」を加えることにより前進、旋回時にそれぞれ別の音を出すことができるようになりました。このときセンサ・ブロックエリアの「時間まで待つ」チェックボックスにはチェックを入れないのがポイントです。チェックボックスにチェックを入れるとブザーを鳴らしている間はモーターを停止する設定となってしまいます。
しかし、さっそく実行してみると、なぜか想定とは違う動きとなってしまいました。ブザーが6回ピロピロと鳴り終わってから動き出す予定だったのですが、起動と同時にBeauto Chaserが左旋回をはじめてしまいました。このプログラムの左旋回ブロックをすべて右旋回ブロックにし、絶対に左旋回が起こりえないプログラムで実行を行なっても必ず最初に左旋回してしまいます。
いろいろ調査した結果、STARTブロックの直後に繰り返しブロックを入れると必ず、左旋回が再生されてしまうようです。バグかも……。
とりあえずスタートの直後に停止ブロックを入れてこの問題を回避しました。強制再生される左旋回を打ち消すだけなので時間の設定は何秒でもいいです。プログラム開始時の初期化は大事だということを改めて痛感しました(笑)。
|
|
|
【動画】左旋回ブロックを使っていなくても最初に必ず左旋回が実行されてしまう
|
【画面4】STARTの直後に停止ブロックを追加して問題を回避
|
【動画】正しくプログラムが実行されるようになりました
|
いや、もしかしてこれはプログラムの初期化の大切さを教えるために、あえてスタートブロックの前に必ず左旋回の動きが入る仕様になっている、という可能性はないでしょうか? Beauto Chaser開発担当の技術者の方、さすがです。
● 赤外線センサの取り付け
続いてBeauto用赤外線センサを2個床面に向けて配置し、「落下防止」「ライントレース」のプログラムを作ってみたいと思います。CPUボード(VS-WRC003)にはアナログ入力ポート(AN1~AN4)が4つ用意されています。このうちAN1(センサ1)AN2(センサ2)には市販されている「Beauto用 赤外線センサ」(945円)をそのまま取り付けることができるコネクタが搭載されていますので、今回はAN1、AN2に搭載します。赤外線センサを床面に向けて配置するための部品は「Beauto用バンパー・ブラケットセット」(735円)として市販されているので、これを使うのがよいでしょう。
|
|
赤外線センサを2個床面に向けて配置したBeauto Chaser
|
赤外線センサは感度をよくするために、まっすぐではなく斜めに取り付けてください
|
|
|
「Beauto用 バンパー・ブラケットセット」はBeauto Chaserの底面からタッピングビスのネジBで取り付けます
|
配線の様子。左前の赤外線センサはAN1(センサ1)、右前の赤外線センサはAN2(センサ2)に接続しました
|
● 落下回避プログラムの作成
床面の識別のための赤外線センサの準備も無事できたところで、さっそく「落下回避プログラム」を作ってみました。机の上を前進し続け、机から落ちそうになった場合に回避行動を取ります。なにやら複雑なフローチャートとなっていますが、最初のループ、最後のボタンが押されたかを判断する条件分岐は、先ほど作った「音声や繰り返しを使う」「ボタン停止機能をつける」のプログラムと同じです【図3】。
センサ1、センサ2の条件分岐により赤外線センサで床面があるかどうかを判断し、床面を見失った(Beauto Chaserが落ちそうになった)場合に3秒間の後退のあと、1.5秒の左旋回を行なうことにより机からの落下を回避します。ついでにブザーで「シ」を鳴らすことにより赤外線センサが反応したことを音で確認しています。
|
|
【図3】落下回避プログラムを追加したフローチャート
|
【画面5】Beauto Builder NEOで作成したプログラム
|
Beauto Builder NEOでプログラムを作成すると【画面5】のようになりました。ボタン停止処理、最初のブザー(シ#、ファ)を交互に6回鳴らす処理の部分は「音声や繰り返しを使う」「ボタン停止機能をつける」のプログラムより流用しました。実質はセンサ1(左の赤外線センサ)センサ2(右の赤外線センサ)の条件分岐ブロックの処理を追加しただけですね。
センサ1、センサ2の値により条件分岐を行なう処理では、床面が赤外線センサの下にあるかないかを判断しています。前述のとおり床面を見失った(Beauto Chaserが落ちそうになった)場合はブザー「シ」を出力し3秒間の後退のあと、1.5秒の左旋回を行ない落下を回避し、床面を見失っていない場合は前進の動作を継続するようにしました。
床面を見失った際に鳴らすブザーブロックの設定「時間まで待つ」にチェックを入れると、ブザーを鳴らしている間は赤外線センサの情報を読み取らず、前進し続けることになり、落下の危険性が高くなるため、チェックをはずしてブザーを鳴らす処理の後、すぐに後退の動作が再生されるようにしましょう。
条件分岐のセンサ1、センサ2の閾値は実際に床面が赤外線センサの下にあるときと、ないときの閾値の値を確認して割り出しました。センサ・ボタンの値はセンサ・ブロックエリアで確認することができます。床面が赤外線センサの下にあるときの値は80~200ないときの値は4000~4100でした。閾値は単純に2つの条件時の値の真ん中あたりの数字、2000としました。
|
|
|
【動画】うまく落ちそうになっているのを検知し、落下回避動作を行なっています
|
床面が赤外線センサの下にあるときのセンサエリアのセンサ1、センサ2の値は80~200
|
床面が赤外線センサの下にないときのセンサエリアのセンサ1、センサ2の値は4000~4100
|
● ライントレースプログラムの作成
最後はライントレースプログラムの作成です。今回は黒いフィールドに描かれた白い線に沿ってBeauto Chaserを動かすプログラムとなります。最初のループ、最後のボタンが押されたかを判断する条件分岐は、先ほど作った「音声や繰り返しを使う」「ボタン停止機能をつける」のプログラムと同じですので、説明は割愛させていただきます【図4】。
センサ1、センサ2の条件分岐により赤外線センサで床面の色が白色か黒色かを判断し、両方のセンサが黒色を感知した場合は前進を行ない、どちらかのセンサが床面を白色と判断した場合は方向修正を行ないます。ついでにブザーを鳴らすことにより、センサが白色を感知したことを確認しています。
|
|
【図4】ライントレースプログラムのフローチャート
|
【画面6】Beauto Builder NEOで再現したライントレースのプログラム
|
Beauto Builder NEOでプログラムを作成すると【画面6】のようになりました。「落下回避プログラムの作成」のセンサ1(左の赤外線センサ)センサ2(右の赤外線センサ)の条件分岐ブロックの処理を少々変更しただけですね。
センサ1、センサ2の値により条件分岐を行なう処理では、床面の色を判別させています。今回は黒いフィールドに描かれた白い線をトレースするので両方の赤外線センサが床面を黒と判断した場合は前進、どちらかの赤外線センサが床面を白と判断した場合は左右にカーブすることで方向を調整します。
また、白い線を感知したことがわかるように左右の赤外線センサが反応した際にそれぞれブザー「ド」「シ」を鳴らすようにしました。ブザーブロックの設定「時間まで待つ」にチェックを入れるとブザーを鳴らしている間は前進し続けることになり、白い線から外れる危険性が高くなるため、チェックをはずすことにより、ブザーを鳴らす処理の後すぐにカーブの動作が再生されるようにしました
条件分岐のセンサ1、センサ2の閾値は実際に床面が白、黒を感知したときの値を確認して割り出しました。床面が白のときの値は80~200、黒のときの値は2500~3500でした。閾値は単純に2つの条件時の値の真ん中あたりの数字、1000としました。
|
【動画】うまくラインをトレースできました。音が出るとちゃんと制御できているなぁという自己満足が得られるのも重要なポイントです
|
● より複雑なプログラミングをするには
さて、まだまだ紹介したいプログラムやアイデアがたくさんあるのですが、今回の記事も終わりに近づいてきました。最後に小ネタを1つ掲載したいと思います。
探索方向を途中で切り替える処理を作成しようと思い。【図6】のような右旋回で10秒間光の探索を行なった後、左旋回で10秒間光の探索を行ない、その処理を黄色のループブロックで繰り返すフローチャートを思いつきました。さっそくBeauto Builder NEOに適用すると……あれれ??
|
|
【図6】黄色のループブロックをBeauto Builder NEOで実現しようとすると……
|
このようにエラーメッセージが出てしまいます
|
がっかり。このフローチャートをBeauto Builder NEOで再現するために、くりかえしボックスを2セットプログラムエリアに配置してみると「くりかえしはプログラムに1回しかつかえません」という警告が出てきました。これではBeauto Builder NEOで「探索方向を途中で切り替えながら光を追いかける」プログラムが作成できません。
そこで! 出てくるのがC言語でのマイコンプログラミングです。より複雑なプログラムを作りたい場合にC言語でのプログラミングを行なうわけです!
というわけでこのプログラムの作成は第7、8回担当のimokenpi君におしつけ……いやいや任せることにしたいと思います。
今回はここまで。第5回からは大阪工業大学電子工学研究部imokenpiが記事を担当します。次回もお付き合いのほど、よろしくお願いいたします。
■URL
バックナンバー
http://robot.watch.impress.co.jp/cda/vstone_backnumber/
■ 関連記事
・ ヴイストン「Beauto Chaser」で学ぶプログラミング入門講座 【第3回】Beauto Builder NEOの使い方(2009/03/27)
2009/04/02 15:57
- ページの先頭へ-
|