*LEDIP(レディップ)
PIC 1
PIC1では,ライントレース・DCモータの回転制御・速度制御・全赤外線センサの入力・PIC2へのサーボ制御信号送信・ロータリーエンコーダの入力及びそれらの動作状況を確認できるLEDを接続した.
| bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| Port A |
- |
- |
(空き) |
(空き) |
モータ左前 |
モータ左後 |
モータ右前 |
モータ右後 |
| Port B |
格納 |
置く |
クランク |
取る |
通信3 |
通信2 |
通信1 |
押しボタン |
| Port C |
LED |
LED |
トレース左 |
トレース右 |
(空き) |
PWM左 |
PWM右 |
エンコーダ |
□ポートA
○Bit0~bit3 :モータ回転制御
モータドライバ内のHブリッジ回路によって正転・逆転・ブレーキ・停止を行うための2本の制御線で,左右のモータを個別に制御できるように計4つのポートを用いて制御する.
□ポートB
○Bit0 :押しボタンスイッチ
競技スタートの合図でロボットをスタートさせる時の,タイミングをロボットに知らせるためのボタンである.
外部割込みが利用できるようにこのBitにしたが,詳しい資料集めや実験をする時間がなかったため,使用していない.
使用した場合には,割り込みによって動作中プログラムに関係なくいつでもロボットを停止できる緊急停止ボタンとしても使用できる.
○Bit1~Bit3:通信ポート
このロボットではサーボモータ(円盤を扱うアーム)を全てPIC2によって制御しているが,そのPIC2にアームを動作させるタイミングを知らせるための通信ポートである.
専用のプログラムを組むことによって,PIC1に接続されているセンサの入力状態をPIC2のLEDIP回路によって全て確認できるようにするために,シリアル通信がしやすいように3つのポートを確保している.
○Bit4~Bit7:位置確認センサ
ロボットが現在競技台上のどの位置にいるのかを検知するためのセンサである.これによって,水平トレイの位置,垂直トレイの位置,点灯している格納位置LED,クランク走行をする位置が検知できる.
状態変化割り込みによっても処理できるようにこのBitにしてある.
□ポートC
○Bit0 :ロータリーエンコーダ
タイヤと共に回転する白黒縞をつけ,それをロータリーエンコーダとすることでタイヤの回転の様子を検知できる.
タイマ1のカウンタを使用することにより,一定の距離走行した時に割込み処理をさせることができる.大会用のプログラムでは,ロボットがコース外に飛び出ないよう,異常な距離を走行した時に緊急停止するようにプログラムしていた.
○Bit1・Bit2:PWM速度制御信号
左右のDCモータの回転速度を制御するためのPWM信号を出力する.
タイマ2内蔵のCCPモジュールのPWMモードを使用することにより,ハードウェアでPWM信号を生成することができる.
○Bit3~Bit5:ライントレースセンサ
ラインの右端と左端を検出し,端からずれた時に進行方向を修正するようにDCモータを制御する.原理としては2つのセンサでよいので2つのみを用いているが,従来3つのセンサを使用していたので念のためにもう1つセンサを接続できるようにBit3を確保している.
ポートCは入力モード時にシュミットトリガが内部で使用されているので,センサからの応答信号の明瞭性を狙ってこのポートにしている.
○Bit6・Bit7:LED
プログラム製作中に,動作のチェックなどをしやすくするため,確認用にLEDを接続している.
PIC 2
PIC2では,サーボモータの制御・LEDIP回路によるパターン入力を行う.LEDIP回路の詳細については後述する.
| bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| Port A |
- |
- |
(空き) |
(空き) |
サーボ指 |
サーボ手 |
サーボ肘 |
サーボ肩 |
| Port B |
(ICSP) |
(ICSP) |
(空き) |
(空き) |
通信3 |
通信2 |
通信1 |
(空き) |
| Port C |
LEDIP7 |
LEDIP6 |
LEDIP5 |
LEDIP4 |
LEDIP3 |
LEDIP2 |
LEDIP1 |
LEDIP0 |
□ポートA
○Bit0~Bit3:サーボモータの制御信号
4つのサーボモータにそれぞれ異なるPWM信号を与え,アームを自由に動かせるように制御している.大会用のプログラムでは,タイマ0割り込みとタイマ1割り込みを組合せ,PWM信号を作り出していた.この方法の詳細については後述する.
なお,サーボの制御では全ポートに一気に信号を出力する(タイミングを合わせる)のが望ましいが,そのように一気に出力を行っても他の回路に影響がないように,ポートAには他に回路は接続しないように配慮している.
□ポートB
○Bit1~Bit3:通信ポート
PIC1の通信ポートと同様.わかりやすいように,PIC1と同じポートの同じBitに配置してある.
○Bit6・Bit7:ICSP用
実際にはPIC1にもあるが,記述はしていない,ICSPをするには回路上の制約があるので,このようになるべく専用に用いた方が良い.
□ポートC
○Bit0~Bit7:LEDIP回路
この回路は独自に考案した回路で,DIPスイッチとLEDが同じポートを共有し,多様な使い方ができる回路である.(LED+DIP=LEDIP)
PICが入力モードの時はDIPスイッチによって入力状態が決定され,その状態を負論理でLEDの点滅として確認できる.
PICが出力モードの時は,LEDがDIPスイッチの入力に関係なく,PICの出力状態によって点滅する.
大会用のプログラムでは,円盤の位置パターンを読み込んだ後(入力モード),8つのLEDによってイルミネーション点灯を行っている(出力モード).このイルミネーションによってPIC2が停止していないかどうかの確認ができる.
※ この回路では上下に2つ抵抗を使用しているが,この抵抗の抵抗値は上のものが下のものの10倍程度ないと正常に動作しない.これはPICの信号入力レベルと回路の出力レベルの関係によるものである.
(3) 設計した回路をもとに,電子回路CADソフトを用いて回路図と配線パターンの設計を行う.電子回路CADソフトとして,EAGLEのフリーウェア版を用いた.
フリーウェア版のEAGLEでは,設計できるプリント基板のサイズに制限があり(100×80mm),自分の構想していたサイズ(140×55mm)よりも小さかったため,PIC1の回路とPIC2の回路を別々に設計し,基板加工機側のソフトで一体化するという方法を取った.このようにして作製した回路図が図11.3.4である.
基板加工機へは,EAGLEで設計したパターンを画像にして加工機用のパソコンへコピーし,それをもとに加工機用のソフトにパターンを入力する方法を用いた.
このようにして設計したものが図11.3.5である.
(4) 図11.3.4の配線パターンをもとに,基板加工機用の加工データ(ガーバーデータ)を作製するためのソフトウェア「Circuit CAM」に配線パターンを入力した.配線の後,ヴィア(貫通穴)・アイソサーマル(グランドパターン)・外枠・ランナー部分等を設定し,ガーバーデータをエクスポート(データとして出力)した.そのデータが図11.3.6の配線パターンである.
(5) Circuit CAMで作製したガーバーデータを,基板加工機を制御するためのソフトウェア「Board Master」にインポートし,基板を作製するための各設定を行った後,基板を作製した.作製した基板の写真が図11.3.7である.
作製した基板は,削りくずやバリ(削った後の粗い所)を取り除き,テスタを用いて断線がないか,導通するか,配線は間違っていないか等のチェックを行った.その後,はんだ付けを行って回路を組み上げ,PIC基板を完成させた.
(6) ロボット本体の設計を行った.本体設計では,まず使用できるアルミ材の採寸をし,それぞれを組み合わせてどのような構造ができるかいろいろと考えた.
その後,考えた構造をもとにアイデアスケッチを描き,実際のアルミ材の比率の正確な設計図を作った.
この設計図をもとに完成予想図を作ってみたいと思い,CADによる設計を考えた.しかし,CADソフトを探したり,そのCADソフトの使い方を習得するのに割ける時間がなかったりしたため,以前使用したことがあった3次元CG作製ソフト「Blender」を用いた完成図作成を思い立った.
このソフトは本来3次元CGを作製するためのソフトであり,このような3次元設計を行うのに適した造りにはなっていない.しかし,方眼を使用できることや,パーツを組み合わせて立体を組み立てていくようなことが可能であったので,今回のような簡単な設計程度なら充分対応できた.
このソフトを用いたことによって,完成予想図が立体として視覚的に確認できるため,部品の重なり合いやどこでネジ止めをすればうまくいくかなどのようなことが想定しやすく,設計上の参考になった.
(7) 作製したPIC基板が所望の動作をするか,簡単なプログラムを作ってそれを動作させることで確認した.具体的には次のような動作をさせた.
1. LEDの点灯・消灯
2. センサがライン上に来たらLEDを点灯させる
3. モータの正転・逆転・右だけ(左だけ)回転
4. センサがライン上に来たらモータを回転
5. ライントレース
6. ライントレース中にマークを読んだら停止 など
(8) 前述のライントレース中にマークを読んだら停止するプログラムを用いて,停止したらちょうど円盤の位置にアームがくるようにセンサ基板とアーム部分の位置を調整し,しっかりとネジ止めした.それからロボット上にどういう配置で基板やスイッチ,バッテリーを載せるかの細かい位置関係を決めた.
配置決めの際には,次のようなことに注意した.
- アームが下がってきた時にぶつからない位置
- 走行中でも押しやすいスイッチの位置
- 土台板の大きさをはみ出ないような配置
- バッテリーの取り外しがしやすい など
このような配置を考えた結果,図11.3.9のようになった.特に,バッテリーの向きと,コネクタの出し方には工夫を凝らした.
(9) 「LEDIP」は「φя」と2台式で大会に出場するという目的で作られており,反時計回りに走行して円盤を運搬するような構造となっている(図11.3.9参照).
そのため,最も効率の良い進路としては,次のようなものが考えられる.
1. スタート後ラインを読み取り,左に回転
2. 円盤を取ると同時に左回転
3. そのまま直進
4. ラインを読み取ったら左回転
5. マークとLEDにより円盤を格納
6. 左回転し手順1へ
しかも,任意に円盤を運ぶため,次のようなことができなければならない.
- 円盤を取る高さを前もってロボットに入力する
- 円盤を取る位置を1周ごとにずらし,全ての円盤を取る
- LEDが点灯している所に円盤を置く
- 一度円盤を入れたところは飛ばして円盤を入れる
また,2台式の競技法では,互いのロボットが衝突するのを防ぐ必要がある.当初,これは超音波センサを用いて互いのロボットを検出し,ロボットを停止させることで衝突を防止しようと考えていたが,時間が間に合わず製作することができなかった.
そこで次のような走行時の工夫をすることでなるべく衝突する可能性が低くなるようにした.実際にこの方法を用いたことで,実験した限りでは衝突することはなかった.
- 円盤を入れる位置を,時計回りのロボット(φя)は手前から,反時計回りのロボット(LEDIP)は奥の方からにし,格納の際に互いの距離を取った.
- 円盤を置いてから次の円盤を取りに行く過程での衝突を防ぐため,奥のラインへの復帰を斜めに行い,その位置を中央より外側にした.
(10) 以上のことを踏まえた上でプログラムを作り始めた.プログラムはライントレースから徐々に複雑なものにしていき(手順7のように),大会用のプログラムとして仕上げていった.以降にPIC1とPIC2の大会用プログラムにおける使用レジスタの定義名とプログラムの特徴的なところを示す.プログラムの詳細については別紙のプログラム解説テキストを参照のこと.
- PIC1のプログラム解説(最終更新日2008年2月18日版)
このプログラムで使用しているファイルレジスタの名前と用途を以下に示す.
| レジスタ名 |
用途 |
WTMR1 : WTMR5 |
NOPを繰り返し実行し,時間を作り出す処理を行う 1~5が0.1ms~1sを作り出すのに用いられている 割り込み処理以外でなら他用途に使用しても構わない |
W_TMP S_TMP |
割り込み処理から復帰した時に,もとの処理を続行できるように値を退避しておく |
| COMP1 |
走行速度の最終到達値 |
| TIMES |
残りがあと何周(何枚)かを記憶 |
| CHECK |
モータの現在速度と目標速度の比較 |
| UPDWN |
加減速後の値を記憶 |
| VALUE |
点灯しているLEDを幾つ読み取ったか |
| COUNT |
格納位置マークを幾つ読み取ったか |
このプログラムの特徴的な処理は,以下のようなものである.
(a) 積分動作的な速度制御方式
通常のプログラム処理では,速度の制御をある速度から変更したい速度にいきなり変更するため,ロボットがその急激な速度変化についていけないという問題があった.
そこでこのプログラムでは,速度設定の変更がなされると,いきなりその設定値を反映するのではなく,新たに設定した値に少しずつ近づけていくような動作をさせる.
この速度変化の様子が,速度設定値を時間積分したような動きになるので,ロボットの設計当初はロボット名をイミテグ(IMItate inTEGration:擬似積分動作)にしようと考えていた.
図11.3.12のように,現在の速度(以降現在速度)からプログラムによって設定された値(以降目標速度と呼ぶ)まで一定の変化率で近づけてき,目標速度に到達するとその値を維持するようになっている.この部分のプログラムはTMR0割り込みによって一定の時間間隔ごとに実行しており,特にメインプログラムで処理を行わなくとも,COMP1レジスタに設定値を代入するだけで動作する.
(b) ロータリーエンコーダによるコースアウト防止
ロボットの右側の車輪に白黒縞のテープが巻かれており,この白黒をライントレースと同じ原理で赤外線センサによって読む.これにより,車輪の回転によって一定回数の白黒の変化がパルス信号としてPICへ入力される.
白黒の長さとそのパルス信号の回数がわかると,車輪が進んだ距離を求めることができる.これがロータリーエンコーダの仕組みである.
プログラムでは,この仕組みを用いて,のパルス信号が与えられた回数(ロボットが走った距離)をTMR1のカウンタで計数し,明らかにコース外に出てしまうような距離に達したときに緊急停止させる.
この機能は割り込みによって処理されるため,特に通常処理で意識して処理する必要はなく,どの程度の距離で緊急停止を行うかを適宜設定するのみで使用できる.
(c) 円盤取得トレイ側に戻るときの方向制御
手順(9)で説明したように2台式で競技を行う場合,互いのロボットが衝突する機会をなるべく少なくしなければならない.特に衝突することが予想されるのは,円盤を格納した後,次の円盤を取りに行くために反対側へ移動する過程である.この部分の衝突を避けるために,円盤を格納した後,そのまま左回転し,コースの中心より外側に戻ることにした.
円盤を格納する位置はランダムに決められるため,左回転の角度はその時々によって変化する(図11.3.11参照).この変化に対応できるようなプログラムとして,次のようなものを採用している.
まず,円盤を格納する位置が変化すると,円盤を格納するトレイの位置に描かれているマーク上を通る回数がそれに比例して変化することに着目し,この変化と左回転の角度が対応できないか考えた.
マークを読み取る回数は,1回から7回の間で変化する.また,左回転の角度は,およそ60°から120°程の間で変化する.つまり,双方ともに増加の傾向にあるため,この関係を一次関数として表せればよいと考え,数十回に及ぶ実験を繰り返した.
その結果,マーク1つ当たり30msで,切片が300msという実験結果が出た.これをもとにプログラミングを行った.
- PIC2のプログラム解説(最終更新日2008年2月18日版)
| レジスタ名 |
用途 |
WTMR1 : WTMR5 |
NOPを繰り返し実行し,時間を作り出す処理を行う 1~5が0.1ms~1sを作り出すのに用いられている 割り込み処理以外でなら他用途に使用しても構わない |
W_TMP S_TMP |
割り込み処理から復帰した時に,もとの処理を続行できるように値を退避しておく |
CNTR1 : CNTR4 |
サーボモータ用PWM信号のデューティー比を保持するためのPWM ON時間決定レジスタ 1~4で4つのサーボモータを制御する |
DUTY1 : DUTY4 |
デューティー比がある値からある値へ変化する時,積分的に滑らかに変化するように徐々に 値を変化させていくレジスタ実際にサーボに入力されている値 |
COMP1 : COMP4 |
PWM信号のデューティー比を表す値を格納するレジスタ プログラム中では基本的にここに値を入れる |
| CHECK |
サーボの現在角度と目標角度の比較 |
| UPDWN |
角度の加減後の値を記憶 |
| DIPIN |
ディップスイッチの状態を記憶 |
| SERVO |
サーボに出力する信号を記憶 |
| LEDIP |
LEDIP回路のイルミネーション用 |
このプログラムの特徴的な処理は,以下のようなものである.
(a) 割り込みを用いたサーボ制御
サーボモータを制御するためのPWM生成に,TMR0とTMR1を併用した割り込み処理による制御を採用している.
まず,この制御と従来用いていた制御の比較を次に示す.
| 項目 |
従来の制御 |
割り込みを用いた制御 |
| 周期の誤差 |
数十命令サイクル分 |
セラロックの誤差のみ |
| Duty範囲 |
0~100% |
0~約20% |
| 分解能 |
50μs単位 |
16μs単位 |
| 処理占有率 |
ほぼ100% |
0.05%以下 |
| 応答速度 |
16~20ms |
~10ms |
| 調整 |
数行の命令を変更 |
1つの値を変更 |
| レジスタ |
0~3個使用 |
10個程度使用 |
| プログラム |
直感的,作りやすい |
複雑,作りにくい |
なお,表中で割り込みを用いた制御ではDuty範囲が0~20%,分解能が16μsとなっているが,この値について解説する.
まず,サーボの可動範囲を全てカバーするデューティー比の範囲は,データシートより4~10%となっている.この値に余裕を持たせ,20%まで制御できるようにしたために,Duty範囲が0~20%となっている.
そのため,データシートの値をそのまま使用し,10%までの制御とすることで,分解能を10μs以下まで上げることができる.
分解能に関しては,上述の0~20%のデューティー比を制御するのに,8Bitのレジスタを用いており,8Bitのレジスタでは0~255の256(28)段階の制御が行える.これをもとに計算を行うと,
20ms × 20% = 4ms
4ms ÷ 256段階 ≒ 15.6μs →およそ16μs
この解より,最小時間単位を決定した.この時間に関しても,更に厳密に計算をやり直し,細かくプログラムを調整することで,更なる分解能の向上が期待できる.
このように,制御能力やPICへの負荷の軽さの面では非常に優れているが,プログラムが複雑で理解しづらくレジスタを多く消費する.
この制御法では,TMR0割り込みでPWM信号のOFFを,TMR1割り込みでPWM信号のONを行っている.
各サーボへのPWM出力に,1つずつレジスタ(CNTRx)が割り当てられており,それぞれのレジスタにはPWM信号をONにする時間を格納する.
この値はDUTYxレジスタに保持されており,PWM信号を1周期出し終わるごとに再度読み出してPWM信号を途切れなく作り出す.
このCNTRxレジスタの値は,TMR0割り込みによって16μs毎にその内容が1ずつ減算されていき,0になったところでPWM信号をOFFにする.つまり,CNTRxの値が大きいほどONの時間が長く,デューティー比が大きい.
次に,TMR1割り込みでは,TMR0割り込みによってOFF状態になっているPWM信号を20ms毎に全てONにする.また,同時にCNTRxレジスタに値を再度読み出し,再び信号をOFFにできるようにする.
この2つの動作によって,4つの20ms周期のPWM信号が生成される.
(b) 積分動作的なアーム角度制御方式
前の(a)で割り込みを用いたアーム制御方式を,PIC1で積分動作的な速度制御方式を説明したが,実はPIC2のアーム制御プログラムはこの2つを組み合わせた構造をしている.つまり,プログラム中で次のアーム角度を指定すると,前の角度から次の角度まで徐々にPWM信号が変化していくような動作をする.
これまでの,いきなりPWM信号のデューティーを変えて制御する方式では,サーボモータが簡単なプログラムで制御でき,また最速の動作で制御できるが,どうしてもその分サーボモータに負担が掛かっているようだった.
また,「LEDIP」では一部に強力なサーボモータを用いており,そのモータだけ動作速度が極端に速いため,全てのサーボモータ速度を揃えるような制御をする必要があった.このような理由でこの制御方式を考えた.
この方式を用いたことで,アームの動作速度を自由自在に変えることができ,実際に動作チェックでは超低速でアームを動かす実験にも成功している.
(11) 最後に,大会本番に向けてプログラム各部のタイミングや時間を微調整した.
当初からメンテナンス性に重点を置いたプログラム設計だったので,時間待ちサブルーチンの数や初期設定値を多少変更する程度でほとんどの調整が行えるようになっている.このような設計は,大会本番での急な変更時にとても重要な要素となる.
最終更新:2010年03月06日 10:05