2003/10/05 日
LEGO の角度センサーであそぶ
前エントリーで購入した角度センサー(%2977c01)を使って、簡単なフィードバック制御をする仕組みを作ってみました。
写真中、青いパーツが角度センサーです。透明のパーツは、最近出た日本未発売のセット #4094 に入っているモータ(%47154)とギアボックス(%46224c01)です。このモータとギアボックスはちょっとしたモノを組む時に重宝しています。左の黄色い大きなブロックは、RCXというCPUボックスです。これにPCからプログラムをダウンロードすることで、LEGOのパーツを制御できます。
角度センサーが検知した値によりモータをON/OFFするプログラムを組み、右のプロペラを任意の角度まで回す仕組みを作ってみたいと思います。
まず、この角度センサーの特性ですが、差し込んだ軸が1回転すると16カウントするようになっています。要するに1カウントすると、360/16=22.5度回転したことになります。このままではちょっと分解能が低いので、実際に角度を計測したい軸(軸A)と角度センサーの軸(軸B)の間にギアを噛ますことで、軸Aが1回転すると軸Bが3回転するように増速してあげます(写真だと見づらいかもしれませんが、24歯と8歯のギアを使っています)。これにより、角度センサーの1カウントが軸Aの22.5/3=7.5度回転に相当することになります。
ついでにモータの特性ですが、LEGO のモータはいくつか種類があるんですが、全部ただのDCモータです。なので、単独では自分がどのくらいの速度でどれだけ回っているかを知る術はありません(経験的なフィードフォワード制御しかできない)。フィードバック制御するには、角度センサーを併用するなどの工夫が必要になります。ステッピングモータだったらフィードバック制御できるんですが・・・。出ないかなぁ(^^;
以下は、LEGOの強力な開発環境 NQC によるプログラムです(NQCの説明はここでは省きます)。
task main()
{
SetSensor(SENSOR_1, SENSOR_ROTATION);
SetPower(OUT_A, 7);
Fwd(OUT_A);
while (true)
{
repeat (12) {
ClearSensor(SENSOR_1);
On(OUT_A);
until (SENSOR_1 >= 4 || SENSOR_1 <= -4);
Off(OUT_A);
Wait(100);
}
Toggle(OUT_A);
}
}
NQC のことをよく知らない人でもなんとなくわかると思いますが、1秒に30度(4カウント)づつ回転する動作で1回転(30度x12回)し、逆方向でまた繰り返す、というプログラムになっています。計測する軸が高速回転していると、止める判断をしてから実際に止まるまでのタイムラグで結構回ってしまい精度が悪くなりますが、今回はギアボックスで減速しているので、かなり精度よく制御できているようです。
たまにカウントが飛んじゃったりするようですが、結構まともに使えそうです。実際に角度センサーを使って倒立振子を実現している人もいるようです。僕も何かで使ってみたいなぁ。ジョグダイアルでも作るかな。








