マイクロマウス2001レポート草稿 2001.12.4

マイクロマウスの開発研究
〜マイクロマウス2001に出場して〜

情報工学科 r00h0390 不死川魔沙王

1.本研究の目的

 本研究の目的は、マイコン応用システムを利用した自立ロボット「マイクロマウス」の製作を通して、電気・電子・論理回路、マイクロコンピュータといったものへの理解を深め、電子工作およびアセンブラ言語プログラミング技能の向上を図ることである。
 研究題材としてマイクロマウスを選んだ理由は、

○ コンピュータ・センサ・アクチュエータの諸部分の総合であり、メカトロニクス技術の基礎を体系的に学ぶことができる。
○ 全国に初心者からベテランまでの愛好家が数多くおり、入門しやすい。また、ハードウエア・ソフトウエアともに適度に難解で奥が深い。
○ 競技化されており、はっきりした目標にむけて努力することができる。

というものである。
今回は、昨年度大会の反省を元にして新しく機体を製作し、横浜で行われる全国大会「マイクロマウス2001」フレッシュマンクラスの試合に出場・完走することを目標とした。その結果4分5秒456で完走することに成功した。

2.マイクロマウス2001とは

 マイクロマウスとは、マイコン応用システムを利用して迷路探索・走行を行う自立型ロボットのことである。16×16のます目の中央をゴールとし、スピードを競う競技としてニューテクノロジー振興財団マイクロマウス委員会により全国大会が開かれている。2001年度は11月22日・23日にパシフィコ横浜「マイクロマウス2001」が開かれた。

3.マシンデータ

研究場所 制御通信部部室(洛北校F教室裏)
作成者 不死川魔沙王
車体作成手伝い 桑原翔
マシン名 肉弾人生(にくだんじんせい)
命名の由来 宮谷一彦の劇画「肉弾人生」より命名。ジャイアント馬場のように細やかに動いてほしいという願いを込めて。
車体 アルミボディを使用、部分的にガラスエポキシ板を使用。マイクロマウス委員会東日本支部標準部品を利用した。
車輪 車輪にはアルミ製ホイールを使った。上に両面テープで粘性の高いゴムシート(田宮RDタイヤキャップラバー(ソフト)OP-184)を貼り付けた。
CPU Z80(AKI80ゴールド)を使用。CPU・センサ・モータの制御回路はすべて一枚の基板に収めた。I/Oポートの拡張に8255を使わなかった。
アクチュエータ ステッピングモータ2つ(SANYO103-540-36)
センサ 壁上面検出タイプ、フォトリフレクタ10個(オムロンEE-SY121。前2つ、左右各4つ)
電源  ニッケル水素電池単3型1.2V、1700mAh(GP社170AAHC)12本(14.4ボルト)、3端子レギュレータで降圧。
プログラム開発の方法 Z80アセンブラによる。DOS/V機上のエディタ(SE3を使用)でコーディングを行い、アセンブルとリンクを行った。AKI80へのHEXファイルの転送にはRS232Cケーブルの一端をステレオジャックに付け替えたものを用いた。

5.開発の方針

マイクロマウス2000での反省から、次のような作成方針を立てた。

 1.方針
  重量を現在より1キロ減らすことを目標とする。
 2.方式
  壁上面検出タイプ(フォトリフレクタ使用)ウイング形式は前方先読み型
  センサ配置は前二つ+左右各7つずつとする。(→左右4つずつに変更・・・2001/11/4)
  AKI80ゴールドを使用
  ステッピングモータ2つを使用
 3.方法
  アルミ使用率低減(本体裏板をプラスチックに変える。本体上板を蜂の巣状の板に変える・・・他)
  できるだけ締結でなく接着をおこなう
  電池はニッケル水素(またはニッカド)単4型を用いる(→結局単3に変更・・・2001/11/4)
  ボールキャスタではなくカグスベールを用いる
  センサ回路とモータ回路を一枚の基板におさめる
  CPU回路を小さい基板におさめる(8255を使わない)
  信号線のコネクタは片方だけに付ける
  電線を全体にできるだけ短くする
 4.必要な技術
  タイヤ製作のため、旋盤加工の技術(→結局タイヤは既存の物を用いた)
  8255に替わる技術
  本体製作のための機械工作技術

6.設計図

車体

ホイール

車体側面板

車体裏板

センサ

電池

CPUボード・電池を除く全体図

全体図

回路図

CPU回路(GIF画像) →11/7変更

モータードライブ回路(GIF画像) →11/7変更

センサ回路(GIF画像)

7.CPU

AKI80

AKI80

秋月電子通商が販売している「AKI80」は、東芝製8ビットCPU「TMP-Z84C015」を搭載したワンボードマイコンのキットである。TMP-Z84C015は、Z80シリーズのCPU,PIO,SIO,CTC,CGC,ウォッチドッグ&レジスタをワンチップに収めたICであり、Z80アセンブラプログラムを実行させることができる。安価で、小さくまとまっているので今回制御用に採用した。



TMP-Z84C015ブロック図

TMP-Z84C015ブロック図

● PIO(Parallel Input Output) :パラレルデータの入出力(I/O)用のIC。TMP-Z84C015は、二つの独立したPIOを持つ。
● SIO(Serial Input Output) :シリアルデータの入出力を制御する。
● CTC(Counter Timer Circuit) :タイマー機能。頻度の高い処理をCTCに実行させ、CPUの負担を軽くして処理効率を良くする。
● CGC(Clock Generator Circuit) :クロック発生回路。マイクロプロセッサの動作クロックを作る。
● ウォッチドッグ&レジスタ :暴走を検出して正常に戻すための回路。
今回はPIOでモータの回転制御・センサ入力、SIOでPCからのプログラム転送を行った。CTCはモータ回転のために使用した。

PIO

センサの数が多いため、通常ならばIOポート増設のため8255のような専用の素子を用いるが、場所を取るので別の方法をとった。

PA7〜PA2:出力、PA1,0:入力

意味
PA7:左モータ回転向き(0前進、1後退)
PA6:左モータにパルス出力
PA5:右モータ回転向き(0後退、1前進)
PA4:右モータにパルス出力
PA3,2:モニタ用LED(1でつく)
PA1,0:入力スイッチ(押したとき1)

PB7〜PB0:入力

意味
横センサ入力(反応があったとき0、なかったとき1)。センサの配置は以下のとおり。(上から見たとき)

PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7

SIO

 PC・マイコン間のシリアル通信にSIOを用いている。

CTC

 モータ回転にCTC割り込みを使用した。CTCはある数字を指定するとその数を自動的に数え、数え終わると割り込み信号をパルス生する素子である。割り込み信号がパルス生するとモータ回路に1つパルスが送り込まれる。すると、モータが1パルス分(1/200周)回転する。つまり、CTCが数える数字を少なくするとモータの回転速度はあがり、多くするとさがることになる。
 一つのCTCで単純に数を数えさせるとモータ回転には早すぎるため、CTC0カウンタでパルス生した割り込み信号をつぎのCTCのトリガとして使用し、スピードを落とした。また、左右で別々のCTCを使用し、左右のモータがばらばらに動作できるようにした。

CTC0出力→CTC1、CTC3入力
CTC1からの割り込み→左モータにパルス出力
CTC3からの割り込み→右モータにパルス出力

AKI80では割り込み信号の処理を内部で行ってくれるので、自分で結線する必要がない。

CTCを用いたモータ回転のプログラム例

定速回転プログラム 2001/11/9

アセンブラの都合により絶対アドレスの指定(ORG 8000H等)ができないので違う書き方になっている。

8.アクチュエータ

アクチュエータとして、ステッピングモータを使用した。
ステッピングモータはパルス入力によって1ステップずつ決まった角度だけ回転するモータである。DCモータは電気を流せば回転するが、細かな制御を行うためにはロータリエンコーダで速度を測るなど、複雑な手順が必要となる。しかし、ステッピングモータは1パルスごとに進む距離が決まっているため位置の計算がたやすい。また、パルスの周波数に比例したスピードがでるため、加減速のプログラミングが容易である。

今回はユニポーラ型4相VR型のモータ、回路は山洋ステッピングモータ用ユニバーサルコントローラPMM8713を使用し、2相励磁方式で回転させた。パルス発生には、CTC割り込みを用いた。モータ駆動用ICとして、定電流チョッパ駆動ICSLA7032Mを用いた。


ステッピングモータ回転のしくみ

(概念図)
ステッピングモータは、界磁が回転するように次々に励磁することによって、永久磁石でできたロータを回転させるものである。2相励磁方式では、常に二つのコイルが励磁させる方法であり、1相励磁方式に比べて安定した回転をさせることができる。
4つのコイルに対して与えるパルスのタイミングチャートは以下のとおりである。

パルスタイミングチャート


 これらのパルス列はソフトウエア的にも発生させることができるが、今回は使い慣れている素子8713を用いてハードウエア的にパルスを発生させた。8713は、クロックパルスが入力されると自動的に4つのパルス列を生成するICである。

9.センサ

マイクロマウスは迷路を走るため、前と左右の壁を検知する必要がある。壁検知の方法としては、一般に光反射式センサ(フォトリフレクタ、反射式フォトインタラプタ)が用いられる。

フォトリフレクタが壁を検出する方法

フォトリフレクタは発光ダイオードとフォトトランジスタが一つの素子に組み合わされたものである。発光ダイオードが赤外線を発射し、反射光をフォトトランジスタが検出することにより、物体の存在を検知する。


(左より順番にK(カソード)・A(アノード)・C(コレクタ)・E(エミッタ))


フォトリフレクタ配置のパターン

壁の認識方法としては、
1. 壁の上面を検出する方法
2. 壁の側面を検出する方法
の2通りがある。

2の方式が近年の流行だが、距離を測るためにA/Dコンバータが必要となるなどして難しいため、単純に壁の「ある・ない」を判断するだけで済む1の方式をとった。1の方式だとセンサの基板がウイング状に広がるため、重心から離れたところに重いものが配置されることになる。それにくらべ、2の方式のほうが車体がコンパクトになる。今回は小型で安価なセンサを用い、基板もプラスチックの一枚板で作ることによりできるだけ重心の偏りが生じないように心がけた。

 

10.ソフトウエア

プログラムはZ80アセンブラによった。

●マイクロマウスの動作

マイクロマウスの基本動作は次に挙げるものである。

1区画走行・90度右回転・90度左回転・180度回転

1区画走行はさらに加速・定速度運転・減速・一時停止に分けられる。

さらに、応用動作として次のものがある。

左右位置補正・迷路壁データ記憶・最短経路計算

後になるほど抽象度の高い動作となるが、これを実現するには基本動作を正確に行える必要がある。

●必要パルス数の計算

車輪直径:50mm
車輪周:157mm(200パルスで一周)
∴1パルス移動距離 = 50*3.14/200 = 0.785mm

********** 直進

区画中心〜区画中心:180mm(229パルス)
車輪間隔(端から端):112mm
車輪間隔(中心線〜中心線):102mm
車輪幅:10mm
前センサから車体中央(両輪の中心):115mm
→つまり、前センサが両方ついて25mm(32パルス)進むと区画中心の上に車体中心が来る。
横センサから車体中央:75mm
→つまり、横センサが全部ついたら15mm(19パルス)戻るとちょうどよくなる。
前センサから横センサ:40mm(51パルス)

********** 回転(旋回)

回転直径:90mm
回転周:282.6mm
1/4回転周:70.65mm(90パルス)
1/2回転周:141.3mm(180パルス)

********** 加減速

一区画前進時の割り振り
加速:40パルス
定速:157パルス
減速:32パルス

減速を32パルスにしているのは、前センサが反応して32パルス目に止まるとちょうどよくなることから、これにあわせたものである。

1/4回転時の割り振り
加速:40パルス
定速:18パルス
減速:32パルス

1/2回転時の割り振り
加速:40パルス
定速:108パルス
減速:32パルス

以上は理論的な値であり、実際の路面ではすべり・摩擦などにより状況が変わってくるため、実験に基づいて調整する。

●マイクロマウスのプログラム
台形加減速

台形加減速プログラム 2001/11/11

常に同じスピードで移動するより、加速・減速の動作を付け加えたほうが滑らかで高速な移動が可能となる。台形加減速とは、モータのスピードを縦軸、時間を横軸にとったときスピードの変化が台形(実際には台形の下に長方形を付け足したような形)となっている加減速の方法である。この他にも加減速の方法はあるが、ここでは容易な方法をとった。
ステッピングモータはパルスとパルスの時間間隔の長さによってスピードを調整するモータである。そのため、速さはパルス間時間間隔の逆数に比例する。この計算をいちいちCPUに行わせると負担が大きいので、あらかじめ他の場所で計算して作っておいたデータを列挙しておき、それを適宜参照させることにした。
一区間分走行したあとしばらく停止する。停止の方法は「割り込み禁止にする」か、あるいは「割り込み信号を出さないようにする」というものがある。前者の方法ではなぜか異常動作が起きるため、後者の方法をとった。具体的には、CTCがカウントする値を0にすると割り込み信号はパルス生しなくなる。

位置補正(旋回によるもの)

1区画前進するごとに小修正を行うプログラム 2001/11/12

1区画前進するごとに横センサから入力を行い、それに応じて2パルス分右/左に首を振って位置の補正を行う。一部本文と関係のないコードが混じっているが、なぜかこの部分を削除すると動作不能になる。

右手法

単純な右手法に従って迷路を走り回るプログラム 2001/11/13

 右手法とは、迷路を抜けるテクニックの一つである。普通の迷路は大きな目で見ればスタートとゴールを結ぶ一本道を折りたたんだものみなすことができる。そのため、常に右の壁を触りながら歩く(=右・前・左・後の順に優先順位をつけて壁のない方向に進みつづける)といつかゴールにたどり着くことができる。ただしマイクロマウスの迷路の場合壁が他の部分と切れている場所が存在するため、単純な右手法では壁でできた「島」に捕まってしまい無限ループに陥ることになる。そのため実際には「一旦来た場所を覚えておき、その場所にはできるだけ再び来ないようにする」などの処理を付け加える必要がある。ここでは単純な右手法によるプログラムを示す。
 進路修正部分が未完成のため、その部分はコメントアウトしてある。考え方は以下のとおりである。
・定速回転が157パルスに達したら減速に入る。
・定速回転時はつねに前センサを監視し、反応があったらすぐに減速に入る。
・一区画ごとの小修正時にWDATAに横壁データ入れる。
・WDATAの数字を見て次の行動を決定する。

◎WDATAの各ビットの意味
  00000001 右壁あり
  00000010 前壁あり
  00000100 左壁あり
 右壁なし :右90度回転
 右壁あり前壁なし :前進
 右壁あり前壁あり左壁なし:左90度回転
 右前左壁あり :180度回転

位置補正(スラロームによるもの)

単純な右手法にしたがってスラロームで小修正を行いつつ迷路を走り回るプログラム 2001/11/14

それに正面衝突時修正を付け加えたもの 2001/11/18

 これまでのプログラムでは左右同じスピードの回転しか行っていない。しかし、CTC割り込みを使用するメリットは、左右のモータ回転スピードをバラバラに調整し、滑らかな位置修正が容易ならしめるところにある。これはソフトタイマを利用したプログラムでは実現が難しい。
 定速運転中に常に横センサを監視し、その入力に基づいて左右のモータの回転速度を変えることにより位置修正を行う。修正の考え方は以下のとおりである。
 横センサ配置は左から PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 であるから、

 IN A,(SEN)
 CPL

 という動作を行ったときPBからの入力値およびすべき動作は以下のようになる。

左センサ 入力値 右センサ 入力値 意味 すべき動作
XOOX 6h XOOX 60h 中央 何もしない (CTC1←28、CTC3←28)
XOXX 2h  XOXX 20h すこし右 小修正 (CTC1←28、CTC3←29)
OOXX 3h OOXX 30h やや右 中修正 (CTC1←28、CTC3←30)
OXXX 1h OXXX 10h かなり右 大修正 (CTC1←28、CTC3←32)
XXXX 0 XXXX 0 はずれ 何もしない (CTC1←28、CTC3←28)
XXOX 4h XXOX 40h すこし左 小修正 (CTC1←29、CTC3←28)
XXOO 0Ch XXOO 0C0h やや左 中修正 (CTC1←30、CTC3←28)
XXXO 8h XXXO 80h かなり左 大修正 (CTC1←32、CTC3←28)


左右の壁がある場合・片方しかない場合・両方ない場合があるので、位置修正は以下のように行う。

1.右壁があったら、右壁センサで修正
2.右壁がなくて左壁があれば、左壁センサで修正
3.両方壁がなければ修正しない

正面衝突時前後位置補正

shusei.z80のアルゴリズムでは横壁情報は定速度運転の時にしか取らなかった。また、wdataに保管されている壁情報が1区画ごとにクリアされるので、加速途中に前の壁に正面衝突したときマウスは次にどのような動作をするべきかわからず、擱挫してしまうことになった。この問題の解決法の一つとして、正面衝突したときそこから迷路の中央位置にまで後退し、そこで横壁情報を改めてとり、つぎの動作を行わせるということをおこなった。

正面衝突検知の仕組みとしては「右内側のセンサと左内側のセンサが同時に反応したときは正面衝突したものとみなす」という考え方を用いた。この方法だとその他のぶつかり方をしたときの修正には対応できないが、実験の結果ぶつかるときは大体正面衝突であることがわかったので、これに限って追加することとした。

迷路探索

迷路探索には、右手法を使うことにした。

条件1:左右に壁があるときは直進する。
条件2:初めての分岐点にきたときは、右回転、直進、左回転、Uターンの順に優先順位をつける。
条件3:1回以上通過したことのある分岐点にきたときは通過回数の少ないほうへ進む。通過回数がすべて同じであった場合には条件2によって判断する。
条件4:袋小路はUターンする。

このもともとのWDATAは壁がある方向を示しているものであるが、マウスから見た相対的な方向を示しているだけである。
マウスの向きは場所によって異なるため、これでは条件2・3について調べられない。そのため、これを絶対方向に修正してやる必要がある。

11/21現在まだ成功していない。おそらくデータを覚えて参照する部分がうまく機能していないのだと思われる。

一応現在できているところをあげておく。kioku8.z80 実際の動作はかなりでたらめである。

11/22複雑な迷路になると不具合が発生するが、小さな迷路ならば単純な右手法ではいけないところまで回れるプログラムができあがった。kioku.z80

11/221区画通過するごとにその区画の「来た回数」をカウントするが、ただ1区画進むごとに区画データに1を足すだけでは十分ではない。180度回転する場合、その区画のカウントは2回行う必要がある。

->○-> 「回転なし」あるいは「90度回転」の時はカウントは1回で良い。

<->○ 180度回転するときは入るときと出るときの二回カウントしなければ不具合が起きる。

左右に壁があり、左から右に移動していって180度回転してもどる場合の「来た回数」

1→←2 1→←2 1→←2 1

このままだと180度回転して戻った時点で「前と後の壁がないが、後のほうが来た回数が少ない」ということになるため、マウスはこの場で往復することになる。

1→←2 1→←2 1→←2 2

180度回転のときは2回来たことにする、という規則にするとこの問題は解決する。

マイクロマウス2001の試合には結局このプログラムで参戦した。kioku_3.z80

試合では右に16ます、前に15ますいった時点で180度回転してしまったが、結局4分05秒456で完走には成功した。完走後もう一度同じプログラムを走らせて見たが結果は同じだった。まだどこかにバグがあるとみられる。

11.マイクロマウス2001の顛末
 2001年11月23日、マイクロマウス2001フレッシュマンクラスで出場。
 主な競技規則は次の通りである。


競技規則(抜粋)
1−1 マイクロマウスは自立型でなければならない。
1−2 マイクロマウスは、競技中に操作者により、ハードウェアおよびソフトウェアの追加、取りはずし、交換、変更を受けてはならない。
1−4 マイクロマウスは迷路の壁を飛び越し、よじのぼり、傷つけ、あるいは壊してはならない。
1−5 マイクロマウスの大きさは、その床面への投影が1辺25cmの正方形に収まらなければならない。走行中に形状が変化する場合も、常にこの制限を満たしていなければならない。ただし、高さの制限はない。
2−1 迷路の壁の側面は白、壁の上面は赤、床面は黒とする。
2−2 迷路は18cm×18cmの単位区画から構成され、全体の大きさは16×16区画とする。区画の壁の高さは5cm、厚さは1.2cmとする。
2−3 迷路の始点は、四隅のいずれかにあり、時計回りに出発する。終点は中央の4区画とする。
3−1 マイクロマウスが始点から終点への走行に要した最短の時間をそのマイクロマウスの迷路通過時間記録とする。
3−2 操作者は迷路が公開された後で迷路に関する情報をマイクロマウスに入力してはならない。
3−3 迷路の走行は、毎回、始点より開始し、マイクロマウスが走行中止あるいは始点に戻った時点で終了する。
3−6 マイクロマウスは10分間の持時間を有し、この間5回までの走行をすることができる。


迷路図と「肉弾人生」がたどった足跡は以下のとおりである。

(図)

 

12.問題点と今後の課題

 前回(マイクロマウス2000、「肉弾時代」)の失敗をもとに作成方針を決め、ほぼ方針を実現し、かつ「完走」という目的を達成することができた。しかし、まだ探索にバグが残っており、また、最短走行経路計算はまだ実現していない。次回からは「エキスパートコース」に出場することになる。課題としては、以下のことが挙げられる。

 ●正確な探索を行えるようにする。
 ●最短走行経路を計算できるようにする。

 そのうえで、

 ●高速な動きを可能とするハードウエアを開発する。
 ●ほかのCPUを使う(H8など)、他の言語(Cなど)を用いる等、技術についての知見を広げる。

 ほぼ完全な基本動作が行えるハードウエアが得られたので、今後はこれを利用してソフト開発を行い、より高速なマシンを作り上げることができるようにしたい。

13.参考文献

「やさしいマイコン制御ロボットの製作」(横山直隆著、シータスク)
「ロボティクス入門」(ロボティクス研究会編、コロナ社)
「Z80マイコン短期マスタ」(横山直隆著、シータスク)
「Z80マイコン応用システム入門ハード編第二版」(東京電機大学出版局)
「初心者のためのロボットの作り方第六版」(マイクロマウス委員会東日本支部)
「プログラム学習によるマイコン」(職業能力開発教材委員会編著、廣済堂出版)
「プログラム学習によるロボットI」(職業能力開発教材委員会編著、廣済堂出版)
「プログラム学習によるロボットII」(職業能力開発教材委員会編著、廣済堂出版)
「モータ制御&メカトロ技術入門」(トランジスタ技術編集部編、CQ出版社)
「高速マイクロマウスの作り方」(浅野健一著、東京電機大学出版局)
「Z-80プログラミング実習」(相原隆文著、技術評論社)
ほか

14.謝辞

 久保田英司様、制御通信部の皆様、横浜遠征に協力いただいた山本憲司様、充実した研究環境を提供いただいた京都コンピュータ学院様に感謝いたします。

以上