2025年7月31日

026-1.SPIKEプライム Python入門(SPIKE App3)-第2回「モーターを動かす」

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」と専用アプリ(SPIKEアプリ)を使った、Pythonのプログラミング方法について紹介します。原稿執筆時点のSPIKEアプリの最新バージョンは3.5.1です。(文/松原拓也)

◆ モーターの動きを見える化する

今回はモーターを動かしてみたいと思います。必要なものはラージハブとモーターです。
ここでは、ラージハブのポートAにMモーターを接続することにします。

モーターを回すプログラムです(motor1.llsp3)。「ナレッジベース(ヘルプ)」の内容をコピペしてから手直しただけです。 「motor.run_for_degree」がモーターを回す関数です。 この関数にはモーターの角速度(回転速度)を調整する機能があります。
プログラムを実行すると、モーターの軸が360度回転します。角速度は360度/秒に設定しています。
「main」がメインの関数です。それを「runloop.run」という関数から呼び出しています。これは非同期処理として命令を実行させているためです。「await」は処理が終わるまで待つ関数です。 プログラムの構造が複雑に感じるかもしれませんが、ここは頑張って慣れるしかありません。

改良版のプログラムです(motor2.llsp3)。 ここでは回転時の加速度と減速度を設定することができます(正確には角加速度、角減速度と呼びます)。

さらに改良したプログラムです(motor3.llsp3)。モーターの動きを「見える化」してみましょう。
非同期処理の機能を使って、0.1秒おきにモーターの回転速度を測定します。 測定した結果は画面に表示します。

プログラムを実行すると、コンソール画面にモーターの角速度が表示されます。
ラージハブの送信バッファが一杯になってしまうと、コンソールに文字が表示されなくなってしまうという問題があります。今回はモーターの回転時間が短いので、異常が発生する前にプログラムを終了します。

出力結果をコピペして、 表計算ソフト(OpenOffice Calc)でグラフを描いてみました。
グラフの横軸が時間(単位は秒)。縦軸が角速度です。ヘルプによると、角速度の単位は「度/秒」だと書かれていますが、なぜか実際の値よりも少ないです。本当だとピーク時に値が360度/秒となるべきですが、1ケタくらい少なく感じます。原因がわからないのですが、このまま進めます。
加速度&減速度が500の場合、回転が停止するまでの時間は1.8秒です。一方、加速度&減速度が1000の場合、回転が停止するまでの時間は1.5秒です。回転時間が0.3秒も違います。モーターの角速度を360度/秒と設定しているので、1秒で360度回転が終わるのかと思ったら、そうではありません。実際には加速と減速に時間がかかるので、1秒よりも確実に遅くなります。


◆ 平坦と坂道の実験

今度はモーターの速度調整機能を「見える化」してみましょう。
モーターにタイヤを付けて、移動可能なロボットに作り替えます。 そして、「平坦な道」と「坂道」でロボットを走らせます。

プログラムは先ほどのmotor3.llsp3をそのまま使います。加速度&減速度は1000に設定しました。 プログラムを実行して、測定結果を表計算ソフトに入力して、作成したグラフがこちらです。
グラフの青色が「平坦な道」での角速度です。赤色が「坂道」での角速度です。どちらも1.4秒でモーターの回転を終えています。 坂道の場合は回転に負荷がかかっていますので、平坦な道の場合に比べて、速度の立ち上がりが遅れています。ロボット側は「回転が遅れている」ということを回転センサーで入力していますので、その遅れているぶんだけモーターのパワーを増やしています。結果として、「平坦な道」でも「坂道」でも同じ速度でロボットが進むことができます。
加速度と減速度は大きければ良いというわけではありません。たとえば地面が滑りやすい場合には、加速度と減速度を少なめに設定するとスリップを防ぐことができるかもしれません。ロボット作りに活用してみましょう。

非同期処理のプログラムを実行中の様子

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