ITRONでマイクロマウス ある先生から要望があり,ITRONでマイクロマウスを動かしてくれ, とのことでやってみることにしました. まったく素人なので,探したらよさそうな本が2冊が見つかり,早速購入して読んでみました. 図解μITRONによる組込みシステム入門 本の通りに試してみようと思ったら本で紹介されているリアルタイムOS smalightは有償でした. 教育用途ということで問い合わせ,学校価格で購入しました. もう一冊は, ITRONとプログラミング入門 紹介されているHOSは無償なので早速ダウンロード,本やWebで調べながらサンプルを動かしたら すんなり動いたので,HOSを使ってマイクロマウスを動かしてみることにしました. あれこれ試したメモ書きはこちら. −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 目的は,ITRONで動かすことで完走や入賞することではないので,教材用に必要最小限の機能に 絞ることにしました. 特に,プログラムの不慣れな学生に何ページにもわたるソースを見せるとそれだけで思考停止 してしまうので,短いことには意味があります. まず,以前に作ったマウスのソースコード約350行,コメント約100行まで削りました. −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− バージョン1完成. まずは最小限の書き換えでITRONにのせて,なんとなく動き始めました. 現時点のプログラムでも,パラメータを調整すれば最低限は走りそうです. 1)左右モータを別々のタスクとして作成 無限ループ中で励磁パターンを進めて回転させ,ディレイ時間を壁との距離などに応じて変化 させることで左右の回転速度を独立に制御した. 2)センサは周期ハンドラで起動 前を読み取って25msのディレイ,左右を読み取って終わり,を50ms周期で起動させた. 3)上記より低い優先度でこれまでのメインプログラムをスイッチ入力タスクとした. 1)2)はそれぞれディレイが入るのでその間に3)を監視しにいき,スイッチ入力 があれば各種処理ルーチンに飛んで終わったら帰ってくる. 今のところITRON(HOS)を使わない場合とそう大きく変わらないですが, これまでTimerAのタイマー割込みの中に更にカウンタを仕込んでモータやセンサのタイミングを 処理していたのと比べると,処理が分離された分は分かりやすいかもしれません. ITRONの学習を兼ねるため,ほかの機能をもう少し織り交ぜて改変してみます. タスクに分けだだけのプログラム,micromouse.c そのヘッダー micromouse.h と system.cfg の圧縮.uITRON_micromouse_v1.zip −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− バージョン2改変 ITRONの他の機能を使うため,フラグを使ってタスク間で壁情報の通信をするプログラムを 作成しました.本には載ってなかったref_flgを使って壁の有無を他のタスクから参照する ことにして,仕様書とソースを見ながらやっとやり取りを確認して,実装. まず, センサの値をフラグ化した.突き詰めるとセンサの値は, 左右壁との距離を一定に保つためにスピード調整する以外には, 壁の有無とか,基準距離にあるかどうかが分かればいい. 次に, モータのモード(フリー・前進・バック・ブレーキ)をフラグ化した. 指定距離進んだかどうかのフラグを立てることで, モータのカウント数を直接参照することなくタスク間の連携. という観点からフラグを使って最小限の情報のやり取りでタスク間の連携をしました. フラグの定義 FID_SENSOR 0: 前壁の有無,なし(0)/あり(1) 1: 前壁の距離,遠い(0)/近い(1) 2: 左右前センサ値の大小関係,右が大きい(1)/左が大きい(0) 3: 左右前センサの差の許容値,差が大きい(0)/許容差内(1) 4: 右壁の有無,なし(0)/あり(1) 5: 右壁の距離,遠い(0)/近い(1) 6: 左壁の有無,なし(0)/あり(1) 7: 左壁の距離,遠い(0)/近い(1) 8: センサ値のLED表示,しない(0)/する(1) FID_MOTOR 0,1: 動作モード,フリー(0)/前進(1)/後退(2)/ブレーキ(3) 2: 未使用 3: 速度切り替え,低速(0)/高速(1) 4,5: 動作モード,フリー(0)/前進(1)/後退(2)/ブレーキ(3) 6: 未使用 7: 速度切り替え,低速(0)/高速(1) 8: 直進モード,低速走行で壁との距離調整なし(0)/高速走行で壁との距離調整あり(1) 9: 走行距離フラグ,90度ターンの歩数進んだらフラグセット 10: 走行距離フラグ,1区画の歩数進んだらフラグセット 11: カウント開始フラグ,カウンタリセット・カウント開始(0)/カウント中(1) ここまでのソースをアップします(まだバグあるかもしれません) micromouse.c そのヘッダー,micromouse.h と,system.cfg の圧縮.uITRON_micromouse_v2.zip −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− せっかく作ったのに自分で中身を忘れてしまわないように,というより忘れてしまっても 思い出せるようにまとめました.語句の使い方など適当な部分がありますが, おいおい直すと言うことでご容赦ください.誤りのご指摘は大歓迎です. リアルタイムOSでマイクロマウスを動かしてみよう −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 参考書↓
ITRONとプログラミング入門
図解μITRONによる組込みシステム入門