第三回教室


昨年度取り付けた赤外線距離センサは、ロボットの先頭部に固定で取り付けていたのでロボットの正面の障害物は検出できましたが、左右の
障害を発見することが出来ませんでした。
今回は、赤外線距離センサを前方に向けた固定方式から首振りの回転方式に改造します。
回転といっても360度回転させるのではなく、前方180度を監視させることで十分機能をはたすのでロボットの真正面を中心に±90度回転する
機構を考えます。
これを実現させる電子部品としてサーボモーターがあります。サーボモーターは指定した角度で停止する機能があるので思った所に距離センサ
を向けることができます。

プログラムの制作に入る前に準備が必要です。間違わないように下記の順番通り進めてください。

【 Setup 】
「オプション」の中を開きます。その中の「Setupボタンを表示」を選択します。


下記のセットアップ画面が開きます


左下にある「Advanced Mode」にチェックを入れてください。(マウスをチェックボックス上でクリックします)
すると、なにやら意味不明のものが多く表示されますが今回はこれは無視します。
今回サーボモーターを動かす事とは直接関係ないのですが、後でお話しするサブプログラムを作ってもらうときに必要となります。


サーボモーターは「CN7」に接続するので、下記セットアップ画面上の「CN7-Input」をクリックするとサブメニューが表示されるので、
その中の「Servo」を選択します。


選択が終わると今まで「Input」だったものが「Servo」に変わります。確認後「OK」でセットアップを終了させます。


CStyle画面に戻るとコマンドメニュー内に「Servo」が追加されています。(赤枠部分)
そのほかに右側に4つのブロックも追加されます、これは「Advanced Mode」にチェックを入れた為です。
この4つの命令の中で「SubProg」を使っていきます。


これでサーボモーターを使うための準備が完了です。

【 動作確認 】
設定が完了しているので、プログラムを作る前に動作を確認してみましょう。
ここでセンサモニターを使って動作確認に入りたいところですが待ってください。
セットアップで「CN7」はサーボモーターを接続しますよと設定はしましたが、これはパソコンの CStyle で設定しただけでロボットは全く
どうなっているのか知りません。
ロボットに知ってもらうためには、サーボを使ったプログラムを一度ロボットにダウンロードさせる必要があります。
そうすることでプログラム以外にセットアップ情報もロボットに転送され、今まで設定した内容がロボットに伝わることになります。
なんでもいいのでサーボモーターを使ったプログラムをダウンロードします。
でもまだサーボモーターを使ったプログラムは勉強していないので下記のプログラムを参考にロボットにダウンロードしてみましょう。


この作り方は解りますね。出来たら保存して、ビルドしてダウンロードしてください。
この時、セットアップで「CN7」がサーボモーターで使いますようという情報もロボットに書込まれます。


ダウンロードが終了後、再度センサモニタを開きロボットの電源スイッチを入れ「モニタ開始」ボタンを押してください。
各センサの値が表示されていますが、「CN7」を見てください。
「CN7 Servo」と表示され数字の上に左右に動かせる「スライダーバー」が表示されているいます。
マウスで左右に動かしてください。サーボモーターが右回転、左回転すると思いますが、どうですか。
動かない人は、初めからやり直してください。それでもだめなら「お問い合わせ」から状況を詳しく書いて質問してください。


【 サーボモーターを使ったプログラム作り 】
プログラムの上級コースでは、プログラムを目的別に分けて作っていきます。そのことでエラーが見つけやすくすっきりしたプログラムになり
ますので、皆さんもこれからのプログラム作りでは、この作り方で普通に使っていきましょう。
まずはお決まりの「While」文で無限ループを作ります。
この中にサブプログラムを挿入します。このサブプログラムは、サーボモーターを制御するプログラムが入ります。


挿入すると下記の様になります。
編集できる状態(チェックが入っている)になっているので、「OK」を押してください。


Sub-1[New] という画面が現れます。(赤枠部分)ここにプログラムを挿入していきます。


Sub-1[New]画面内に「Servo」アイコンを挿入してください。(下図のようになります。)


最初の数値は「0」となっています。この時IR距離センサは真正面に向いている事(向いていない人は調整して真正面に向けてください。)
この調整は、センサモニタでスライダーバーを出して調整します(動作確認部を見てください)、プログラム作成中はできません。
ここの数値は、自由に調整してください。ここでは「90」にしました。

 「0」     IRセンサが正面を向いている。
 「プラス方向」 IRセンサは左に向いていき。100で左に90度向きます。
 「マイナス方向」IRセンサは右に向いていきます。-100で右に90度向きます。


ここで重要なのは、サーボ命令を連続して書いてしまうと正しく動かない場合が生じます。
それは、サーボモーターは機械的に動いているので思った角度に瞬間移動できません。したがって角度に応じた時間を待つ必要があります。
小さな角度であれば、少ない時間で移動し、大きな角度であれば指定の角度まで回転するのに時間がかかるのでその間、次の命令が来ない様に
砂時計を入れる必要があります。角度により小さくはできますが、1秒を入れておけば大丈夫です。
下記のプログラムは最大角度に左右振っているので 1 秒 を入れてみました。皆さんは色々工夫してください。



これでサーボモーターが左右に首を振るプログラムが出来たので保存しましょう。
保存ボタンを押すといつもの名前を付けて保存が出てきますが、この時の名前は(赤枠のファイル名)サブプログラムの名前です。
今回はサーボモーターを動かすプログラムなので、サーボにちなんだ名前にしましょう。英語で「Servo1」としました。


保存が終わるとメイン画面に戻り、サブプログラム画面が消え「While」文の中に「Sub-1:Servo1」が入りました。
このメインプログラムは、まだ保存が出来ていないので「Main-[ NewFile-05 ] のままで仮の名前のままです。


メイン画面に戻って再度保存ボタンを押してメインプログラムを保存しましょう。
この例では「Main」と名前を付けました。赤枠の部分が [ NewFile-** ] が、[ Main ] に変わりました。
これでメインプログラムが「Main」、サーボ制御おサブプログラムが「Servo1」という名前で保存できました。


一度、ビルドしダウンロードして実行してみましょう。
サーボモーターが、右、左に交互に1秒ごと回転するはずです。
うまく動かない人は、プログラムミスが無いかよく確認してみましょう。

試作ロボットが完成したら、動画を載せます。




【 応用問題 】
次は実際に近いサーボモーターの使い方です。
サーボモーターを右側90度に向けてから、10度づつ左側へ回転させてIR距離センサの値がロボット手前10cmに障害物を検出したら、何色
でも良いのでLEDを点灯し、10cm以内に障害物が無ければLEDは消灯させておくプログラムを作ってみましょう。

IR距離センサで障害物を検出するプログラムは以前に作っているので問題なく作成できるので、あたらしいプログラムと言えばサーボモーター
を10度ずつ回転させていくことだと思いますが、今勉強した方法では左90度から右へ10度ずつ回転させていくには10度ずつ角度を変えた命令
を順番に作っていくしか手が無いのですが、プログラム的にはせっかく繰り返しを実行させる「for」文があるのでこれを使ってプログラムを作
りたいところです。
方法があります。それをこれから説明していくので自分でも試してみましょう。
<ここはサーボモーター制御の説明なので、IR距離センサで距離判定する部分は省略しています。>

サーボモーターを制御するのに、今までは角度で動かしていました。(0度、-90度、90度、45度等です。)
今回は、直接数値を使って動かします。
角度に対する数値を見てみましょう。センサモニターを開いてください。そしてモニター開始してください。
この中で「CN7:Servo」の右側に表示されている数値「1500」これを使っていきます。


0度が1500でした。
スライダーを左に動かして、-100 にしてみましょう。数値は 500 に変わりました。


今度はスライダーを右いっぱいにうごかして黄色い数値を 100にしてみましょう。その時の数値は、2500です。


という事で角度に対する数値が解りました。

 真正面に向いた状態が(0度)、 1500
 右に向いた状態が、      2500
 左に向いた状態が、       500

今回は10度ずつ回転させるので、100ずつ数値を変化させていけばいいことが解りました。

この数値を使ってサーボモーターをするには下図のような使い方をします。
今まで角度を入れていた部分を「Var A」にします。<右横の下向き矢印を押すと色々なメニューが出ます。>
「 Var A 」を選択するだけで、ここでは数値は入力しません。


「OK」するとサーボ制御アイコン部分は、「 CN7-Servo: A 」に変化します。
あとは変数Aに先ほどの数値を入れれば変数Aの値でサーボモーターが回転します。

一例を下図に示します。


<プログラムの説明>

001:変数Aに500を入れます。(500は、右側90度へ回転を意味します。)
002:サーボモーターを変数Aの数値へ回転(右90度に回転させる命令)
003:サーボが移動する時間を確保
004:繰り返し文「for」で20回繰り返し(右90度から左90度まで10度ずつ回転するには同じことを20回繰り返すと実現します。)
005:変数Aに100を加えて結果を、再び変数Aに入れる。(500->600->700->800となっていく)
006:サーボモーターを変数Aに移動
007:移動時間を確保
008:20回繰り返し終了したら、メインプログラムに戻る。

このプログラムに、IR距離センサで障害物の有無を判断し、LEDの制御を加えて完成させてください。

出来た人は、自分のプログラムを前で発表してください。