第6回 シャクトリムシロボット つくりかた

スタディーノ基板とパソコンをmini USBケーブルでつなぎ、パソコンでブロックプログラミング環境を起動しよう。[編集]メニューの[入出力設定…]を、配線した通りに設定しよう。つまり、A4がLED、A5が赤外線フォトリフレクタ、D9がサーボモーターだね。設定ができたら、電池ボックスのスイッチをONにして、[編集]メニューの[モーター校正…]で、金具でつくった脚がかまぼこ板の体に対して垂直になるようにD9の角度を調整しよう。終わったら、電池ボックスのスイッチをOFFにしておこう。

第6回 シャクトリムシロボット つくりかた

赤外線リモコンのテストをしよう。[実行]メニューから[テストモード開始]を選んで、テストモードに切り替えよう。すると、[テスト・ボード]の[A5]に赤外線フォトリフレクタの値が表示されるはずだ。まず、赤外線フォトリフレクタの前に手をかざして数値が変化することを確認しよう。次に、テレビやエアコンなどの赤外線リモコンを赤外線フォトリフレクタに向けて、ボタンを押してみよう。このとき、テレビやエアコンに影響がないように、そっちにはリモコンを向けないよう注意しよう。リモコンの種類や押すボタンによっても違うけど、値が大きくなったはずだ。この値は、リモコンと赤外線フォトリフレクタの距離や角度によっても変化する。ボタンを押していないときと、ボタンを押したときの値をメモして、スイッチを動作させる値をその中間くらいに決めよう。ここでは、その値を10として説明するよ。

第6回 シャクトリムシロボット つくりかた

シャクトリムシの最終的な完成プログラムはこちらだ!今回は、これをつくっていくよ。その前に、まずは、リモコンでLEDをオンオフする簡単なプログラムをつくって、しくみを理解していきながら、今回のプログラムに発展させていこう。

第6回 シャクトリムシロボット つくりかた

これが、リモコンでLEDをオンオフするプログラムだ。まずは、メインプログラム。プログラムがスタートすると、まずは変数「flag」と変数「prevTime」の値を0にして、[タイマーをリセット]する。その後、[ずっと]の中の制御を、プログラムが終了するまで繰り返し実行するようになっているぞ。変数「flag」は、旗という意味で、LEDのスイッチの状態を表している。0は旗が倒れている状態でオフ、1は旗が立っている状態でオンを表す。最初は0を入れたので、スイッチはオフの状態からスタートする。
変数「prevTime」と[タイマーをリセット]の詳しい説明は後ですることにして、先に[ずっと]の中を見てみよう。

[ずっと]の中では、まず「switch」関数がコール(呼び出し)されている。この関数は、赤外線リモコンのボタンを押すたびに、変数「flag」の値を、0から1、1から0へと変えている。つまりスイッチのオン・オフを交互に切り替えているわけだ。このような動きを「トグル」と呼んでいる。

その次の[もしーならー、でなければー]では、変数「flag」の値に応じて、LEDを点けたり消したりしている。似たプログラムは前にもやったことがあるから大丈夫だよね。

第6回 シャクトリムシロボット つくりかた

続いて、「switch」関数の中身を見ていこう。このプログラムでいちばん重要なのは、「もしーなら」の中にある、変数「flag」の値を逆にする(トグルしている)しくみだ。ここでは1から「flag」の値を引き、その結果を「flag」に入れなおしている。つまり、「flag」の値が0なら「1 - 0」で1になるので「flag」の値を1に、「flag」の値が1なら「1 - 1」で0になるので「flag」の値を0にする、というわけなのだ。

第6回 シャクトリムシロボット つくりかた

この入れ替えをするかどうかは、その直前にある「もしー」の条件に当てはまるかどうかで決まる。条件は上の2つだ。そして「もしーなら」の中の条件が「ーかつー」となっているので、この2つの条件が両方とも「はい」にならないと(満たされないと)、「もしーなら」の中は実行されない。

上図の1は、赤外線フォトリフレクタの値が10より大きいか、つまり赤外線リモコンのボタンが押されているかどうかを調べている。押されていれば「はい」となり、条件は満たされる。

2は[タイマー]の値から変数「prevTime」の値を引き、その答えが1より大きいかどうかを調べている。[タイマー]はその言葉通り、時間を計るもので、[タイマーをリセット]してからの時間を計っている。これはメインプログラムの最初の方にあったね。そして変数「prevTime」の値も、メインプログラムの最初で0にしていた。

だから、最初に「switch」関数がコールされたときは、「プログラムがスタートしてからの秒数」-「0」が1以上になれば、条件は満たされて、「もし?なら」の中が実行される。

では2回目以降はどうだろう。「もしーなら」の中が実行されると、2行目で変数「prevTime」に「タイマー」の値が代入される。例えば[タイマーがリセット]されてから5秒後に「もしーなら」の中が実行されたとすると、変数「prevTime」の値は「5」となり、次に条件を満たすのは[タイマーがリセット]されてから6秒後以降になる。つまり、条件2は、前回「もしーなら」の中が実行されてから1秒以上経っているかどうかを見ているということなのだ。

第6回 シャクトリムシロボット つくりかた

変数「prevTime」と「タイマー」の値だけに注目すると、このような処理が行われている。プログラムがスタートすると、変数「prevTime」には「0」が入れられ、「タイマー」もリセットされて「0」になる。
1回目:1回目の条件判定が、プログラムスタートから5秒後に行われたとする。変数「prevTime」の値は「0」、「タイマー」の値は「5」なので、結果は「はい」となり、その後の処理が実行されて、変数「prevTime」に「タイマー」の値「5」が入る。
2回目:プログラムスタートから10秒後に2回目の条件判定が行われたとする。変数「prevTime」の値は「5」、「タイマー」の値は「10」なので、再び結果は「はい」となり、変数「prevTime」は「10」になる。
3回目:その直後の10.5秒後に3回目の判定が行われたとする。変数「prevTime」は「10」、「タイマー」は「10.5」なので、今回の結果は「いいえ」となる。だから、その後の処理は行われず、変数「prevTime」の値は「10」のままとなる。
こうして、前回の処理から1秒以上経たないと、次の処理が行われないようになっているんだ。

なんで、こんなややこしいことをしているかというと、リモコンのボタンを1回押しただけなのに、オンオフが何回も切り替わってしまうこと(チャタリングという)を防ぐためだ。このようなプログラムにすれば、前回ボタンを押してから1秒以内にボタンを押しても、オンオフの切り替えは行われない。

でも、それだけなら、「●秒待つ」でもいい気がするが、ひとつ問題があるんだ。「●秒待つ」で待っている間は、プログラムが先に進まないということだ。Scratchと違って、ブロックプログラミング環境では、プログラムを1つしか書けない(複数のプログラムを同時に動かせない)。したがって、ここで動きが止まっている間は、他の処理もすべて止まってしまう。だから、このような工夫が必要になるんだ。これが、マイコンプログラミングの難しいところ。ちょっと難しいので今は全部わからなくてもいいけど、心にとめておいてほしい。
さて、このプログラムを入力し終わったら、緑の旗をクリックして実行してみよう。リモコンを赤外線フォトリフレクタに向けて、ボタンを押すとLEDが点き、もう一度押すと消えるだろうか。

第6回 シャクトリムシロボット つくりかた

シャクトリムシロボットを動かそう。リモコンによるスイッチができたところで、次にロボットを曲げたり伸ばしたりする動きについて考えてみよう。そのための関数を「move」として定義したよ(今月のプログラムを参照)。この関数では、ロボットの脚の角度を170°から130°の間で交互に動かしている。170°が最も縮んだ状態で、130°が最も伸びた状態だ。この角度は、実際に実験してみて、ちょうど良い動きになるように調べたものだ。この曲げ伸ばしを制御しているのが、「もしーなら、でなければー」だ。ここでは、曲げ伸ばしを実行する条件として、[タイマー]の値を丸めた(四捨五入した)値を2で割った余りを使っている。余りが0なら脚を縮め、1なら伸ばしている。つまり、1秒おきに、曲げたり伸ばしたりを繰り返すようにしているんだ。ここでも、「?秒待つ」を使って関節が動く時間を確保しているのではないことに気を付けてほしい。

第6回 シャクトリムシロボット つくりかた

それから、サーボモーターの角度を変えるブロックは「サーボモーターを同時に動かす(速さ●)」というブロックの中に入っているね。このブロックは、本来、複数のサーボモーターを同時に動かすためのものだけど、動かすスピードを指定できるので、ここで使っている。「速さ●」で指定できるのは0から20までの値で、20が最も速い。ここでは、曲げるときはゆっくり、伸ばすときは素早く動かすことで、動きに非対称性を出しているよ。

第6回 シャクトリムシロボット つくりかた

これでプログラムは完成!こちらが完成プログラムだ。「実行」メニューから「プログラム作成・転送」を選んで、スタディーノにこのプログラムを転送し、シャクトリムシロボットをパソコンから切り離せるようにしよう。転送が終わったら、USBケーブルを抜いて、「つくりかた」の2以降の指示に従ってムシロボットをつくろう。