-
2012/11/18
1
1. Uターン
– 講習テキストの課題3
2. ライントレースコースの周回
– 走行、トラック進入、トラック周回
3. タッチセンサの利用と終端マークの検知
• S 1. 終端線からスタート – ライントレース前進
2. 壁面検知したら、少し後退して180°回転 – ライントレース前進
3. 終端線を検知後、180°回転する – ライントレース前進
4. 壁面検知して停止
5. 所要タイムも計測
鉛直壁面
1. START 3. STEP & TURN
2. TOUCH & TURN 4. TOUCH & STOP
ライン3本分 幅の終端線
•サンプルプログラム •前進 •後進 •停止
応用プログラム: •方向転換 •ステップ動作
• 問題1
– 左右の車輪の回転数が微妙に異なり直進しない
• 問題2
– 車輪が床面でスリップすると移動距離が違ってしまう
– 旋回時スリップすると正しい角度に方向転換しない
• 問題3
– 電池の消耗具合でモータの回転数・トルクが変化
• モータ回転数を別々に調節できれば解決? – Ticolla_CDE サンプル 06_Mot_Drvが参考になる
• 2モータの速度を個別に変更可能な例題
• ボード上の J1 ~ J3 の設定を B側 に変更する必要あり (6_Mot_Drv-HWの設定画面を確認せよ)
–細かな速度調整はMOT_SETSPD関数で可能 • ITC2006テキスト84, 85ページを参照
• main関数内でMOT_SPD関数をMOT_SETSPDに変更
• 第二引数でPWMのデューティー比を表わす値 (0~65534) を直接指定する
-
2012/11/18
2
J1 J2 J3 をB側に
CN6 には何も接続しないこと
MOTOR_SETSPD(byte port_number, word speed )
• port_number: PWM信号出力ポート指定 – MOTOR_SPD関数の第一引数と同じ
– PWM_SIDE_CN11 M2または両方の速さを指定する場合
– PWM_SIDE_CN6 M1の速さを独立に指定する場合
• speed: 速度値の直接指定 – 0~65534 (0x0000 ~ 0xfffe) の値を指定する
– 0は停止の指定 (デューティー比 0%に相当)
– 65534 (0xfffe)は最高速の指定 (デューティー比 100%)
– 値はPWM波形のデューティー比であり速度と比例するとは限らないことに注意
void
main(void) {
init(); // Initialization
// J1~J3 ジャンパ設定をB側に変更
MOTOR_SETSPD(PWM_SIDE_CN6, 32767); // M1
MOTOR_SETSPD(PWM_SIDE_CN11,
32767 - 1000); // M2
while (1) {...
• 速度調整の具体的方法は?試行錯誤が必要
• 条件が変わる毎に調整が必要ではないか? – 電池の消耗によるモータ速度の変動もあり得る!
– 左右モータのPWM調整だけでは速度調整は難しい
• モータの回転を測定するセンサがあれば解決? – モータ/車輪の回転角あるいは角速度を測りたい
• これらを同時に測定できるセンサ – ロータリーエンコーダ (精度が高い回転計が作れる)
– ホールセンサ(信頼性が高い回転計が作れる)
軸が一定角度回転する毎にパルスが1つ出力される
回転の向きを弁別するため,1/4ピッチずらした2組の光センサを用いる
回転の向きまで考慮して出力パルス数を積算すれば回転角が求まる
単位時間当りのパルス数をカウントすれば角速度が求まる
外観 ケーブルはエンコーダ出力
○内がエンコーダ
-
2012/11/18
3
• 今回,ロータリーエンコーダは使えるか? – モータやギヤボックスに取り付けるのは困難
– 入力ポート数の制約と計数プログラムの複雑さのため現状のMCUボードでの実現は困難
– 問題2 (スリップの問題)はそれでも解決できない
• 赤外線センサによるライントレース – 床面に書かれたラインを追跡する動作
– 問題1~問題3が同時に解決できる
– ラインのないところを走行させる場合は問題だがタッチセンサなど併用すれば対応できる
• デッドレコニング
–外部からの情報なしで位置と方向を定める方式
–距離計,速度計,ジャイロなど内界センサを使用
–あらかじめ取得したマップと照合することが多い
• 外界センサを利用(併用)する方式
–センサは GPS, RFID, 視覚, 触覚センサなど
–目印 (ランドマーク) を使う場合と使わない場合
–障害物のある動的環境に対応しやすい
コースや位置を示すラインはランドマークとマップの両方の役割を持たせられる
競技コース (左からH18, H19, H20年度)
中間色(緑色)のラインでも情報が表現されている
• ライントレース (コースの検出) – 赤外線光センサを利用
• 障害物の検出 – タッチセンサ,距離センサの利用
• 自動対戦 – ロボットサッカー,相撲など
• 正確な直進,コース取り (オプション) – 方位角センサ, 慣性センサなどが必要
• 外部からの指令入力 (オプション) – 赤外線リモコン (あるいは無線,有線リモコン)
-
2012/11/18
4
• 1センサでのトレース
– ラインの一方端(右端または左端)だけを利用
• 2センサでのトレース
– ラインの両端を使用
– 急角度にも対応できる
• 多センサでのトレース
– 3~13センサでラインからの距離などを測定
• 多センサを備えた機器
– ライン外れからの修正がやりやすい。高速競技に向く。
• 2センサでも同等の性能が出せる
– コースを濃淡線で表現して,中央からの偏差を検知可能にする,など。
H H
L H
右センサ 左センサ
白 黒
白 M1 = 高速前進 M2 = 高速前進
M1 = 中速前進 M2 = 低速後進
黒 M1 =低速後進 M2 =中速前進
M1 =停止 M2 =停止
現在のセンサ入力だけから動作を決定する
※実際は課題コースの条件(十字路,直角部分の有無など)にも依存する
動作ロジックのコーディング
1. 入力を保持する変数に初期値を入れる
2. AD_GETDATA関数で左右センサ値を取得
3. 現在の入力値をしきい値処理で決定する
4. 現在の入力値と変数の値に基づいて左右の車輪の速度を決定し、実際に修正する
5. 現在の入力値を変数に代入して2.へ戻る
※実際は課題コースの条件(十字路,直角部分の有無など)にも依存する
右センサ 左センサ
白→白 白→黒 黒→白 黒→黒
白→白 M1 = 高速前進 M2 = 高速前進
M1 = 中速前進 M2 = 停止
M1 = 中速前進 M2 = 低速後進
白→黒 M1 =停止
M2 =中速前進
M1 =中速前進 M2 =中速前進
M1 =低速前進 M2 =高速前進 M1 =中速前進
M2 =停止 黒→白
M1 =高速前進 M2 =低速前進
M1 =中速前進 M2 =中速前進
黒→黒 M1 =低速後進 M2 =中速前進
M1 =停止 M2 =中速前進
M1 =停止 M2 =停止
現在の入力だけでなく,直前の入力に依存して動作を決定する
上の考え方を一般化すると有限状態機械になる
-
2012/11/18
5
有限状態機械に基づく動作ロジック
1. AD_GETDATA関数で左右センサ値を取得
2. 現在の入力をしきい値処理で決定する
3. 現在の状態変数を参照して状態変数値を更新する(状態を変化させない場合も含む)
4. 同時に左右の車輪の速度を修正する
5. 1.へ戻る
• センサ/インターフェースの種類
–ディジタル出力のセンサ
–アナログ出力のセンサ
• タッチセンサ
–構造と接続
• 赤外線センサ
–構造と接続
–取りつけと調整
タッチセンサ
8方向方位角センサ 距離センサー
赤外線センサ
ディジタル出力 アナログ出力
補足:前述のロータリーエンコーダもセンサである
通常時(break) Sout = L (GND = 0V)
接触時(make) Sout = H (Vcc = +5V)
-
2012/11/18
6
M1_IN1 (CN7)
M1_IN2 (CN8)
M2_IN1 (CN9)
M2_IN2 (CN10)
PWM_SIDE_CN11
AD_CN4
AD_CN3
AD _CN6※
Digital I/O (CN1)
Digital I/O (CN2)
Digital I/O (CN13)
Digital I/O (CN12)
ディジタル入出力
アナログ入力
モーター出力
PWM_SIDE_CN6※
※ A/DとPWMの同時使用はできません
Digital I/O (CN5) Digital Input (CN14)
• サンプル 3 SW_IN を参考にできる
• 新規プロジェクト作成した後,HW画面でCN1, CN2, CN5にタッチセンサを割り当てる
• プログラム中でCN1またはCN2 , CN5を参照可
– CN1 == 0 : 非接触状態で真 (スイッチOFF)
– CN1 == 1 : 接触状態で真 (スイッチOFF)
– CN2 , CN5も同様
• 参照した瞬間のスイッチの状態が反映される
void main(void) { init(); MOTOR_SPD(PWM_SIDE_CN11, MOTOR_STEP_MIN); while (1) { if ( CN1 == 0 ) { // CN1がOFFなら Forward(); // 前進 } else { // CN1がONなら Mot_stop(); // 停止 DELAY_SEC(50); // 10mSECタイマ × 50 } COPCTL = 0; } }
裏面中央にある透明な素子が赤外線発光ダイオード (IR LED) 矢印は主放射方向(肉眼では見えません)。
中央の黒いIC正面に半球面の入射
レンズがある。感度調整抵抗の値は必ず中央付近にしておく。
Sout : 光IC入力光量に比例する 0 V ~ +4.2 V の電圧を出力
TPS820の内部構造 ライントレースカーの赤外線センサモジュール
3
2
1
-
2012/11/18
7
CPU
ポート端子 内部モジュール群
メモリー
アナログ入力電圧に比例する2進数が得られる
A/D コンバータ
I/O ポート
入力モード: 外部から各端
子に加わる電圧の H/L に応
じて内部の入力レジスタの対応ビットの値が 1/0 に変化する 出力モード: 出力レジスタの
各ビットの状態を外部に出力する
• AD_GETDATA(byte connector, byte *pvalue);
– connector : 入力コネクタの指定
• AD_CN3, AD_CN4, AD_CN6 のいずれかを指定
• ※2モータ速度制御時はAD_CN6は使用できない
– pvalue : 値を格納する場所の指定
• 値の格納先のbyte型領域のアドレス値を渡す
• byte型の変数名の前に アドレス演算子& を置く
• 値は0~255の間になる
– A/D変換開始~終了までの時間は 25μs 程度
AD_GETDATA(AD_CN3, &Value);
// CN3のアナログ値を取得し,変数Valueへ格納
AD_GETDATA(AD_CN4, &Value);
// CN4のアナログ値を取得し,変数Valueへ格納
• Value はあらかじめ宣言したbyte型変数
• 単項演算子& はアドレス演算子
byte Value; // グローバル変数として定義 void main(void) { init(); // initialization while (1) { AD_GETDATA( AD_CN3, &Value ); // 赤外線センサの値読み出し if ( Value > 128 ) { // 値が128より大きいならば Forward(); // 関数Forwardで前進 } else { // 値が128以下ならば Mot_stop(); // 停止 } COPCTL = 0; // ウォッチドックタイマ } }
-
2012/11/18
8
void AD_TO_LED(void) { byte Value; // > 4; // 取得した値上位4bitを下位4bitへ移動 LED_OUT( Value ); // 取得した値をLEDへ出力(元の上位4bit) COPCTL = 0; } }
TPS820の受光角:±15°程度
• 出力電圧 0 V ~ 4.2 V
• 暗→明で電圧低→ 高
• 応答速度が速い
• アナログ信号出力
• 明るさの中間値もわかる
• MCUで電圧値を読み取るには A/D コンバータが必要
通常は,背景(白)とライン(黒)の中間に設定するとよい。
反射の弱い場所・条件では, 背景(白)とライン(黒)のレベル
が同時に低下する。その場合でもしきい値が中間に収まるように調整。
• ライントレース課題のプログラミング
–入力と入力の変化(遷移)を考慮する方法
–有限状態機械
• 光センサ
–その他の光センサ
-
2012/11/18
9
H H
L H
右センサ 左センサ
白 黒
白 M1 = 高速前進 M2 = 高速前進
M1 = 中速前進 M2 = 低速後進
黒 M1 =低速後進 M2 =中速前進
M1 =停止 M2 =停止
現在のセンサ入力だけから動作を決定する
右センサ 左センサ
白→白 白→黒 黒→白 黒→黒
白→白 M1 = 高速前進 M2 = 高速前進
M1 = 中速前進 M2 = 停止
M1 = 中速前進 M2 = 低速後進
白→黒 M1 =停止
M2 =中速前進
M1 =中速前進 M2 =中速前進
M1 =低速前進 M2 =高速前進 M1 =中速前進
M2 =停止 黒→白
M1 =高速前進 M2 =低速前進
M1 =中速前進 M2 =中速前進
黒→黒 M1 =低速後進 M2 =中速前進
M1 =停止 M2 =中速前進
M1 =停止 M2 =停止
現在の入力だけでなく,直前の入力に依存して動作を決定する
※実際は課題コースの条件(十字路,直角部分の有無など)にも依存する
• 左右光センサからのすべての入力を使うには
–現在の入力
–直前の入力
– 2時点前の入力
– ...
–動作開始時の入力
• 膨大な場合分けとデータ量は必要ない
• 状態変数1つと現在の入力だけで十分
入力データ2nビット分の記憶 かつ
プログラムで22n通りの場合分け が必要か?
• 状態はS で表わされ S0, S1, ..., Sn のいずれか
• 入力は X = (X1, X2, X3, ... ,Xk) で表わされる
• 現在の状態と入力からS’ = f(S, X), y = g(S, X)に従って次の状態と動作がそれぞれ決定される
• ほとんどの機械のプログラミングに応用できる
• 計算機設計,情報処理,知能ロボットなど工学の様々な分野で広く利用されている
• 生物個体や種,社会での個人や集団の活動も一種の状態機械と捉えることができる
有限状態機械に基づく動作ロジック
1. AD_GETDATA関数で左右センサ値を取得
2. 現在の入力をしきい値処理で決定する
3. 現在の状態変数を参照して状態変数値を更新する(状態を変化させない場合も含む)
4. 同時に左右の車輪の速度を修正する
5. 1.へ戻る
-
2012/11/18
10
(1) フォトダイオード – PINフォトダイオード,アバランシェフォトダイオードなど
• 検出原理: – PN接合を有する半導体に光が入射すると起電力が発生する光起電力効果を利用。(太陽電池と同じ原理)
– 生じる電圧と電流をそれぞれ光起電力,光電流とよぶ
• 特徴 – 応答速度が速い,低雑音,光電流は入射光量に比例
– 出力電流が微弱(μA程度)なため信号増幅が必要
(2) フォトトランジスタ – 普通のトランジスタと異なりベース端子がない
– トランジスタと同様,NPN型とPNP型がある
• 検出原理 – トランジスタ内部で生じる光電流がベース電流の役割をしてコレクターエミッタ間の電流が増幅される
• 特徴 – 入力光に対する出力電流が大きい(数mA程度)
– 雑音が多い。直線性などの特性があまり良くない
– 製造時の感度のばらつきが大きい
(3) CdS, CdSe, HgCdTeなど: – 光導電効果を利用するもの。HgCdTeは高感度赤外線センサに使われる
(4) ボロメータ,サーモパイルなど –サーミスタで赤外光を電気に変換する
(5) 光電管 –光電子放出効果を利用する光センサ
(6) 光電子増倍管 –二次電子放出効果も利用した高感度な光センサ