2014年8月25日月曜日

14.08.25 PID制御でライントレース






以前三輪車で電車のシミュレータを作ったが、レールに沿って走るライントレースはもっとも単純なオンオフ制御で行ったので、ギクシャクしながら走るのが気に入らなかった。改善をめざしネットでPID制御の方法を調べ、ライントレースに適用してみた。


PID制御については、ネットで見つけた「ETロボコンではじめるシステム制御」を参考にした。
PID制御の計算は浮動小数点で行うことになるので、PICで処理できるか確認することろから始めた。いつもは8bitのPICを使っているが、比較のために16bitのPIC24FJ64GA002でテストすることにしたが、これまで使っていたMPLAB IDEでは16bitのPICのコンパイラが入手できなくなっていることが判明。あきらめて新しいMPLAB X IDEに乗り換えることにした。コンパイラも新しいものに変わったので、これまでのソースの修正も必要だが、なんとか使い慣れてきた。





PID制御のサンプルコードを16bitと8bitのPICで走らせて実行時間を測ってみたところ、16bitのPIC24FJ64GA002(32MHz)で176μsec、8bitのPIC18F24K20(16MHz)で380μsecとなり、同じクロックとするとほぼ同じ実行速度という不思議な結果が得られた。
大差なければ、以前使ったハードをそのまま使うのが一番楽なので、8bitのPIC18F2431(8MHz)で処理速度を測ってみたところ、1.8msであった。古いPICなので処理が遅いと思われるが、これでやることにした。





今回はセンサはラインの片側に1ヶ取り付け、明るさの目標値に近づくように方向を制御する。三輪車なので、左に曲がるときは、左側の車輪を逆転させ、駆動力をコントロールして曲がる具合を調節する。
1回のPIDの計算に最大で3.5ms程度かかるので、制御の時間間隔は5msとしてある。





比較のために、オンオフ制御とPID制御を切り替えれるようにしておいた。PID制御にすると、ギクシャクした動きがグッと少なくなるのがわかる。

2014年8月5日火曜日

14.08.05 小型タイマー






久しぶりの実用品。秋月の商品を見ていて、8文字*2行の小型の液晶を見つけたのでこれを使って3代目のタイマーを作ることにした。温度と湿度を測れるセンサーも購入したので、これも組み込む。


液晶は8文字*2行のもので、I2Cでマイコンにつなぐ。マイコンは20pinの18F14K50を使いたかったが、デバッガを使えないと新しいデバイスを使うのは難しいので、28pinの18F24K20にした。温度・湿度センサはAM2321というものだが、使えるようになるまでえらく苦労した。
基板は小型にするため、47*72mmのICB288Gとした。2代目の半分の大きさにできた。



電源は液晶が3V以上でないと動かないことが判明したので、ステップアップレギュレータを8pinのパッケージに組み込んだモジュールを秋月から購入して使うことにした。これで3.3Vが出てくる。電池ケースは手元に単3電池2本用のものしかなかったので、これを使う。ICB288Gの基板に取り付け、タイマー基板の裏側に重ねて取り付けた。





液晶はマニュアルに従ってコーディングし、I2C経由で問題なく動くことが確認できた。次に温度・湿度センサを動かそうとしたが、マニュアルが中国語のものしか見つからない。I2Cと単線接続の2通りの方法があるらしいが、単線接続の方はマニュアルの英語の図を見てなんとかできそうなので、まずこちらをトライしてみた。オシロで見るとそれらしいデータが出力されているようなので、これをマイコンで取り込もうとしたが、データの取り込みのために80μsec毎に割り込みを処理する必要があることが判明。PICのクロックを最高の16MHzにしたがまだ追いつかない。割り込み処理で、それぞれの割り込みのイネーブルとフラグをチェックしていたが、高位の割り込みはセンサの入力だけにし、チェックなしで処理するようにしてなんとかデータを取り込むことができるようになった。
下の図の上側はセンサからの入力波形、下側は割り込みの入り口でLEDをオンにし、出口でオフにした波形。センサの信号の立ち上がりで割り込みをかけている。





次にI2C接続を調査。ネットで探して見たら「デジタル温度・湿度センサーAM2321を制御する」で丁寧に説明してくれている。この説明とPICのマニュアルを読み、I2C経由の読み込みのコーディングを行い、なんとか使えるようになった。
下の図の上側はI2Cのクロック、下側は割り込み中LEDをオンにした波形。





動作モードは温度・湿度表示、タイマー、メトロノームの3つとする。操作子はタクトスイッチ3ヶとボリューム1ヶ。Sw1はモード切替(1回押しで温度、2回押しでタイマー、3回押しでメトロノーム)、Sw2はスタート/ストップ(トグル)、Sw3は値を変更するパラメータの切り替え(トグル)、ボリュームは値の変更(右に回すと+、左に回すと-)。





温度・湿度は10秒ごとに測定し、上の行に温度、下の行に湿度をどちらも小数点付きで表示する。





タイマーは99分59秒まで設定でき、上の行に分、下の行に秒を表示する。値の変更はSw3を押すと選ばれた方の行の先頭にカーソルが表示される。Sw2を押すとスタートし、時間が来ると「ピピピッ・ピピピッ」と音で知らせる。





メトロノームはテンポ(60~250bpm)とコーラス数(1~32)を設定でき、上の行にテンポ、下の行にコーラス・小節が表示される。Sw2を押すとスタートし、まずイントロ1小節分「キッコッコッコー」と音が鳴り、続いて1小節目から「キッコッコッコッ」と繰り返し、4小節ごとに「キッコッコッコー」と4拍めが長く鳴る。設定したコーラス数が終わると動作が終了する。