蓄光テープに文字を描くライントレーサですが、マイコンの内部ではいろいろな処理を行っています。
- LANのためのシリアル送受信
- モータ2個のPWM処理
- ライントレース処理
今回は、どのようにしてこれらの処理を行ったかを解説します。ぜひマイコンで制御を行う際の参考にしてください。
LANのためのシリアル送受信
まず重要な点ですが、今回はシリアル送受信をソフトウェアでおこないました。PICには内蔵シリアルもあるのですが、使えるピンが固定されています。今回は8bit連続で取りたかったので、シリアルをソフトウェアで処理するようにしました。
ソフトウェアで処理する場合、ビットレートの3倍、たとえば9600bpsなら28800bpsで、約35μsごとにタイマ処理をおこないます。この中で、スタートビットを検出してから4クロック後をビット0、7クロック後をビット1というように読み込みます。すると、他の処理を行いながらシリアルを受信することができます。
ここで注意しないといけないのが、マイコンのクロック数です。今回は20MHzを使ったので、1命令を0.2μsで実行できます。シリアル受信は35μs間隔ですから、この中で約175命令を実行できます。今回のコードでは、シリアル受信部分がcall/returnを含めて20クロック弱ですから、タイマ処理ごとにあと150クロックほど余裕があることになります。
モータのPWM制御
その空きクロックを使って、モータのPWM制御を行ってしまいます。PWM制御というのは、スイッチのオン・オフをすばやく切り替え、アナログ的な出力を得る方法です。今回は35μsのタイマ処理で、256のカウントをおこないます。カウントと設定値を足してオーバーフローしたら、スイッチを入れます。これにより、0だとオフ、255だとオン、それ以外ではその中間という出力が得られます。
なお、今回はステッピングモータを使用しましたので、n相とn+1相の比率をPWMで切り替えています。PWMの周波数は、28800bpsの1/256で、約110Hzになります。
次に、PWMのカウンタがラウンドしたところで、速度をステップ位置に加算します。これで、指定した速度でステッピングモータの相が進み、モータが回転するという仕組みです。モータの速度はライントレーサのセンサによって決めています。この処理は、もっと外側で行っています。
HTTPリクエストの生成
いちばん外側の処理は、サーバにリクエストを出してそのレスポンスを解析し、LEDを制御するという繰り返しです。LANモジュールには接続先のIPアドレスがセットしてあり、シリアルで文字を送ると、目的のサーバに自動的に接続します。ここに「GET / HTTP/1.0」のような文字列を入れておくことで、サーバにHTTPリクエストが送信されます。
サーバはHTTPリクエストを受け取ると、レスポンスを返します。マイコン側ではこれを受信してメモリに格納しておきます。そのあと、受信したデータを順次LEDに出力していきます。出力がおわったら、次の文字のHTTPリクエストを送信します。今回は内側のステッピングモータの回転に合わせてLED出力を変えるようにしました。これにより、蓄光テープを見失って180°回転しているところでは文字の描画がストップします。
全体としては、まずシリアルにリクエストを出力する処理の中で、シリアルの35μsタイミング待ちが発生します。ここでPWM処理が定期的に呼ばれます。そのあと、シリアルの受信待ちがありますが、ここでもタイミング待ちが定期的に呼ばれます。このように、何をやるにしてもループの中でシリアルのタイミング待ちを呼ぶことで、シリアル受信やPWM処理を途切れさせないようになっています。ちなみにシリアル受信は、シリアルの35μsタイミング待ちを30回呼び出して1文字受信ですから、受信した文字を毎回チェックする必要はありません。
おわりに
というわけで、ソースをざっと追ってみましたが、いかがでしたでしょうか。割り込みベースの処理に慣れている方だと、見なれないやり方で不思議に思われたかも知れません。クロック数を正確に読めるアセンブラならではのやり方として、心に留めていただければと思います。
最後までおつき合いいただき、ありがとうございました。
今回のプログラムソース全体はこちらからダウンロードできます。