---------------------------------------------------------------------- ・日付:2009/09/30 初版作成(v1.0) ・記述者:吉村悠 ・内容:Interface誌の記事用ライン・トレース・カーの仕様説明 ・対象マイコンボード: Interface誌2006年6月号SH2基板(SH7144F) Interface誌2009年6月号ARM基板(LPC2388) ・対象回路:CQBB-LTR ---------------------------------------------------------------------- ◆目次 1.目標 2.HW要件 3.コース 4.プログラム・アーキテクチャ 4.1 プログラムの分離 4.2 プログラム全体での制御方式 5 デバイスドライバ 5.1 対象マイコン 5.2 開発環境 5.3 デバイスドライバの分離 5.4 LEDデバイスドライバ (dev_led) 5.5 ラインセンサデバイスドライバ (dev_ls) 5.6 モータデバイスドライバ (dev_mtr) 5.6.1 モータの動作方法 5.6.2 SH7144FによるPWM制御 5.7 タイマーデバイスドライバ (dev_tm) 5.8 CPUやメモリ (dev_cpu) 6 アプリケーションプログラム 6.1 初期化 (main関数) 6.2 周期的な演算制御 7 動作結果 ---------------------------------------------------------------------- ◆本文 1.目標 ・オーバル上の簡単なコースをライントレースする ・マイコンや開発環境が異なってもアプリケーションに変更がいらない再利用性 ・A/D変換による障害物の検知と動作(未実装) 2.HW要件 ・ライントレースカーとしてESP企画さんのライントレース・ベースボード・キット CQBB-LTRを用いる ・マイコンはInterface誌2006年6月号SH2基板(SH7144F)と Interface誌2009年6月号ARM基板(LPC2388)の両方に対応する ・CQBB-LTRとモータの接続は左モータがMTR1コネクタに,右モータがMTR2コネクタで接続 ・ボールキャスターやラインセンサの位置,ラインセンサの閾値,機体の重心等の調整は 使用者が行う ・SH2基板の外付けSRAMはCQ-BBLTRを使う場合は使用できない. 3.コース ・材料に下地となる黒色のプラスチック段ボールとラインとなる38mmの白色のビニールテープを用いる. どちらもホームセンターにて容易に調達が可能である. ・ラインは楕円状の簡単なものとする.曲率は半径20cm以上を想定している 4.プログラム・アーキテクチャ ライントレースプログラムの構造を述べる. 4.1 プログラムの分離 ・2つの異なる種類のマイコンと開発環境で同じアプリケーションで同様に動くようにするため, プログラムを「アプリケーションプログラム」と「デバイスドライバ」に分ける. ・アプリケーションプログラムでは,デバイスドライバの初期化とライントレース動作の 制御ロジックを行う. ・デバイスドライバはマイコンの周辺機能の初期化や制御,CQBB-LTRの各デバイスの初期化と制御 を行う. ・アプリケーションプログラムはデバイスドライバのAPIを通じて,デバイスを使用する. そのため,APIレベルでマイコンの違いと開発環境の違いを吸収できる必要がある. 4.2 プログラム全体での制御方式 ・ライントレースカーはセンサー,コントローラ,アクチュエータを持つ基本的なマシンであり, 周期的にセンサの値を読み,コントローラで計算し,アクチュエータで動作変更する必要がある. そのため,ライントレース制御は周期的なタイマ割り込みによって行い,初期化はプログラムの 最初に行う. 5 デバイスドライバ ・対象マイコンと開発環境について,対象とするデバイスとその分離についても説明する. 5.1 対象マイコン ・Interface誌2006年6月号SH2基板(SH7144F)のリピート基板を用いる. ・付録基板とリピート基板の違いはTechI[1]にまとめられている.ライントレースプログラムで 影響があるのは外付けSRAMが実装されている点である. ・動作周波数は 48MHzであり,周辺回路には 24MHz が供給される. 5.2 開発環境 ・C/C++ compiler package for SuperH RISC engine family V.9.03 Release 00 (Evaluation Version) ・FDT V.4.03 Release 02 ・開発環境の構築方法はTechI[1]を参照.ただし,TechIのバージョンでは古く,HEWのプロジェクトは 開発元のバージョンより低いと開けないことに注意する. 5.3 デバイスドライバの分離 ・マイコンから見て入出力が独立とマイコンの内部ブロックごとにデバイスドライバを作成する ・具体的なデバイスは以下の通り デバイス名 入出力 内部ブロック デバイスドライバのファイル名  ・LED 出力 なし dev_led  ・ラインセンサ 入力 なし dev_ls  ・モータ 出力 MTU dev_mtr  ・タイマー なし CMT dev_tm  ・メモリとCPU 出力 なし dev_cpu ・デバイスドライバAPIがdev_xxx.h である.APIはマイコンや開発環境に依存しない. ・APIの実装がdev_xxx.cファイルである. 5.4 LEDデバイスドライバ (dev_led) ・LEDは付録基板上に1つ,CQ-BBLTRに4つある ・対応する端子から汎用出力でHighを出力すると点灯し,Lowで消灯する ・APIは dev_led.h を参照 5.5 ラインセンサデバイスドライバ (dev_ls) ・ラインセンサはCQ-BBLTRの前方に3つならんで付いている ・個々のラインセンサがラインの上にあるかどうかを見る ・ラインセンサからの入力はCQBB-LTR上のコンパレータで比較され,汎用入力で値を見る ・APIは dev_ls.h を参照 5.6 モータデバイスドライバ (dev_mtr) ・APIは dev_mtr.h を参照 5.6.1 モータの動作方法 ・CQ-BBLTRには2個のDCモータで動作し,モータドライバ「μPD16805」にて駆動させている ・μPD16805のマニュアルを見ると以下のファンクション動作表を持つ. 入力信号 機能 IN1 IN2 INC STB H H H H ブレーキモード H L H H 正転モード L H H H 逆転モード L L H H 停止モード x x L H 停止モード x x x L スタンバイモード ※ H=High, L=Low, x=don't care を表す ※CQ-BBLTRのSTB端子はHigh固定なのでスタンバイモードにならない  ・IN1とIN2に接続されている端子を汎用出力にすることで,モータの停止,正転,逆転,ブレーキ   の制御をすることができる  ・INCにHighとLowを細かく入れることで,速度を調節することができる.これをPWM制御と呼ぶ.  ・Highの時間の割合が大きいほど速度を早くすることができ,逆にLowの時間の割合が大きいほど,   速度は遅くなる  ・PWMに関してはInterface誌2009年10月号「付属ARMマイコン基板を利用してPWM機能を理解する」   が詳しい 5.6.2 SH7144FによるPWM制御 ・SH7144FでPWMを発信するにはマルチファンクションタイマパルスユニット(MTU)を使用  ・MTUでは最大16本のパルス入出力が可能  ・相補PWMやリセットPWMなど多彩なPWMモードを持つ ・CQBB-LTRとSH2基板の接続されている端子の制約により,リセット同期PWMモードを使用  ・TIOC4AとTIOC4B端子からそれぞれ左右のモータドライバへPWMを送信 ・SH7144Fハードウェアマニュアル[2]のP284リセット同期PWMモードの設定手順例を元に プログラムを作成  ・MTUはリセット時にモジュールスタンバイモードで動作していないので,解除する必要がある.  ・詳細なプログラム説明は別にて ・リセット同期PWMモードではデューティ比100%を設定できないので,デューティ比90%で代用し, 上限を90%に抑えてある 5.7 タイマーデバイスドライバ (dev_tm) ・コンペアマッチタイマ(CMT)のチャンネル0(CMT0)を使い20ms周期のタイマ割り込みを起こす ・CMT0の割り込み優先度は12  ・SH7144Fでは割り込み優先度が16レベル設定可 ・CMTはリセット時にモジュールスタンバイモードで動作していなので,解除する必要がある. ・CPUの割り込み禁止状態を解除する ・APIは dev_tm.h を参照 5.8 CPUやメモリ (dev_cpu) ・外部SRAMを常にスタンバイにしておく  ・外部SRAMが動作しているとDポートの端子がハイインピーダンスになることがある  →LEDやモータが正常に動かない ・APIは dev_cpu.h を参照 6 アプリケーションプログラム ・アプリケーションプログラム名を cq_bbltc.c とする 6.1 初期化 (main関数) ・スタートアップルーチンからmain関数へ分岐する ・main関数にて各デバイスを初期化する.初期化の順番は特に問わない ・初期化終了後にタイマーをスタートさせて周期的に割り込みを発生させる. ・初期化終了後は nop 命令を繰り返す 6.2 周期的な演算制御 ・void timer_interrupt(void) がタイマ割り込みである.ベクターからこの関数へ飛ぶように 設定しておく必要がある. ・ライントレースカーにはラインセンサは3つあり,中央のラインセンサのみがライン上に いる状態をライントレースできている状態とする. ・ラインが曲がったりして機体がラインからそれたら,中央以外のラインセンサが反応するので, 中央のラインセンサのみが反応するように機体をラインに対して傾ける.  ・例えば,中央と右のラインセンサが反応していたら,機体はラインに対して右に傾いているので,   左のモータの回転を遅くして,機体を左に傾ければ機体がラインに対してまっすぐになることが   期待できる.  ・右のラインセンサしか反応してない場合は,機体はラインに対して右に大きく傾いているので   左のモータを停止させて,大きく機体を左に傾けると機体がラインに対してまっすぐになることが   期待できる. ・機体がラインのカーブを曲がりきれずにはみ出してしまった場合は,ラインセンサは1つも反応しない. そのため,ラインセンサが一つも反応しない場合は,最後に前のラインセンサが反応した状態を覚えておき, その値を利用する.  ・右カーブがきつすぎた場合は,ライントレースカーはラインの左側におり,ラインセンサは右のみが  反応したのが最後である.そのため,右に機体を傾き続ければまたラインに復帰することが期待できる. 7 動作結果 ・半径35cmほどの円上のコースを用意して,SH2基板とARM基板の両方を走行 ・アプリケーション cq_bbltc.c とデバイスドライバAPI dev_xxx.h は両方のマイコンともに 同じものを使用 ・(見た感じでは)同じ速度でライントレース動作 ・2つのマイコンの消費電力が異なるためか,ラインセンサの白と黒の閾値が異なっていた. ** 参考文献 [1] インターフェース編集部 編,''SH‐2マイコンで学ぶ組み込み開発入門,'' TECH I voi.41, インターフェース増刊,2009-03. [2] RJJ09B0026-0400 SH7144,SH7145グループ ハードウェアマニュアル, Rev.4.00, 2008-03-27.