鍬形です。HM-StarterKitでマイクロマウスを始めようの連載Part 11です。前回はSPI通信とエンコーダについてご紹介しました。今回は迷路走行サンプルプログラムの操作方法とセンサパラメータの調整手順についてご紹介します。プログラムの詳細な解説は割愛しますが、説明と対応するコードのリンクを貼りました。実装方法に興味のある方は是非コードと見比べながらご覧ください。
プログラムの書き込みと動作
step7_mazeをビルドしてマイコンに書き込みます。HM-StarterKit/Sample_software/step7_mazeにあるプロジェクトファイルHM_StarterKit.mtpjをCS+で開いてビルド、書き込みを行います。ビルドと書き込み方法はPart 2に解説があるのでご覧ください。
書き込み基板をRUNモードに切り替えてからリセットスイッチを押して、ブザーがピピッと鳴れば正常に書き込みができています。

各自思い思いのピピッを想像してみてください
バッテリー電圧降下時のブザー音
step7_mazeではinterrupt.cにてバッテリー電圧をチェックしており、3.5Vを下回るとピーとブザーが鳴り続けるようになっています。ブザーが鳴った際はバッテリーを充電してください。バッテリーの取り扱いについて詳しくはPart 2をご覧ください。
迷路走行サンプルプログラムの操作方法
step7_mazeの操作方法をご紹介します。本記事の解説内容はマニュアルの「マイクロマウス HM StarterKit パート3 『取扱説明書』 ソフトウェア解説編」 P18、マイクロマウス HM StarterKit パート4『操作説明書』と対応しています。(※マニュアルの閲覧には製品に同梱されたパスワードが必要です)
モード選択
プログラムを実行するとモード選択ができる状態になります。モードは全部で15種類登録可能で前進方向にタイヤを回転させるとモードの番号がカウントアップ、後進方向に回転させるとカウントダウンされます。モードの変更はピッというブザー音でわかります。

画像右側が前進方向です
カウントアップ、カウントダウンの検知はHM_StarterKit.cで行っています。タイヤの回転速度がカウントの開始条件なので、タイヤを回してもカウントされない場合はもっと速く回してみてください。感覚的には機体を軽くフィールドに押し付けた状態でマッチを擦る程度のスピードでスッと1cmくらい動かすとよく反応します。
モードの番号は1~15まであり、LEDに2進数で表示されます。サンプルプログラムに登録されているモードは下記のとおりです。3~14は未設定なので速度などのパラメータが異なるモードを登録することができます。※マニュアルは内容が古いので紹介されているモードが少し異なります。
- 探索モード(足立法)
- 最短走行
- 調整モード

2進数なのでLEDの桁は右から1、2、4、8になります
それぞれのモードはHM_StarterKit.cに書かれています。先ほどのカウント処理によって変数modeにモード番号が代入されており、switch文で各モードに分岐します。例えばモード1のプログラムはcase: 1からcase: 2の手前までに書かれています。
選択したモードの実行
選択したモードを実行する場合は下の写真のように光センサに手をかざします。HM_StarterKit.cを見ると4つの光センサの値の合計がSEN_DECISION * 4以上になったときに各モードのプログラムが実行されるようになっていることがわかります。
今回はセンサパラメータの調整を行うためモード15を選択してください。モード15は2進数だと0b1111なので上の写真のようにLEDがすべて点灯した状態になります。モード1から15までカウントアップしていくとタイヤを回すのが大変ですがカウントダウンすればすぐ調整モードに切り替わります。
センサパラメータの調整
さきほどのモード選択で調整モードを実行すると、一番左のLED(D6)が素早く点滅します。この点滅処理はadjust.cに書かれておりループが回るたびに点灯と消灯を切り替えていることがわかります。
調整モードも先ほどと同様に複数選択でき、adjust.cに書かれているように1~7までモードを登録することができます。今回はそのまま調整モード1を選択した状態で手をかざして実行します。
調整モード1を実行してPCとロボットを接続するとシリアル通信によって各センサの値を見ることができます。この値を見ながらセンサパラメータを調整します。下記に続く調整を行う場合は接続したままお読みください。シリアル通信の詳しい接続手順についてはPart 2をご覧ください。
姿勢制御目標値の設定
HM-StarterKitは迷路内のコース中央をまっすぐ走行するために、機体と左右の壁の距離に応じてタイヤの回転速度を変化させることで姿勢制御をしています。機体と壁の距離は左右方向に取り付けられた光センサによって計測しているので、機体がコース中央を走行しているときのセンサ値を制御の目標値として設定します。姿勢制御はサンプルプログラムのinterrupt.cで行っています。
姿勢制御目標値はparameters.hのREF_SEN_R、REF_SEN_Lとして定義されています。REF_SEN_Rが右壁用、REF_SEN_Lが左壁用の姿勢制御目標値です。コース中央に機体を置き、シリアル通信で送られてきたセンサ値sen_r.value、sen_l.valueの数値をREF_SEN_R、REF_SEN_Lにそれぞれ入力してください。
例えば僕の機体の場合
sen_r.value: 1294 sen_l.value: 775
と表示されていたので
#define REF_SEN_R 1294 #define REF_SEN_L 775
のように書き換えました。
ちなみに変数名に用いられているREFはreferenceの略でプログラムにおいてよく用いられる略称です。
左右壁検知閾値の設定
迷路を解くためには走るだけでなく周囲の壁の有無を知る必要があります。左右の壁の有無は姿勢制御と同様に左右方向の光センサで検知しています。機体と壁がある一定の距離以上離れたときに壁がないと判定するプログラムになります。左右壁検知はinterrupt.cで行っています。
左右壁の有無を決める閾値(しきいち)はparameters.hのTH_SEN_R、TH_SEN_Lとして定義されています。TH_SEN_Rが右壁用、TH_SEN_Lが左壁用の壁検知閾値です。sen_r.value、sen_l.valueの値がそれぞれの閾値を下回った時に壁がないと判定されます。
機体の左右に壁があるとき最も機体と壁が離れる状態は機体がコースの端にいるときです。これ以上壁が離れたときに壁がないと判定させることにします。
コースの左端に機体を置いたときのsen_r.valueの値をTH_SEN_R に入力します。
次に右端に置いたときのsen_l.valueの値をTH_SEN_L に入力します。
ちなみに変数名に用いられているTHはthresholdの略でこちらも同様によく用いられる略称です。
前壁検知閾値の設定
コースの先が行き止まりかどうか知るために前方の壁の有無を検知する必要があります。こちらは前方向の光センサを用いて機体前方の1区画分以内に壁があるかどうか判定するプログラムになります。前壁検知もinterrupt.cで行っています。
前壁の有無を決める閾値はparameters.hのTH_SEN_FR、TH_SEN_FLとして定義されています。機体の姿勢によっては1つの光センサで検知することが難しい場面があるので2つあります。sen_fr.value、sen_fl.valueの値がそれぞれの閾値を上回った時に前壁があると判定されます。
前壁から1つ手前の柱とブザーICが並ぶくらいの距離に機体を置き、そのときのsen_fr.value、sen_fl.valueをそれぞれ入力します。
まとめ
以上で迷路走行サンプルプログラムの操作方法とセンサパラメータの調整方法をご紹介しました。走行させるとロボットの具体的な挙動もわかると思うので、是非動かしながら今回扱ったコードに目を通してみてください。次回はいよいよロボットを走行させるのでお楽しみに!
HM-StarterKitキャンペーン価格のお知らせ
手のひらサイズのマイクロマウスキット「HM-StarterKit」
33%OFFの特別価格で販売中!
製品ページはこちら

アールティロボットショップで購入する
また、6月10日(木)からは学生マイクロマウスサークルを対象としたプレゼントキャンペーンを開催予定です!詳細をお楽しみに!