MindStorms NXTを動かすためのプログラム言語NXCには,RotateMotorPIDという関数がある。291話で紹介したRotateMotor(outputs,pwr,angle)関数は,angleに角度を指定した分だけ,モーターを回転させることができる。その関数名にPIDが付加されている。

 書式はRotateMotorPID(ports, pwr, angle, p, i, d)で,引数にはp,i,dが増える。

 Programming LEGO NXT Robots using NXCというPDF版のチュートリアルを読むと,NXTのファームウェアにはデジタルPIDコントローラが実装されているので,サーボモーターを正確に制御できると英語で書いてある。

 PIDとは何かとgoogleで検索するとWikipediaのPID制御という解説が最上位に表示される。一部を引用すると以下のように書いてある。

PID制御(ピーアイディーせいぎょ)は、フィードバック制御の一種であり、入力値の制御を出力値と目標値との偏差、その積分、および微分の3つの要素によって行う方法のことである。制御理論の一分野をなす古典制御論の枠組みで体系化されたもので長い歴史を持っている。フィードバック制御の基礎ともなっており、様々な制御手法が開発・提案され続けている今に至ってもなお産業界では主力の制御手法であると言われている

 文学部仏文科卒業の筆者としては,「へぇー,そうなの」という感じで実感がない。この後,Wlikipediaの 説明には,数式が続く。正直,私には理解困難である。

 「電子工作の実験室」というサイトのモーターのPID制御法というページが門外漢にもわかりやすい。ざっくり言うと,P:Proportinal(比例),I:Integral(積分),D:Differential(微分)の三つ値を使って,目標値になるべく速く,できるだけ正確に近づけようとする方法である。

1月2日 サーボモーターを水平に配置し,アームを回す仕組みを作る。正月三が日から,こんなことをしている。

 アームの上から,シャフトを通し,下の穴をスーと通れば平行だと見なす仕組みだ。

--------------------------------------------------------------

int iNum1=0;
task main()
{
     iNum1 = 720;
     RotateMotor(OUT_B,25,iNum1);
     Wait(5000);
}
--------------------------------------------------------------

 まずは,RotateMotor関数で,スピードを25に設定し,720度,つまり2回転分,ゆっくりと回してみる。

 かなりズレて,シャフトが通らない。

--------------------------------------------------------------

int iNum1=0;
task main()
{
     iNum1 = 720;
     RotateMotorPID(OUT_B,25,iNum1,50,50,100);
     Wait(5000);
}
--------------------------------------------------------------