2024年11月21日
008-1.EV3ソフトウェア入門-第2回「EV3とNXTの計算速度を比較する」
去年(2013年)、新シリーズのレゴマインドストームである「教育用レゴマインドストームEV3」が発売されました。今まで7年間に渡って使われてきた「NXT」との違いにも注目しつつ、EV3を使ったプログラミングについて紹介していきたいと思います。(文/松原拓也)
◆ まずは「割り算」から

前回は「NXTとEV3の両方で動くプログラム」と題して、一定時間ごとに値をカウントするというプログラムを紹介しました。
両方の機種で動くというのは互換性の点では都合がいいのですが、処理速度はどう違うのでしょう。EV3のほうがNXTよりも性能のいいマイコンを使っていますので、計算速度が少しは速くなっていたりはしないのでしょうか?
というわけで、今回はEV3とNXTの計算速度を比較できるようなプログラムを作ってみたいと思います。

計算速度を比較するためには、マイコンにうんとたくさんの計算をさせて、その計算時間を計らないといけません。
大量に計算するもの、、、として思いついたのが「素数」の計算です。素数というのは、整数で割り切ることができない数のことです。素数については、小学校5年生あたりから習います。
その素数の計算をさせるための下準備として、まずは単なる「割り算」のプログラムを作ってみました(warizan1.ev3)。
このプログラムでは「5÷2」という計算を行います。プログラムの仕組みは見てのとおりで、「数学」ブロックを使って計算を行い、「表示」ブロックを使って結果を表示しています。すごくシンプルなので、特に説明は不要かと思います。ブロックの機能については、ヘルプを参照しましょう。

実行結果です。
5÷2の答えとして、「2.5」が表示されました。当たり前の結果ですが、正解ですね。
◆ 端数ブロックを使う

さらに先ほど作った「割り算のプログラム」を改造してみました(warizan2.ev3)。
写真の赤ワクの部分に「端数(はすう)」というブロックを追加します。 この「端数」ブロックはNXTソフトウェアには存在していなかった、EV3ソフトウェアで初登場のブロックです。このブロックは数値の小数点を切り上げたり、切り下げたりすることができます。ここでは「切り下げ」に設定しています。

では、実行してみましょう。
、、、今度は「2」と表示されました。

なぜ「2」になったかというと、小数部分を切り下げた(切り捨てた)からです。 「2.5」の小数部分は「0.5」なので、それを取ってしまうと「2」が残ります。 なので、「2」と表示されていたわけです。

ついでに同じプログラムをNXTで実行した場合も紹介します。 この場合、インテリジェントブロックNXTをパソコンに接続して、プログラムを転送するだけで、自動的にEV3用だったものがNXTに切り替わります。 座標に対しての表示位置は変わってしまいましたが、NXTでも同じ結果が表示されました。 EV3ソフトウェアの場合、EV3特有の命令については、NXTで実行することができません。今までNXTソフトウェアになかったブロックは動かなかったりするのですが、なぜか「端数」ブロックに限ってはNXTでも動いてくれるようです。
◆ 割り算で「余り」があるかを判別するプログラム

先ほどのプログラムをさらに改造しました。割り算した結果が「割り切れた」か「割り切れなかった」かを判別するというプログラムです(warizan3.ev3)。
赤ワクで囲んだ部分を書き換えました。

変更した部分を拡大してみました。
データワイヤーがいっぱい出てて、ややこしいですが、ここでは、「端数」ブロックのあとに「比較」ブロックを追加しました。端数ブロックに入力される前の値と、端数ブロックから出力された値を比較しています。 こうすることで、割り算の結果に少数が付いてるか付いていないかがわかりますので、「割り切れた」か「割り切れなかった」を判断することができます。

プログラムの実行結果です。
「WARIKIRENAI(割り切れない)」と表示されました。 計算式は5÷2=2.5ですから、割り切れなかったと判定したわけです。正解です。

ためしに、プログラムを変更してみましょう。
割られる側の変数numを「5」→「4」に変更します。

今度は「WARIKIRETA(割り切れた)」と表示されました。
計算式は4÷2=2ですから、割り切れたわけです。こちらも正解です。
この割り切れたかどうかを判別する処理は、素数かどうかの判別にも応用することができます。
◆ マイブロックビルダーを使う

こうやってブロックを付け足していくと、どんどんプログラムの規模が大きくなって、見づらくなってしまいます。そこで「マイブロック」という機能を使います。マイブロックを使うと、複数のブロックを1個のブロックにまとめることができます。
マイブロックを作るには、まずマイブロックにしたいブロックをカーソルで選択します。 たとえば、写真の例では割り算で割り切れたかどうかの判定する処理をまとめて選択しました。

ブロックを選択したら、「マイブロックビルダー」をメニューの「ツール」から選択します。
マイブロックビルダーを選択するとダイアログが表示されますので、 マイブロックに名前を付けます。ここでは「warikireta」という名前にしました。 「終了」ボタンで決定です。

見事、マイブロックが生成されました。
選択したブロックがマイブロック1個に置き換わりました。割り切れたかどうかを判別する処理を1つにまとめたブロックです。データワイヤーのつながりもちゃんと維持されています。

マイブロックをダブルクリックすると、その中身を見ることができます。
NXTソフトウェアの時は、マイブロックの情報は別のファイルに格納されてしまって、別にパソコンにプログラムを移すとうまく動かなかったしたのですが、EV3ソフトウェアは1つのファイル(EV3ファイル)にマイブロックの情報も記録されていますので安心です。
◆ 素数かどうかを判別するプログラム

すっかり前置きが長くなりましたが、 今まで紹介した技術を組み合わせて、ある値が「素数か素数じゃないか」を判別してくれるプログラムを作ってみました(warizan4.ev3)。
これはプログラムの処理速度を計ることが目的なので、「タイマ」ブロックを使って答えが出るまでの時間も表示できるようにしてみました。
超大作になってしまいましたので、 文書では説明しにくいです。詳しくはEV3ソフトウェアで実際にファイルを開いて見てみてください。
このプログラムでは「9973が素数かどうか」を判別しています。 正解は「9973は素数です」ということなのですが、この答えを出すためには、 9973を総当りで割ってみる必要があります。つまり、、、
9973÷2
9973÷3
9973÷4
9973÷5
(中略)
9973÷9972
、、、という感じに割り算を行って、値が割り切れたかどうかを判別しています。計算の途中で1度でも割り切れてしまったら、その値は素数ではありません。

実行してみました。画面に「SOSUU」と表示されました。「9973が素数」という結果となります。見事、正解しました。
気になるプログラムの処理時間ですが、EV3で実行した場合には4.22秒、NXTで実行した場合には13.147秒でした。9000回以上もの割り算なんて、人間の頭だったら根を上げてしまいそうですが、マイコンだと秒単位で終わってしまいます。
結果、EV3のほうがNXTよりも3.11倍ほど計算速度が速いということが分かりました。なかなか興味深い新発見ではないでしょうか。 ちなみに、この結果は計算に限った話で、なんでも3倍というわけではありませんが、計算速度が求められるような場面では、EV3で作ったロボットのほうがNXTのロボットよりも有利に働きそうです。
[DOWNLOAD]今回作成したプログラム(教育用EV3ソフトウェア用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。