2024年11月21日
007-1.モーター制御入門-第4回「モーターの負荷を読み取って自動停止するロボット」
ここでは、モーターの制御に関わる技術を紹介していきたいと思います。ロボット競技にも応用してみましょう。(文/松原拓也)
◆ 回転センサーでモーターの負荷を読み取る

前回は、パソコン用のシミュレーションを使って、モーターの「トルク」について紹介しました。
この「トルク」の要素を使ってプログラムを作れないかと思ったのですが、あいにくトルクをうまく数値化する方法がありません。
そこで、モーターの中に入っている「回転センサー」を使って、トルクに似た情報を取り出してみたいと思います。
一定のパワーでモーターを回した状態で回転センサーで角速度(回転速度)を読み取り、角速度が減れば「回転に負荷がかかった=トルクが増えた」と考えればいいわけです。

用意するのは、こちらのロボットです。
モーター1つだけで前進/後退ができます。モーターは出力ポートAにつながっています。

何かをきっかけにロボットを止めたいという場合、いくつかの方法があります。たとえば、、、 「タイマーで止める」 「超音波センサーで止める」 「光センサーで止める」 などです。 しかし、ここでは発想を変えて、モーター内にある「回転センサー」を使ってロボットを止めてみたいと思います。果たしてそんなことができるのでしょうか?

本当はモーターが出力しているトルクを読み取って、 それが一定以上になったら、モーターを止めるという制御を行ってみたかったのですが、 回転センサーの値から正確にトルクを割り出すことができません。そこで、モーターの角速度(回転速度)だけで判断させてみます。
ロボットが障害物に当たると、 モーターの角速度が落ちますので、その量が一定値を超えたら、モーターを止めるというプログラムを作ってみます。
◆ 角速度の減り具合をとらえる

モーターの角速度を測定しやすいように、いったんロボットをばらして、写真のような状態にしました。
モーターはポートAにつないでいます。タイヤはどこにも当たらず、空回りになっています。

モーターの角速度を表示するプログラムです(Program-1.rbt)。NXTソフトウェア2.0を使っています。
モーター入門の1回目で作ったものをそのまま使っています。 詳しい説明はモーター入門の1回目を参照してください。

プログラムを実行しました。
タイヤが空回りの状態で、モーターをパワー「75」で回転させた場合、 角速度が「650度/秒」を示しました。1秒間に約1.8回転のスピードですね。

タイヤに手で触れて、モーターに負荷をかけてみました。
完全に回転を止めてしまうと、 回路が壊れるか(大電流が流れる)やモーターが壊れる(ギヤが破損する)かもしれませんので、 やさしめにタイヤに触れます。
角速度が650度/秒→580度/秒くらいに変化しました。差し引き、70度/秒ほど角速度が落ちたわけです。
では、ロボットが障害物に当たったら、どれくらい角速度が落ちるのか?というと、実際にやってみないとわかりません。タイヤがスリップするぶんもありますので、70度/秒より少ない変化量だと思います。

赤いワクで囲んでいるのが、 追加・修正した部分です(Program-2.rbt)。
「1ループ前の速度(oldspeed)」という変数を作って、「今の速度(speed)」との差を常に計算して、 その角速度の差がしきい値を超えたら、ループを抜けてモーターを止めるようにしました。角速度が急激に下がった時=衝突として反応するはずです。
一番の問題は、比較する「しきい値」ですが、 ここでは角速度の変化が「20度/秒より下がったら」 としました。計算順の都合でブロック内では「-20」となっています。

なお、単に角速度が下回ったらという条件だと、スタートした時に角速度が出ていませんので、間違って反応してしまいます。
ループを抜ける条件は角速度の「差」で反応するようにしています。
◆ パワーと回転速度の関係

では、実際に確認してみましょう。
先ほどのロボットを置き、その前方に2リットルのペットボトルを置きます。ペットボトルは空っぽです。

実行すると、ロボットが勢いよく前進して、ペットボトルに「ボコン」と激突しました。

激突した直後に、ロボットが止まりました。
超音波センサーも光センサーも使わずにロボットを止めることができました。
成功です。

空のペットボトルは軽くて、ぶつかるとあっさりと倒れましたが、何度か実行してみると倒れないでロボットが止まることもありました。
うまく、しきい値やロボットの速度を調整すれば、完全にペットボトルを倒さないでロボットを停止させることできるかもしれません。
よくロボット競技で、ロボットが障害物に当たって立ち往生してしまうという場面がありますが、この技術を応用すれば、自動的に復帰させることもできるはずです。「リタイヤしにくいロボット」が作れるのではないでしょうか。回転センサーしか使わないので、入力ポートを消費しないというメリットもあります。他にも、なにか使い道がありそうな気がします。
次回もモーター制御について紹介します。
[DOWNLOAD]今回作成したプログラム(教育用レゴマインドストームNXT2.0以上推奨)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。