2024年11月21日
007-1.モーター制御入門-第1回「速度を自動調節できるロボット」
ここでは、モーターの制御に関わる技術を紹介していきたいと思います。ロボット競技にも応用してみましょう。(文/松原拓也)
◆ パワーコントロールとは
ロボットのプログラム作りで欠かせないのが「モーター」ブロックや「移動」ブロックです。
今回は、このモーターブロックの中にある「パワーコントール」という機能について紹介したいと思います。
モーターブロックの設定項目に「コントロール モーターパワー」というチェックボックスがあります。これが「パワーコントロール」です。
最初にブロックを置いた状態では、チェックボックスは「オフ」の状態になっています。
NXTソフトウェアのヘルプによると、「パワーコントロール」とは「抵抗やずれを補正」するもので、「最大100%までパワーを上げ」る機能とのことです。
、、、といっても、この説明だけでは意味が分かりませんね。
補足すると、「パワーコントロール」というのは、指定した回転の速さになるようにインテリジェントブロックNXTがパワーを自動調節する機能のことです。「抵抗」というのは回転時の負荷のことです。
たとえば、モーターの回転に負荷がかかった場合、回転の速度が落ちてしまいますが、それをモーター内にある回転センサーで読み取って、速度が落ちないようにパワーを増やしてくれる、ということができます。
たとえるなら、電動アシスト付き自転車で坂道を上ると、回転を補助してくれるような感じでしょうか。
◆ 角速度を計ってみる
まずは、パワーコントロールが「オフ」の状態でモーターの回転速度(角速度)を確認してみましょう。
写真のようにインテリジェントブロックNXTのポートAにモーターを接続します。非常にシンプルです。
続いて、次のプログラム(Program-1.rbt)を実行します。
こちらは「モーターの角速度」を測定して表示するプログラムです。「角速度」というのは、回転する速さのことです。ここでは1秒あたりの角速度なので、単位は「度/秒」となります(deg/sと書いてもいいです)。角速度については中学校で習います。
モーターのパワーコントロールは「オフ」。モーターのパワーは「75」に設定しています。
実行してみました。
モーターが時計方向に回転して、1秒後に停止します。
画面に値が出ました。
これが角速度です。角速度は回転の速度のことです。ここでは、1秒あたりの回転角度を表す「度/秒」という単位を使います。
「561」というのは「角速度は561度/秒」ということです。約1.5回転/秒と考えることもできます。
◆ 角速度を計る(改良版)
さらにプログラムを改良してみましょう。
先ほどのプログラム(program-1.rbt)では、1秒間待たないとモーターの角速度を求めることができませんでした。しかも値が一度出たらプログラムは終わってしまいます。
そこで、もっと早く連続的に結果が出るようにしたのがこちらのプログラム(program-2.rbt)です。 今度は、約0.1秒おきに角速度を表示できます。 ループが動作する5秒の間に50回ほど角速度を更新することができます。
プログラムを部分的に拡大してみました。
計算ブロックを使って、 「回転した角度の差」を「経過した時間の差」で割っています。 1秒経っていないのに、「1秒あたりの回転角度」が求めることができる秘密はここにあります。
角度を時間で割ると角速度を求めることができます。
数式で表すと「角度÷時間=角速度」です。
たとえば、タイヤが2秒間で180度回転していたとします。もし、同じ速度で回転していたならば、180÷2=90。1秒あたり90度回転しているということになります。
では、いよいよパワーコントロールの成果を確認してみましょう。
モーターブロックの設定値にある「コントロール モーターパワー」のチェックボックスをオンにして、パワーは同じく「75」です。
実行結果は「732」でした。1秒間に732度回転したという意味です。パワーコントロールが「オフ」状態では「561」でしたので、「オン」状態にすると3割くらい回転が速くなったということになります。
これは一体どういう意味なのでしょうか?
◆ パワーと回転速度の関係
モーターのパワーと角速度の関係をもっと掘り下げてみましょう。
ここでは、パワーを0~100の範囲で変化させて、角速度がどう変化するかをグラフにしてみたいと思います。
グラフを作成するプログラム(Program-3.rbt)です。
ループが2重になっていますが、内側のループ部分は先ほどのプログラム(Program-2.rbt)とほとんど同じです。
外側のループでは、パワーを0~100の範囲で変化させて、液晶画面に点を描く処理を行っています。
プログラムを実行してみました。
パワーが0から1つずつ上がりながら100になるまでモーターが回ります。実行してから50秒ほど待つと、このようなグラフができあがりました。
グラフの横軸がモーターの「パワー」で、縦軸が「角速度」です。パワーと角速度は比例していて、まっすぐな線が斜めに描かれました。比例しているということは、パワーを2倍にすると回転速度が2倍になるわけです。
なお、このグラフを見ると、 パワーの0~5あたりは平らになっています。これはパワーが足りずに角速度が0だったということです。ある程度のパワーがないとモーターは回ってくれないということが分かります。
続いて、モーターブロック内の「コントロール モーターパワー」のチェックボックスを「オン」の状態にします。
そして、プログラムを実行すると、このようなグラフが描かれました。 先ほどのパワーコントロールが「オフ」だった時のグラフと比べると、違いがいくつかあります。
「オン」状態では、パワー0~5あたりで回転が止まっているという現象は無くなりました。
「オン」状態で設定できる「パワー」というのは、ソフトウェア上のパワーであり、回転の速さを意味しています。マイコン側が設定している「本当のパワー」は表面に出てこないので分かりません。
グラフのパワー90~99あたりでモーターの角速度が伸び悩んでいますが、これは「本当のパワー」を100に上げ切っていて、もうこれ以上速度が上がらないという状態に達していると考えられます。これは「オフ」の時にはなかった現象です。
パワーコントロールがどういう働きするか、理解できたでしょうか。
パワーコントロールの「オン」状態では、「パワー」は理論上の回転速度という意味になり、「本当のパワー」が隠されてしまいます。パワーの意味が変わってしまうのです。 パワーコントロールのオン/オフによって、2種類のパワーが存在するわけです。
混乱するので、「パワーコントロールは角速度コントロールである」と考えたほうがよさそうです。
◆ 決まった速度で走るロボット
「パワーコントロールは角速度コントロールである」ことを裏付けてみましょう。
モーター1個とインテリジェントブロックNXTだけで最小限のロボットを作ってみました。モーターはポートAに接続しています。
まずは速度制御に必須の情報となる「タイヤの円周」を求めます。 写真のように巻尺で計ってみたところ、円周は「18cm」でした。ただし、巻尺自体の厚みが加わってしまうので、少し正確ではありません。
円周は計算で求めることもできます。
直径×円周率=円周ですから、このタイヤは直径が56mmだとすると、56×3.14=175.84mm。四捨五入して176とすると、 17.6cmということになります。 巻尺で計るよりは正確だと思います。
前置きが長くなりましたが、こうしてできたプログラム(program-4.rbt)がこちらです。 指定した速度でロボットを走らせることができるというプログラムです。
プログラムの重要部分を拡大してみました。
プログラムの仕組みは単純で、パワーコントロールを使って、一定のパワーでモーターを回転させているだけです。
パワーコントロールをオンにすると、角速度が一定に保たれるので、ロボットの速度が固定されます。
写真の部分は、パワーを決定するための計算ブロックです。移動速度(単位はcm/秒)をモーターの角速度に換算して、さらにパワーに換算しています。変数「tyre」にはタイヤの円周が格納されています。
計算の最後に「9.73」で割っていますが、その理由は次の写真をご覧ください……。
……「9.73」という数値は先のプログラム(Program-2.rbt)から求めた値です。パワー「75」でモーターを回したさいに、モーターが「約730度」回転していましたので、730÷75=9.733....これがパワー1つあたりの角速度という定数として使うことができるのです。
再現したい角速度を9.73で割ると、モーターに必要なパワーを求めることができます。
では、実際にプログラムを実行してみましょう。
ここでは、「NXTスピードメーター」という自作の測定器を使ってロボットの移動速度を計測してみたいと思います。この「NXTスピードメーター」は2つ光センサーを搭載していて、センサーを通過した時間の差から物体の速度を求めることができます。
プログラムを実行すると、液晶画面に指定する速度が表示されます。ここで「右」「左」ボタンを押すと、速度を変更できます。速度の単位は「cm/秒」です。
「決定」ボタンを押すと、必要なパワーが算出されて、モーターが回転し始めます。
たとえば、移動速度を25cm/秒と選択すると、パワーは52.555と算出されました。
実際にロボットを走らせてみました。ロボットは80cm進むと止まります。
指定した速度が「25cm/s」だったのに対して、実測した速度が「25.2cm/s」でした。 なんと、1%未満の誤差で再現できました。
他にも「10cm/s」や「30cm/s」などの速度も試してみましたが、ほとんどそのままの速度を再現することができました。
大成功です。
パワーコントロール機能が速度コントロールとして使えることを証明することができました。
ただし、プログラムには限界があるようです。
ある速度を超えると、理想と現実にズレが生じてきてしまいます。 ここでは、「50cm/s」と設定したつもりが、実測では「40.7cm/s」となってしまいました。モーターの角速度が足りてません。
なぜ速度が足りないかというと、算出されたパワーが100を超えてしまったからです。
ひとつ前に実験したプログラム(program-3.rbt)ではパワーが90を超えたあたりから、 角速度が上限に達していましたが、 これがモーターを動かせるハードウェア的な限界のようです。
これ以上速く走らせるためには、ハードウェアの改造が必要となります(タイヤの直径を大きくするとか、加速ギヤを取り付けるとか、、、)。
最速のロボットを目指してみるのも面白そうです。
◆ (おまけ)モーターの個体差
NXT用のモーターに個体差がどれくらいあるのか……?
これを確認するため、実験を行ってみました。 手持ちのモーターを一通り並べて、角速度を求めるプログラム(program-2.rbt)を実行してみました。バラつきを見たいので、パワーコントロールはオフにしています。
結果は写真のとおりですが、 最大と最少を比べても誤差1%未満に収まりました。驚くほどバラつきがなく、製品の優秀さを改めて確認できました。
次回もモーター制御について紹介します。
[DOWNLOAD]今回作成したプログラム(教育用レゴマインドストームNXT2.0以上推奨)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。