検索
  • 原田洋一

EdBlocksでEdisonをプログラミング(2)

最終更新: 2019年12月20日


ちょっと間が空いてしまいましたが、前回の続きです。EdBlocksのコマンド入門については、前回の記事を参照してください。

EdBlocksでEdisonをプログラミング(1)

さて、今回はDriveのコーナーに並んでいる、このブロックからスタートです。

このアイコンのイラストから考えれば、このブロックは、「ある条件のときに直進する」というブロックであることは直感的に理解できます。

試しに下のようなプログラムを書いて実行すると、Edisonはずっと前進します。無限ループを使わなくても、このブロックひとつだけで無限ループと同じ状態となります。

また、Wait Untilにあるブロックを使って、このようにすると、指定した秒数後(下は5秒後)に直進ブロックは動作を止めます。Wait Untilブロックのこの仕様はレゴのEV3のものと少し似ていますので、案外分かりやすかったのです。

ところが、次に下のプログラムをを試してみたときに、「あれ?」となりました。

このブロックの絵から理解できる内容は、「Edisonの左側の明かりセンサーに明かりを当てると走る」というものだと思います。もう一歩踏み込むと「左側のライトが無くなったら停止する」ということだと思うのです。おそらくほとんどの方がそう思うと思うのです。ところがこのプログラムを実行してみると....

 ①普通の明るさの部屋で実行すると、ただ走り続ける。

 ②真っ暗な部屋に持っていって実行しても、走り続ける。

 ③左の明かりセンサーにライトを当てた状態で実行しても(明るい部屋でも暗い部屋でも)

  走り続ける。ライトを消しても止まらない。

という動作になるのです。そして、上の①〜③のどの状態のときでも、絵に書いてある反対側の明かりセンサーにライトの光を当てると、停止します。まあ、絵に書いてある反対側のセンサーに明かりを当てると止まるというのは、ありえる動作です。絵と真逆の状態になったときに止まるというのは、まあ普通に考えればそうだろうなと思えます。でも、最初に動作する条件がよくわかりません。とにかく何でも動いてしまうように見えるのです。改めてメーカーのコマンドレファレンスを見てみたのですが、このブロックのこのモードの解説には、

Drive forward while a light is on the left side

と書いてあるだけです。日本語に訳せば、「ライトが左側にある間、前進する」(これはGoogle翻訳でもほぼこの通り訳されます^^;)ということです。

ここで「これは何かのバグかも」と思いメーカーにも問い合わせたのでしたが、簡単に言うとメーカーからは「仕様です」と返されたというわけです。

Edisonの前方左右についている明かりセンサーは、「それぞれの明るさを比較していて、突然片方が高くなると動作を停止する」というのが仕様とのことでした。ということは、「絵と反対側の明かりセンサーに光を当てると停止する」という理解で正しいのでした。

左側の絵にライトを当てる絵にしたのは、「他のブロックとのネーミング・機能の整合性でこういう表現にしてる」ということでしたので、まあこれも「そういう仕様なんです」ということでした。まあちょっとモヤッとしますが、このブロックに関しては、どんな条件でも前進動作がスタートして、絵の方向にライトを当てるのではなく、「絵と反対方向にライトを当てると止まる」という動作として覚えておけば良いのだと思います。

さて、このブロックにはあとこのようなモードもあります。

Edisonは、本体の底面にラインセンサーとよばれるセンサーがひとつついており、これが黒や白い色を見分けて反応します。ライントレースなどはこのセンサーを使って動いているわけです。これは、ラインセンサーを使ったプログラムブロックで、「白の上で走る」というコマンドのようです。そして、白以外の色に差し掛かると止まる動作をすると思えます。実際テストしてみると、そのとおりの動きをします。ここまでは想定通りでした。

ところが、こちらをやってみて?になりました。これ、先程の「白の上で走る」の延長線上で考えれば、当然こちらは「黒の上で走る」であり、黒以外の色、たとえば白の上にさしかかったらそこで止まるはずです。だれがどう考えたって、そう思うと思うんです。

ところが、やってみると、これがどうやってもうまくいきません。黒い紙の上に置いてプログラムをスタートしても全く走りません。白の上に持っていったり、いろいろやってみましたが、どうしてもこのプログラムで走ってくれません。これも非常に悩んだ末にメーカーに問い合わせたのですが、これも「仕様」という返事をもらって、ちょっと唖然としてしまいました。

今度は、Edisonのラインセンサーの動作仕様にかなり密接に関わる内容です。メーカーの説明によると、Edisonは、ロードしたプログラムを実行する際、プログラムの実行直前に底面のラインセンサーが色を読み取り、それを基準値としてセットするのだそうです。要はセンサーのキャリブレーションを行っているわけなので、その際必ず白いところの上でプログラムを実行する必要があるのだそうです。

でも、だとすると、このコマンドは上のようには使えないということになります。白の上でプログラムを実行すると、プログラム実行前のラインセンサーのキャリブレーションは成功したとしても、次の瞬間実行されたプログラムは、すぐに白を見つけるわけですから、直後に停止してしまいます。「これ、一体どういう使い方するのよ?」とメーカーに問い合わせたら、教えてくれました。

なんかちょっと脱力するのですが、確かにこのようにして、白の上でプログラムをスタートしてから、次にEdisonを黒い紙の上に移動させて本体のボタンを押してWait Untilブロックを解除してあげれば、Edisonは走り出します。そして白いところにさしかかったら止まりました。

まあ仕様としてわからないでもないのですが、だったら、せめてコマンドレファレンスくらいにはちょこっと注釈書いてといてほしかったなあ。例によってコマンドレファレンスには、

Drive forward while on a black surface

と書いてあるだけなんです。いろいろ書くスペース十分あると思うんですけどね。僕はメーカーのHPにある英語の資料かなり読んだ方だと思うのですが、この件に言及してる部分は見つけられませんでした。なんかアバウトですよねぇ...。まあ、質問すると丁寧に素早く答えてもらえるんですが...。

ということで、Edisonのプログラムブロックはここが要注意です。おそらくこれ以外のところで、?になるところはあまりないと思いますが、この辺でひっかかって、「うまく動かないじゃないか」と思わずに、ぜひ使ってみてほしいと思います。


311回の閲覧