2024年11月18日
004-4.アルゴリズム入門-第5回「モータのスピードをコントロールする」
「アルゴリズム」とは英語で書くと「Algorithm」、プログラムにおける「考え方」を表した言葉です。
この連載では、ロボットのプログラミングの中で、アルゴリズムを活用する方法を紹介していきたいと思います。(文/松原拓也)
◆ コントロール機能を自作する

今回はシンプルな構成で、インテリジェントブロックNXTのポートAにモータをつなぐだけです。

「スピードのコントロール」というと、みなさんよくごぞんじだと思いますが、モータブロックの中に同じようなものがあります。「モーターパワー」というチェックボックスがそれです。この「モーターパワー」をオンの状態にすると、「パワー」で設定した値に合わせて、モータの回転速度を一定に保つ(パワーが自動的に変化する)ことができます。
ただし、この「モーターパワー」機能は独自の値で設定するので、モータの回転速度は分かりません。なので、「x秒後にぴったりx度回転させる」という制御ができません。
今回、作成するプログラムでは、動作時間から回転角度までを完全にコントロールできるものを目指してみたいと思います。
◆ オン/オフを繰り返してスピード調節

まずは「スピードをコントロールする」というシンプルなプログラムを作ってみました。
[Download]モータのスピード調節プログラム1(NXTソフトウェア2.0で作成)

コントロールするスピードは、いくつでもいいのですが、ここでは「1秒で半回転(180度)」と設定しました。そのとおりにモータが動けば成功です。

スピードをコントロールするアルゴリズムを考えてみました。
たとえば、通勤・通学であなたが目的地に向かっていく時に、時間に正確な人が目の前にいると想像してください。これを「目標の人」と名付けます。

あなたは「目標の人」を参考にして歩きます。目標に届いていない場合は前進して、目標を追い抜いたら停止する、という動作を繰り返すことで、時間通りに到着するはずです。

この動作をプログラムに置き換えると、こうなります。目標となる角度は変数「deg」に入ります。ループを巡回すると、変数「deg」は0.1秒ごとに18度ずつ増えていきます。
目標に追いついているかどうかの判定は「比較ブロック」で行います。

プログラムを実行させると、指定したスピードでモータが回転します。
回転軸を観察してみたところ、プログラムどおり「1秒あたり180度」が実現できているみたいです。
一応は成功なのですが、、、どうも回転がガクガクしています。止まった時には一瞬、逆回転もしてしまっているようです。
◆ パワー調節してスピード調節

先ほどのプログラムを修正して、先ほどの「回転がガクガクする」問題を対策してみました。
[Download]モータのスピード調節プログラム2(NXTソフトウェア2.0で作成)

ガクガクする原因は、モータの動きが「オン」か「オフ」かの2種類しかなかったからです。
そこで、プログラムに「比例制御」を取り入れてみました。

「比例制御」の原理を図にしてみました。
目標値と現在地の差を求めて、その差が大きければ大きいほどパワーを増やしていくという方法です。こうすると、動きにムダが無くなるはずです。

変更前(上側)と変更後(下側)のプログラムを比べてみました。
モータのタブに入力する「パワー」の値は0~100を受け付けます。値がマイナスの場合は0と見なされ、100より大きい場合は100と見なされます。

プログラムを動かしてみました。
ガクガクする動きがなくなって、なめらかに回転するようになりました。回転軸を見たところ、「1秒で180度回転する」というスピード調節もうまく働いているようです。
◆ さらに処理を細かく

先ほどのもので特に不満はないのですが、さらにプログラムを改良してみました。
どこを改良したのか分かるでしょうか? 改良点は、「タイマブロックを追加したこと」です。そして、最後の待機ブロックを削除しています。
[Download]モータのスピード調節プログラム3(NXTソフトウェア2.0で作成)

タイマブロックを追加したことで、そこから目標値を求めることができるようになりました。
変更前のプログラムでは0.1秒ごとに角度を18度ずつ足していきましたが、これだと角度に間が空いてしまいます。タイマから求めることで、そうしたスキ間が発生しなくなります。

変更前(上側)と変更後(下側)のプログラムを比べてみました。

変更前では0.1秒ごとに目標値を足していたのですが、変更後はタイマから目標値を求めています。これによって、最高速度でループが実行するので、モータをもっと小刻みに制御できるようになります。

プログラムを実行すると、前回と同じく「1秒あたり180度」のペースでモータが回転します。
回転の精度が挙がったはず、、、なのですが、見た目の動きだけでは判断できませんでした。
◆ スピードが一定になるかを実験

さらにプログラムを改良してみました。処理のムダを削って、ブロックの数を減らしてみました。
[Download]モータのスピード調節プログラム4(NXTソフトウェア2.0で作成)

変更前(上側)と変更後(下側)のプログラムを比べてみました。
一つ目の変更は計算ブロックの使っていた数を2個から1個に減らしたことです。もう1つの変更点は、変数ブロックを削って、角度の目標値をそのままワイヤでつないだことです。動作の内容には変化はないはずですが、処理が簡単になっています。

それでは、動かしてみましょう。
ここではスピード調節がうまく働いているを確認するために、タイヤの重りを付けてみました。こうすると、モータに負荷がかかるので、普通に回るだけだとスピードが安定しないはずです。

実行中の様子です。
「重りあり」でも、「重りなし」でも、モータの回転速度は変わりません。見事成功です。
ただ、気になる点として、プログラムを10秒ほど動かしてみたところ、5回転ぴったりで終わるべきところが、5回転半で終わってしまいます。モータが半回転ほど余分に回っているようです。この原因については想像が付くので、次回に対策方法を紹介したいと思います。
◆ 負荷がかかると電気を消費する

すでに目的を果たしたのですが、プログラムをさらに改良してみました。表示ブロックを追加して、液晶ディスプレイ(LCD)にグラフが描かれるようにしてみました。モータのパワーの変化を確認するためです。
[Download]モータのスピード調節プログラム5(NXTソフトウェア2.0で作成)

追加したブロックを拡大してみました。計算ブロックはタイマからの時間を100で割って、表示ブロックのX軸につないでいます。表示ブロックのY軸はモータのパワーをつないでいます。これで、パワーの変化がグラフとして描かれるはずです。

「重りなし」の時と「重りあり」の時とでグラフを表示させてみました。
グラフの見方は横方向が「時間軸」で、縦方向がモータの「パワー」です。「重りなし」で回転させた方はパワーが一定なのに対して、「重りあり」で回転させた方はパワーが波のように上下しています。これは重りを持ち上げる時に負荷がかかっているということになります。
モータの「パワーが増える」ということは、「電気を多く消費する」ということです。同じような現象は家電製品でも起こります。たとえば、冷蔵庫にモノを詰め込んで冷えにくい状態になると、普段よりも多くの電気を消費してしまいます。
最近では「節電」が社会での大きな課題となっていますが、そうしたヒントがこうした実験の中からも見つけることができるかもしれません。
【Movie】プログラム1~5の実行結果のムービー(Youtube)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。