2024年11月21日

008-1.EV3ソフトウェア入門-第12回目「超音波センサについて」

新シリーズのレゴマインドストームである「教育用レゴマインドストームEV3」を使ったプログラミング環境「EV3ソフトウェア」について紹介していきたいと思います。(文/松原拓也)

◆ 超音波センサ

超音波センサは超音波で距離を測るセンサです。 超音波というのは、周波数が高い20kHz以上の音のことです。超音波は人間の耳には聞こえません。
超音波センサはNXT用とEV3用の2種類があります。ここでは、両者を「NXT超音波センサ」「EV3超音波センサ」と呼ぶことにします。
EV3超音波センサのほうがNXT超音波センサよりも7年ほど新しいです。インテリジェントブロックに接続した場合のオートIDも違っています。測定の結果はNXT用の場合、1cm単位でしたが、EV3用の場合は0.1cm単位で返ってくるようになりました。 部品もかなり違います。搭載しているマイコンは動作クロックが3.58MHz→16MHzに変わっていますので、内部の計算速度は4倍くらい上がっているのではないでしょうか。

超音波センサの動作原理について紹介します。次の手順で動作します。
(1)超音波を送信します。
(2)超音波が障害物(または物体)に反射します。
(3)超音波を受信します。
これで、送信と受信の時間差を元にして距離を求めています。
超音波は「音」ですから、進むのに時間がかかります。音の速さはおよそ340m/秒ですから、音が1m進むのにかかる時間は1000÷340=約2.94ミリ秒です。
たとえば、50cm手前にある障害物に超音波を当てた場合、反射して戻るのに1m必要ですから、超音波を受け取るまでに最低2.9ミリ秒は時間がかかるわけです。この「2.9ミリ秒」というのはたいした時間じゃないように思えますが、光センサが限りなく0秒で反射してくることと比べると遅いということになります。

超音波センサの理解をもっと深めてみましょう。 超音波センサから「超音波が出てる」ということを確認するために実験を行ってみました。
秋月電子通商で売っているR-40という超音波センサ(アンプもなにも付いていない状態の超音波センサです)を使います。R-40にオシロスコープのプローブをそのままつないで、EV3超音波センサに近づけます。 EV3超音波センサには2つの目が付いていますが、正面から見て右目から超音波が出ています。左目は受信用です。

オシロスコープに波形が出ました。 測定結果を見ると、センサの端子間に-1~+1Vくらいの電圧が発生しています。超音波がセンサ内部の圧電素子に当たって、電気のエネルギーに変換されているわけです。これは音そのものを波形で見ている状態です。音の周波数は約42kHzでした。規格どおりの超音波が出ています。

続いて、通信中の端子の電圧も見てみましょう。
EV3超音波センサに自作した中継器をつないで、その端子の電圧を測定してみました。

二回に分けて測定してみました。見たところ、5番ピンがインテリジェントブロック→EV3超音波センサへ信号(コマンド)が流れていて、6番ピンがインテリジェントブロック←EV3超音波センサへ信号(レスポンス)が流れているようです。5番ピンの信号は波形がまったく崩れないので、測定値を含んでいない=コマンドと解釈しました。どちらの波形を見てもクロックらしくありませんので、通信方式はI2Cではなくなったようです。普通のUARTでしょうか? ちなみにNXT超音波センサではI2Cが使われていました。
I2Cを廃止した理由はおそらく通信速度を上げるためだと思われます。I2Cだと測定のたびに毎回アドレスを送っていたので、通信にムダがありました。
気になるのは通信速度です。1ビットらしい波形の間隔を測ってみると、ボーレートは62kbpsくらいに見えます。ただし、62kbpsっていうボーレートは使われていないと思うので、となると57600bpsでしょうか。ちょっと、これについては資料が無いので謎のままです。

◆ 超音波センサの測定範囲

超音波センサの測定範囲ですが、これについてはアフレルさんのWebサイトの技術情報で公開されています。→(http://www.afrel.co.jp/archives/844)。これによると測定範囲は約20度とのことです。
なので、ここでは測定範囲を求める方法だけ紹介したいと思います。 用意するものは、「超音波センサ」と「インテリジェントブロック」と「障害物」です。障害物は平らで固いものを選びます。大きさが結果を左右するのですが、7×7cmくらいがいいと思います。

超音波センサなどを図のように配置して、「Port View」で距離を測定します。値が正確→不正確になった地点を確認して、その場所までの「距離X」「距離Y」を記録します。 距離Xはセンサからまっすぐ伸びていて、距離Yに対して直角に交わります。障害物の角度によっても結果は変わってしまいますが、できるだけ角度を同じに保ったほうがいいと思います。 距離XとYを、表計算ソフト(EXCELやGoogleドライブのスプレッドシート)に入力します。そして、次の式で距離から角度を算出します。

=DEGREES(ATAN(距離Y/距離X))

以上の方法で測定範囲を求めることができます。ATANはアークタンジェントを求める関数です。DEGREESはラジアンから角度を求める関数です。この結果は片側だけの角度になりますので、両側の角度にするには2倍にしたほうがよさそうです。

◆ 超音波センサの応答速度1

超音波センサの応答速度を求めてみたいと思います。 最初に作ったのが、超音波ブロックを読み取って変数に格納するだけのプログラムです。1秒間あたりのループの実行回数を求めます。 ループの実行回数は「0」から始まるので、1つ少ない結果が出てしまいますが、プログラムの短さを優先して細かいことには目をつぶります。
面白いことに、このプログラムはNXT超音波センサでもEV3超音波センサでも使うことができます。ソフトウェア側で通信仕様の違いを吸収しているのです。

プログラムの実行結果です。
意外なことに、NXTとEV3はほぼ同じ結果でした
1秒間に2100回ループしているということは、ループ1周あたりの動作時間は1÷2100=0.476ミリ秒です。とてつもないスピードだということが分かります。 しかし、先ほどの計算では「音が1m進むのに2.9ミリ秒かかる」という結果が出ていますので、0.476ミリ秒で超音波ブロックを読み取れてしまうのは、どう考えてもおかしいです。
おそらくですが、超音波ブロックは毎回測定をしているわけではなくて、その時の最新の測定結果を返していると考えられます(結果が変化しない時がある)。 実際の測定に2.9ミリ秒かかっていると仮定すると、2.9÷0.476=6.092……。ループが6周ずつくらいにしか超音波ブロックの結果は変化していないということになります。

余談ですが、「拡張機能(ADV)」モードの場合の結果も測定してみました。さらに「0 = Ping」「1 = 継続」という2種類のモードがあるのですが、両方とも測定してみました。
この拡張機能モードはいったい何をするためのモードなのか、ヘルプを読んでみたのですが、分かりませんでした。 Pingにすると、ものすごく実行速度が遅くなってしまいましたので、通常の用途では使わないほうがいいと思います。

◆ 超音波センサの応答速度2

前置きが長くなりましたが、 正しい応答速度を出すための装置を作ってみました。
全体の構成は写真のとおりです。可動式の厚紙を超音波センサの10cmくらい手前に配置します。光センサはポート1に接続します。 超音波センサはポート4に接続します。

こんな感じで動きます。
測定時に厚紙を手で持ち上げてから落とします。厚紙が落ちるとセンサが反応するという仕組みです。
これで光センサと超音波センサの反応時間の差を求めることができます。これでNXT版とEV3版との超音波センサの違いが分かるはずです。

測定用のプログラムはこちらです。 前回のものとほとんど同じです。
ループが2つありますが、1つ目のループは光センサが反応するまで待つループです。2つ目のループは超音波センサが反応するまで待つループです。ループの脱出条件は「測定した距離が0~20cmの範囲内に入ったら」としました。かなり条件がゆるいです。

プログラムの実行結果です。
10回ほど測定して、表計算ソフトに入力しました。結果を平均化すると、次のような結果になりました。
・NXT超音波センサ:0.1742秒→174.2ミリ秒
・EV3超音波センサ:0.0206秒→20.6ミリ秒
なんと、結果が1ケタ違ってます。計算すると、0.1742÷0.0206=8.45631……つまり、「EV3超音波センサはNXT超音波センサよりも8倍ほど反応が速い」ということになります。
8倍も性能が違うというのはかなり衝撃的です。ロボット競技で超音波センサを使う場合には問答無用でEV3版を選んだほうが良さそうです。

[DOWNLOAD]今回作成したプログラム(教育用EV3ソフトウェア用)

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。