情報工学実験(3学年)ライントレーサの製作挑戦
Aug2003 Copyright(C) coskx

PDF版

1.はじめに

(1)ライントレーサとは,図1.1のように平面上に引かれた線の上を自動追尾して移動する車輪駆動ロボット である。平面は白色,線は黒色。線幅18mm程度とする。この課題では2つのモータを左右に持ち,その回転数を制御して,進行方向を制御する車輪ロボット を製作する。

図1.1 ライントレーサ


(2)この 課題は授業で習ったことだけで実現できるようになっていない。挑戦する心を育てる課題である。知識や技術を与えてもらうという受身ではなく,自分のコン ピュータスキルをアップする機会を得たという位置付けが大事である。授業で習っていない技術も使うことがあるので,心得ておくこと。

(3)製作は4名で1台のライントレーサを製作し,コースでのタイムレースを行ない,最後は発表会を行なう。

(4)製作にあたっては,以下の点に注意すること
1)部品をなくさない。
2)回路が出来上がったら,電源から見て回路がショートしていないか,信号線が電源やグランドとショートしていないか確認してから電源を入れる。
3)回路製作にあたっては,実装図を作ってから行なう。
4)はんだ付けは確実に行なう


2.ライントレーサ制御のアイディア

(1)図2.1のようにCDSセンサを車体下部の2つ付け,黒線の近くかどうかを検出し,これを電圧の変化に変換する。
図2.1 ライントレーサの構想

(2)電圧の変化をマイクロコンピュータで読み取る。(ADコンバータ内蔵マイクロコンピュータを利用する)左右の光センサがどのくらい黒線に近いのか知ることができる。
(3)プログラムで2つのモータに与える指令値を算出する。進行方向左車輪のモータへの指令値が大きければ車体は右に曲がる。
(4)2つのモータ指令値を2つのPWM信号に変換する。(μコンピュータに内蔵されているPWMユニット利用)
(5)2つのパワーMOSFETで2つのモータを駆動する。

図2.2にライントレーサ制作例を示す。
図2.2 ライントレーサ製作例

参考
(1)CDSセンサ
CdSとは硫化カドミウムの事を指しており、この物質は可視光線でもっとも感度の良い光伝導体である。光制御の可変抵抗であり,光があたると抵抗が小さくなる。ここでは,照明用LEDを
実 際のセンサはCdS粉末にCdCl2とCuCl2を少量加えて水で溶かしたものを、セラミックまたはガラスの基板に塗布し、空気中または不活性気体中て 500~700℃で焼結したものの上に、導電性ペーストでくしの歯状の電極を描いたものである。[参考 電子工学基礎論 和田正信 著]

(2)PWM信号
PWM(Pulse Width Modulation:パルス幅変調)と呼ばれる信号で,モータなどの制御に使われる。モータに電池とスイッチを直列でつなぐことを考える。そして,ス イッチを手でON-OFFを繰り返す。スイッチONでモータは回り,OFFで止まる。この作業を手で高速に行なうと,1秒間に3回から5回はできるであろ う。モータが高速に動いたり止まったりすることを目で見ることができる。マイコンにつながれたスイッチング素子を使うと,1秒間に1000回くらいの ON-OFF動作ができる。このくらいのON-OFFを行うと,モータは滑らかに動いているように見える。しかも,ONになっている時間幅とOFFになっ ている時間幅を自由に変更できる。例えば0.9msONにして0.1msOFFにするとか,0.2msONにして0.8msOFFにすることが可能であ る。

3.使うもの
ライントレーサ車体(モータ2,駆動輪2,キャスタ1,パンチトメタル)
光センサCDS(明るさに応じて抵抗値が変化する素子),照明用LED
オペレーショナルアンプリファイア(オペアンプ,電圧増幅,インピーダンス変換)
パワーMOSFET(電流増幅)
μコンピュータH8-3664(ADコンバータ,PWM信号発生)
電源をトレーサには積まずに,外部からケーブルで与える。制御回路用5V,モータ駆動用3V
ケーブル,抵抗,可変抵抗他

4.詳細な周辺回路設計(ブレッドボードを用いて予備実験を行なう)
(1)光センサCDS(明るさに応じて抵抗値が変化する素子)と照明用LED

CDSは周辺の明るさの影響を受けるため,遮光覆い(カバー)をつけて,自然光の影響をなくして使う。一定の光源が必要なため,LEDを照明用光源とする。図4.1のように照明用LEDを5V電源で点灯させる。
LEDには15mA程度の電流を流すことにして図4.2のような回路を用いる。(左右2系統が必要となる)
LEDは極性があるため,±を,間違えないこと。

light_sensor.GIF LED.GIF
図4.1 光センサCDSと照明用LED 図4.2 照明用LED


この時の保護抵抗は何オームにすればよいかブレッドボード上で検討しなさい。また+側の見分け方を調べなさい

  検討の結果(    Ω)
  LED+側の目印(          )

(2)LEDの地面反射光(競技面の白地,黒地)によるCDSのみかけの抵抗値
次に,このLEDの地面反射光(競技面の白地,黒地)によってCDSの,みかけの抵抗値はどのような範囲で変化するかブレッドボード上でテストして調べなさい。(周りの光を覆って調べること,R0の値には依存しない)

  実験の結果 (    kΩ~    kΩ)

参考 1.0[kΩ]~3.7[kΩ]という実験値がある。


(3)オペアンプ(電圧増幅,インピーダンス変換)
図4.3のような回路でCDSを用いることにする。例えば抵抗値R0に1.5kΩを使ったとすると,CDSの見かけの抵抗が1.0kΩの時出力は1.0/(1.0+1.5)×5.0 = 2Vとなり,またCDSの見かけの抵抗が3.0kΩの時出力は3.0/(3.0+1.5)×5.0 = 3.3Vとなるはずである。
この電圧をマイクロコンピュータのADコンバータに入力すると,その時の電圧を読み取ることができる。

CDS.GIF
図4.3 光センサ


ADコンバータとは,入力電圧をコンピュータの扱える数値に変換する素子であり,これから使用するH8/3664には内蔵されている。0Vから5Vまでの入力が,0から65535までの数値(設定によっては0から255の数値)に変換される。

と ころが,CDSの見かけの抵抗値は使用状況によって変化するので,増幅率可変の電圧増幅を行なうようにしておくと,後の調整が楽になる。そこで,オペアン プを用いた電圧増幅を5倍程度行なうことにする。また中央点は5Vの半分の2.5Vとし,図4.4に示す回路とする。Rbを調節すると増幅率が変化する。

SHIFTRAMP.GIF
図4.4 中央点2.5Vで可変増幅率の反転増幅器

また,CDS周辺の抵抗値は大きいため,出力先の抵抗値に出力値が影響を受けやすいため,図4.5に示す見かけ上の入力抵抗が大きく,増幅率1倍のボルテイジフォロア回路を挿入する。

VFollower.GIF
図4.5 見かけ上の入力抵抗が大きく,増幅率1倍のボルテイジフォロア回路



参考 オペアンプを用いた反転増幅器は,図4.6のように2つの抵抗を持っている。この回路の増幅率は-Rb/Raであり,±が反転している。
図4.4の反転増幅器も増幅率は-Rb/Raであるが,
中央電圧が0Vでなく電圧Vrefを中心として電圧増幅が行なわれる。
入力電圧をVin,出力電圧をVoutとすると図4.6,図4.4ではそれぞれ次のようになる。
 →さらに詳しい反転増幅器の解説

 SHIFTRAMP.GIF
Vout-Vref=-Rb/Ra・(Vin-Vref)
RAMP.GIF
Vout=-Rb/Ra・Vin
図4.4 中央点2.5Vで可変増幅率の反転増幅器 図4.6 基本的な反転増幅器

ここまでの光センサ部をまとめると図4.7に示すようになる。この回路で,CDSでラインを検出して,出力信号が0Vから5Vにあり,また,できるだけ大きく電圧が変化するように調節しておけば,ADコンバータへの光センサ信号入力が楽にできるようになる。

SENSORCIR.GIF
図4.7 光センサの完成

設定抵抗値の例
R0=10kΩVR
Ra=18kΩ
Rb=100kΩVR

例えばオペアンプLM660で図4.8のようになっていて,4つのアンプが1つのDIPパッケージに格納されている。ここで
V-にはGNDを
V+には5Vを
接続すればよい。

LM660.GIF
図4.8 オペアンプの例LM660


光センサ回路の出力の測定
ブレッドボードで適当な抵抗値を用いて以下の測定を行いなさい。
設定のポイント
(1)図4.7においてV1が2.5Vを中心として等幅に振れるようにR0を設定する。
(2)図4.7において,V2=V1となり,V3が2.5Vを中心に0.5V~4.5V程度に振れるようにRa,Rbを設定する。

設定抵抗値
R0=(   ,   kΩVR)
Ra=(    kΩ)
Rb=(   ,   kΩVR)

黒地 (V1=    V,V2=    V,V3=    V)
白地 (V1=    V,V2=    V,V3=    V)

研 究 CDS光センサは使いやすいが,光の強さに対する応答が遅いとされている。フォトトランジスタは応答が速いといわれている。図4.9のように使うと, 何らかの出力があるはずである。敏感なライントレースを実現するためにはフォトトランジスタの方が良いらしい。トライしたい学生は申し出ること。

PhTrusage.GIF TPS603A.GIF
図4.9 フォトトランジスタの利用 図4.10 フォトトランジスタTPS603A


(3)パワーMOSFETによるモータのPWM制御
マ イクロコンピュータH8/3664は,所定の端子から高速にH(約5V)L(約0V)を出力し,しかもHとLの時間間隔と周期をプログラムで設定できる機 能を持っている。この機能でモータを駆動するには,パワーMOSFETによって電流増幅する必要がある。モータは小型なので電源電圧3Vで駆動する。

パワーMOSFETは3本足の素子で,各足は図4.11のように「ドレイン」「ゲート」「ソース」と呼ばれている。
この素子はゲート-ドレイン間にかかる電圧で制御されるスイッチと考えればよく,ソースに対してゲート電圧が約3V以上になるとON,0VではOFFになる。

POWERMOSFET.GIF
電圧で制御されるスイッチと考えればよい
ソースに対してゲート電圧が約3V以上になるとON,0VではOFFになる
図4.11 MOSFETの動作

図4.12には,ゲイトに電圧を加えたり加えなかったりして,豆電球のON-OFFをしているところを示す。この回路で豆電球を図4.13のようにモータに置き換えるとモータのON-OFF制御ができるようになる。

PMFequCIR.GIF
ゲイトに5Vを加え,MOSFETをON    ゲイトに0Vを加え,MOSFETをOFF
図4.12 MOSFETはゲイト電圧制御のスイッチだ

MotorDrive.GIF
図4.13 MOSFETを用いたモータ駆動部

5.マイクロコンピュータH8/3664F
日 立のマイクロコンピュータH8シリーズの中で安価に提供されているマイクロコンピュータH8/3664F(図5.1)を制御に用いる。通常のマイクロコン ピュータはROMに機械語を書き込んで利用するが,このマイクロコンピュータでは機械語プログラムをフラッシュメモリに書き込むため,ROMが不要であ る。

H8_3664f.jpg
H8/3664fCPUカードがマザーボードに載っている
これは,実装の一例であり,今回製作するものではない
図5.1 マイクロコンピュータH8/3664F

H8/3664Fの機能で何を使うか
(1)ADコンバータ2ch
(2)PWM信号発生2ch
(3)タイマ割り込み
(4)LED(ハードウェア動作確認 シリアル通信動作確認)

どのように使うか
(1)windowsPCのエディタを用いてC言語でプログラムを書く。
(2)クロスCコンパイラ(Cプログラムを別のCPU上で実行する機械語プログラムに変換するコンパイラをクロスコンパイラという)でコンパイルする。
(3)H8/3664CPUへシリアル通信で機械語プログラムを送り,フラッシュメモリ(ROMに相当)に書き込む。
(4)一度フラッシュメモリに書き込まれた機械語プログラムは電源をOFFにしても消えることは無い。

6.マイクロコンピュータH8/3664Fの入門
いきなり,H8/3664Fでライントレーサを制御しようとしても出来ないので,まずH8/3664を製作して,テストプログラムで動作をチェックし,ADコンバータテストプログラム,PWMテストプログラムを動作させてから,ライントレーサの制御を行なうこととする。

6.1 マイクロコンピュータH8/3664Fの製作
(1)H8/3664fCPUカード(図6.1,図6.2)を作る。CN1,CN2とJP2,JP3をはんだ付けする。はんだ付けを終えたら図6.3のJP1の部分のパターンをカットする。

H8_3664f_TOP.png H8_3664f_BOTTOM.png
(ピンの向きを間違えない,ジャンパをなくさない)
図6.1 H8/3664F表側
図6.2 H8/3664F裏側

はんだ付けのポイント 多くの足を持つ部品をはんだ付けする時は,1個所だけはんだ付けして,部品が基板から浮いていないかどうかチェックし,浮いていたらはんだ付け個所を再加熱して直す。そして残りの足のはんだ付けを行なう。

cpucard.GIF
図6.3 H8/3664FのジャンパJP1カット


(2)マザーボードの製作
マザーボードを2つの段階に分けて作る。この段階でのマザーボードは図6.4のように製作するが,その役割は次のとおり。
1)電源部(電源用DCジャック5Vと3V(モータ用))とLED(電源が入っていることを示す)
2)RS232C通信部(DSUB9P)
3)動作チェック用LED(約2mAで点灯させる。保護抵抗は1.2~1.5kΩ)

mother.GIF
図6.4 H8/3664Fのマザーボード製作


製作にあたっての留意点
1)実装図を各自描いてから製作に入ること。部品の配置を考えながら実装図を方眼紙に描いて担当教員にチェックを受けること。
2)後でこのマザーボードには回路を拡張するので,この段階の回路は端に寄せて製作すること。
3)4隅には固定用の3ミリねじがつくので余裕を残すこと。
4)DSUB9のソケットにはRS232Cケーブルが接続できるように余裕を残す。(図6.5参照)
5)DCジャックは2ヶ所あるが,サイズが異なるので注意すること。3V用にはフェルトペンで印がついているはず。(図6.8参照)
6)3V用DCジャックはここでは使わないが,後で使うので,取り付けだけ済ませておく。
7)H8/3664fCPUカードのピンコネクタCN2の周りは,1列以上あけておく。
8)5V電源部とGND部はこれから多くの配線があるので,島を作っておくと良い。
9)GND部は,表面にピンを立てておくと,オシロスコープやテスタを用いた,トラブル時のチェックに役立つ。

回路図を図6.6,6.7に示す。

DSUB9.png
図6.5 DSUB9の取り付けの工夫

CIR1.GIF CIR2.GIF
図6.6 電源部とパイロットLED 図6.7 RS232C通信用DSUB9コネクタ部と動作チェック用LED

DCJack.gif
5V用:ピン径2.1mm(中心が+5V,周りがGND)
3V用:ピン径2.5mm(中心が+3V,周りがGND)
図6.8 電源ジャック

 

図6.9 製作例途中(現段階はここまで)



注意 マイコンキット付属の説明書では電源をCN1-24につなぐように指示しているが,これは7~9Vの電源をつなぎ,内部の3端子レギュレータで5Vを作る場合であり,本製作では,CN1-23につなぐ。

マイコンH8/3664fカードおよびマザーボードが完成して,すぐに電源を投入してはならない。
電源側から見て5VとGNDがショートしていないかテスタを用いて確認すること。またRS232C通信部DSUB9の各端子も5VおよびGNDに対してショートしていないことをテスタを用いて確認すること。




6.2 テストプログラム
出来上がった マイコンをテストしてみよう。
現時点で動作が確認できるのは,LEDとシリアル通信である。

(1)LEDをつける
図 6.7に示す2つのLEDがマザーボードについているが,これらは,H8/6334fCPUのポート8の第6ビットと第7ビットにつながっている。プログ ラム側から見るとマクロ定義された変数P8.BIT.B6とP8.BIT.B7に見える。この2つの変数は1ビット変数であり,値は0か1しかない。
P8 というのはポート8のことであり,ポート8の第6ビットと第7ビットを出力として用いるには,初期化が必要である。ポート8の初期化の詳細はヘッダファイ ル「H8_3664.h」により隠蔽されており,機能を実現するための関数を呼び出すことにより,プログラミングが可能である。
各関数は「H8_3664.h」内に説明と定義があるので,興味のある学生はH8/3664のハードウェアマニュアルとあわせて読んでみるとよい。
なお,使用しているコンパイラで,intはshort intを意味する。
「H8_3664.h」を用いるとLEDを0.5秒ごとに点滅させるプログラムは次のようになる。

リスト1 LEDを0.5秒ごとに点滅させるプログラム
/*LED点灯プログラム*/
#include "H8_3664.h"

void msecwait(int msec)
/*mesc間なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<1588;j++); /*1588は実測によって求めた値*/
    }
}

main()
{
    initLed(); /*LEDの初期化*/
    while (1) {
        turnOnLed(0); /*LED0の点灯*/
        turnOffLed(1); /*LED1の消灯*/
        msecwait(500);
        turnOnLed(1); /*LED1の点灯*/
        turnOffLed(0); /*LED0の消灯*/
        msecwait(500);
    }
}

このプログラムはコンパイルコマンドファイルと一緒にファイルで供給される。「11.資料(7)で取得すること

ledtestFolder.GIF

コンパイルから実行までの手順は次の通りである。


パソコン側

マイコンH8側
注意:5VのACアダプタを電源として用いるが,電源電圧5V,内側が+極性であることを確認して接続すること。わからなかったらテスタで極性,電圧を測定すること。

(1)
もしハイパーターミナルなどCOMポートを使用しているソフトがパソコン上で動作している時はそれらのソフトを中止します。
注意:H8は,電源スイッチONの瞬間に,状態選択スイッチの状態を検査しますので,必ず<1><2><3>の手順が必要です
<1>AKI-H8/3664f用の5Vの電源スイッチをOFFにします。
<2>AKI-H8/3664fカード上の状態選択ショートバー(2個)をショートし,ライト(Write)モードにします。ライトモードとはマイコンH8/3664fがパソコンからプログラムコードを受け取り,フラッシュメモリに書き込むモードのことです。
JUMPERCLOSE.GIF ←図6.2の2つのジャンパ
JUMPERCLOSE.JPG
<3>AKI-H8/3664f用の5Vの電源スイッチをONにします。
(2)
ソースファイル(ledtest.c)のアイコンを「h8_3664.cmdへの ショートカット」のアイコン上にドラッグアンドドロップします。「コンパイル」~「リンク」~「コンバート」が行なわれた後に,H8のフラッシュメモリ へ,実行プログラムの書き込みが行なわれます。
(3)

 
<1>転送が終了したら、AKI-H8/3664f用の5Vの電源スイッチをOFFにします。
<2>AKI-H8/3664fカード上の状態選択ショートバー(2個)をオープンし,ラン(Run)モードにします。
JUMPEROPEN.GIF ←図6.2の2つのジャンパ
JUMPEROPEN.JPG  
(4)
必要ならパソコン側で「to_H8.ht」をダブルクリックしてターミナルアプリケーション「ハイパーターミナル」を立ち上げます。
 
(5)   AKI-H8/3664f用の5Vの電源スイッチをONにします。

練習1 「LED1を2回,LED2を2回点滅させた後,両方のLEDを2回点滅させる」動作を無限に繰り返すプログラムを作成しなさい。ただし点滅の時間は0.5秒とする。(0.5秒ごとに状態が変化する。)

練習2 LED1を点灯したまま,LED2を0.01秒間隔で点滅させなさい。(人間の目ではLED2の点滅を確認できないが,暗く点灯しているように見える。)

(2)RS232C通信プログラム
PCとH8/3664がRS232C通信(シリアル通信)してデータのやり取りを行なう。H8/3664が動作する時にはPCの方ではハイパーターミナルを動作させておく。通信の規則は次の通りである。
「38400baud,8bit,noparity,1stopbit」
「H8_3664.h」 に用意された関数郡を用いると通信プログラムは次のようになる。ここでH8/3664からPCへのデータ送信はprintf文もどきの関数 「SCI_printf」と「putCharSCI」,PCからH8/3664へのデータ転送は「getCharSCI」「chkgetCharSCI」 「getIntSCI」を用いる。


リスト2 シリアル通信でホストと交信するプログラム
/*シリアル通信でホストと交信する*/
#include "H8_3664.h"

main()
{
    int ch;
    initSCI(); /*シリアル通信インタフェイスの初期化
                38400baud, Async, 8bit , NoParity, stop1*/
    SCI_printf("****** SCI test ******\n");
    SCI_printf("Hit any character key\n");
    while (1) {
        ch=getCharSCI(); /*1文字取得*/
        putCharSCI(ch+1); /*1文字送信*/
        SCI_printf(" test %d %d %x\n",1234,9876,ch);
        SCI_printf(" %c %s %lx\n",'#',"hello",0x80804040L);
        SCI_printf(" %s %c %lx\n","hello",'#',0x80804040L);
    }
}

練習1 「LEDを2回点滅させ,シリアル出力(RS232C出力)へ「Hello world!」を出力する」を無限に繰り返すプログラムを作りなさい。

練習2 「シリアル入力から1から10までの整数値nを受け取り,LEDをn回点滅させる」を無限に繰り返すプログラムを作りなさい。(「getIntSCI」を用いる)

練習3
  シリアル入力から文字Aを受け取ったらLED1を点滅させ,文字Bを受け取ったらLED2を点滅させ,文字Cを受け取ったら両方とも消灯するプログラムを 作りなさい。なお文字の受け取りは何回でも可能で,支持の通りにLEDを駆動するものとする。(「chkgetCharSCI」を用いる)

(3) タイマ割り込み
通常の関数は関数が呼び出された時に起動するが,割り込み関数は要求信号により起動し,割り込み関数が終了すると先ほどまで行なっていた処理の続きに戻るという動作となる。
タイマ割り込みとは,CPUのタイマユニットにより,一定時間間隔で割り込み要求信号を発生し,割り込み関数を実行する機能である。タイマ割り込みを用いると,例えば約33msecごとに割り込み関数を実行することができる。
割り込み関数内で,シリアル通信機能などの処理時間の長い処理を行なってはいけない。
次のプログラムでは,タイマ割り込みを用いて,LEDの点滅を行なう。

リスト3 タイマ割り込みを用いて,LEDの点滅を行なうプログラム
/*タイマー割り込みを起動し,LEDの点滅制御を行なう*/
#include "H8_3664.h"

volatile int cnt=0;

main()
{
    initLed();/*LEDの初期化*/
    initTimerAInt(2); /*タイマAによる約30Hz割り込み*/
    E_INT(); /*CPU 割り込み動作許可*/
    startTimerAInt(); /*タイマA起動*/
    while (1) {
        if (cnt<15) {
            turnOnLed(0);
            turnOffLed(1);
        } else {
            turnOnLed(1);
            turnOffLed(0);
        }
    }
}

/*割り込み関数 関数名は変更してはならない*/
void interrupt_cfunc(void)
{
    cnt++;
    if (cnt==30) cnt=0;
}

練習1 リスト3のプログラムで,約2kHzのタイマ割り込みに変更しなさい。「H8_3664.h」に書いてある説明を参考にして,初期化の引数を変えればよい。

練習2  リスト3のプログラムではLED0のONの時間は15/30に固定である。シリアル入力で0~30の整数を変数durationに受け取り,LED0の ONの時間を0/30~30/30に変更できるようにしなさい。なおこの変更はプログラム起動時に1回だけでなく,プログラム動作中に何回でも変更できる ようにしなさい。タイマ割り込みは約2kHzにしなさい。

7 光センサおよびモータドライブのマイコン周辺回路

 ここで光センサおよびモータドライブのマイコン周辺回路を完成させる。
回路製作にあたっては,実装図を描いてからはんだ付けを行なうこと。

(1)LEDおよび光センサ部
照明用LEDおよび光センサ部は左右2ch分を,LEDの光軸がCDSの直下になるように小基板に実装する。
光センサ部にフォトトランジスタを使用する研究が終っている場合は,フォトトランジスタを用いた回路を使用してもよい。センサ回路の出力をCPUのADコンバータ入力に接続する。図7.1,図7.2,図7.3,図7.4を参照すること。
なおCN1の9,10の位置に,テスタの針で触れやすいように,表側にピンを引き出しておくと良い。


SENSORCIR2.GIF
図7.1 光センサ回路


bottom.JPG
図7.2 車体裏側(左側が前)

sensor.JPG
図7.3 光センサー部(遮光覆いがついている)

図7.4 照明LEDとセンサの移動面よりの高さ

図7.4-2 照明LEDとセンサの取り付け

(1)CDSの足には配線の被覆を履かせて,足同士がショートしないように工夫してある。
(2)照明LEDの照明の中心がCDSの真下になるようにしている。
(3)この写真より,照明LEDをもっと右側に離して取り付けると,照明範囲が広がり,センサの有効領域を広げることができると考えられる。試してみなさい。

図7.4-3 照明LEDとセンサの取り付け

(2)モータドライバ回路
モータドライバへの入力をCPUのPWM出力へ接続する。図7.5を参照のこと。
パワーMOSFETのゲイト入力に対しては電流が流れ込まないため,CPUの出力ピンを直接つなぐことができる。

なおCN2の11,12の位置に,オシロスコープの針で触れやすいように,表側にピンを引き出しておくと良い。

使用したパワーMOS FETの型番とソース,ゲイト,ドレインがどの足に対応するのか調べなさい。

FET型番
(      )
FETを前から見て
左側から(      ),(      ),(      ) (ソース,ゲイト,ドレインの文字を埋めなさい)

使用したダイオードの型番を調べなさい。
(     )

MotorDrive2.GIF
図7.5 モータドライバ回路


(3)シャーシとモータの取り付け
シャーシにモータ,制御回路を組み込み,ライントレーサを完成させなさい。
注意 出来た回路に電源を入れる前に電源のDCジャックから見て,5VラインとGNDがショートしていないかテスタで検査しなさい。3VラインとGNDも同様に検査し,ショートの有無を確かめなさい。3Vラインと5Vライン間も同様にショートの有無を確かめなさい。

図7.6 製作例(今回はここを追加)

図7.7 部品配置例



8. 光センサおよびモータドライブのマイコン周辺回路のテスト
(1) 光センサ回路テスト
(1.1)光センサ回路の調節
注意 ここでの調節で,テスタの針で,信号同士をショートさせないように気をつけなさい。
照明用LEDと遮光覆いをつけて,白紙上の黒いラインを検出させるようにした時,光センサ回路の出力(ADコンバータへの入力)をテスタで電圧を調べて,可変抵抗を調整しなさい。

調整の方法(CDSの場合)
(1) 調整したい方のセンサを黒ラインと白地に交互に置き,光センサ出力(オペアンプ初段への入力,図7.1のオペアンプ5番ピン10番ピン)が2.5Vを中心に振れるようにRcを調整する。(2.0Vから3.0Vとか1.8Vから3.2Vのようにする)
(2) 調整したい方のセンサを黒ラインと白地に交互に置き,光センサ増幅回路の出力(ADコンバータへの入力位置,図7.1のオペアンプ1番ピン14番ピン)が2.5Vを中心に振れ,最大で4.5V,最小で0.5V程度になるようにRbを調整する。
調節結果の報告
センサ位置

実測値
(オペアンプ初段入り口)

実測値
(光センサ増幅回路の出力)

CDSの場合の理想値 フォトトランジスタの場合の理想値
右センサ
黒ラインの上
(    )V (    )V 0~1V 4~5V
右センサ
白地の上
(    )V (    )V 4~5V 0~1V
左センサ
黒ラインの上
(    )V (    )V 0~1V 4~5V
左センサ
白地の上
(    )V (    )V 4~5V 0~1V

この時の結果を次に進む前に担当教員に報告しなさい。
これが出来たら動作は正常である。

(1.2)ADコンバータテストプログラム
H8/3664のADC入力ピンに入力された電圧を,数値に変換する。ADコンバータへの入力が0Vの時,AD変換値は約0,ADコンバータへの入力が約5Vの時(絶対に5Vを超えてはならない),AD変換値は約65000となる。

このためのサンプルプログラムは次のようになる。

リスト4 ADコンバータテストプログラム
/*シングルモードでADコンバータから信号を得る*/
/*シングルモードでは初期化は不要*/
#include "H8_3664.h"

void msecwait(int msec)
/*mesc間なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<1588;j++); /*1588は実測によって求めた値*/
    }
}

main()
{
    unsigned int v0,v1;
    int i;
    initSCI();
    putStringSCI("ADC single mode\n");
    while (1) {
        v0=getADCValue(0); /*ADCch0から入力*/
        v1=getADCValue(1); /*ADCch1から入力*/
        SCI_printf("ch0,1 =");
        SCI_printf(" %4u",v0);
        SCI_printf(" %4u",v1);
        SCI_printf("\n");
        msecwait(1000); /*1秒間おやすみ*/
    }
}

次の実験を行ないどのような値に変換されたか調べなさい。
右側センサ位置 ADCチャンネル(   ) ADCへの入力電圧
黒ライン 変換値(       ) (   )V
白地 変換値(       ) (   )V
中間 変換値(       ) (   )V
左側センサ位置 ADCチャンネル(   )  
黒ライン 変換値(       ) (   )V
白地 変換値(       ) (   )V
中間 変換値(       ) (   )V

これが出来たら動作は正常である。

練習 2つのADCの値を読み取り,ADC0の値の方がADC1の値より大きかったらLED0を点灯させ,ADC1の値の方がADC0の値より大きかったらLED1を点灯するプログラムを作りなさい。この動作は最速ループで行なうことにします。

(2) PWMテストプログラム
モータの電源3Vはまだ供給しないこと。
次のプログラムを動作させなさい。


リスト5 PWMテストプログラム
/*「TimerW」を用いた2系統PWM出力*/
#include "H8_3664.h"

void msecwait(int msec)
/*mesc間なにもしない時間稼ぎ関数*/
{
    int i,j;
    for (i=0;i<msec;i++) {
        for (j=0;j<1588;j++); /*1588は実測によって求めた値*/
    }
}

main()
{
    initSCI();
    initTimerWPWM(1000); /*TimerWの2系統PWM出力の初期化*/
    /*約2kHzの周期のPWM信号が発生される16MHz/8÷1000*/
    while (1) {
        setPWMValueB(1000); /*B系統に1000/1000*/
        setPWMValueC(1000); /*C系統に1000/1000*/
        putStringSCI("PWM 1000/1000\n");
        msecwait(3000);
        setPWMValueB(1000); /*B系統に1000/1000*/
        setPWMValueC(0);    /*C系統に0/1000*/
        putStringSCI("PWM 1000,0/1000\n");
        msecwait(3000);
        setPWMValueB(0);    /*B系統に0/1000*/
        setPWMValueC(1000); /*C系統に1000/1000*/
        putStringSCI("PWM 0,1000/1000\n");
        msecwait(3000);
        setPWMValueB(700); /*B系統に700/1000*/
        setPWMValueC(700); /*C系統に700/1000*/
        putStringSCI("PWM 700/1000\n");
        msecwait(3000);
        setPWMValueB(400); /*B系統に400/1000*/
        setPWMValueC(400); /*C系統に400/1000*/
        putStringSCI("PWM 400/1000\n");
        msecwait(3000);
    }
}

動作したら,ピン間のショートに気をつけながら,CN2の11,12の位置に,オシロスコープの針で触れて,約2KHzでPWM信号が出ている様子を観察しなさい。
約3秒間隔でPWMのデューティ(1周期中のH信号の長さ)が100%,70%,40%と変化しているのがわかると思う。これが出来たら動作は正常である。

次にモータ用の電源3Vをつなぐと,モータが約3秒間隔で,高速回転,中速回転,低速回転するのがわかるであろう。

もしモータの回転方向が逆だったら,モータとドライバをつなぐ配線を逆にすればよい。

練習 シリアル通信で2つの整数値を変数p1,p2に受け取り,右モータにp1の値をPWM値として与え,左モータにp2の値をPWM値として与えるプログラムを作りなさい。永久ループのプログラムとし,絶えず新しい整数値を入力できるようにしなさい。

9. ライントレーサプログラミング
ハードウェアが完成したのであとはソフトウェアで。ライントレースを実現しよう。
2つの光センサのADCの読み取り値により,センサと黒ラインとの位置関係がわかる。またPWMへの出力により,モータの可変速も可能である。あとは自分で考えて制御プログラムを書きなさい。

シンプルなアウトラインは次のようになるであろう。

リスト6 シンプルなアウトライン
#include "H8_3664.h"

main()
{
    int adc0=0; /*ADC0 左側センサの値*/
    int adc1=0; /*ADC1 右側センサの値*/
    int pwmB=0; /*PWMB 右側モータへの指令値*/
    int pwmC=0; /*PWMC 左側モータへの指令値*/

    initTimerWPWM(1000); /*TimerWの2系統PWM出力の初期化*/
    /*約16kHzの周期のPWM信号が発生される16MHz÷1000*/

    while (1) {
        adc0=getADCValue(0);
        adc1=getADCValue(1);
        /*--------------------------------------*/
        /*ここで2つのモータへの出力値を計算する*/
        /* adc0,adc1 → pwmB,pwmC */
        /*--------------------------------------*/
        setPWMValueB(pwmB);
        setPWMValueC(pwmC);
    }
}

光センサ出力値の時間変化率をも考慮すると例えば次のようなアウトラインになるであろう。(改善の余地がある)

リスト7 光センサ出力値の時間変化率をも考慮したアウトライン
#include "H8_3664.h"

main()
{
    int adc0=0; /*ADC0 左側センサの値*/
    int adc1=0; /*ADC1 右側センサの値*/
    int pwmB=0; /*PWMB 右側モータへの指令値*/
    int pwmC=0; /*PWMC 左側モータへの指令値*/

    initTimerWPWM(1000); /*TimerWの2系統PWM出力の初期化*/
    /*約16kHzの周期のPWM信号が発生される16MHz÷1000*/

    while (1) {
        adc0=getADCValue(0);
        adc1=getADCValue(1);
        /*--------------------------------------*/
        /*ここで2つのモータへの出力値を計算する*/
        /* adc0,adc1 → pwmB,pwmC */
        /*--------------------------------------*/
        setPWMValueB(pwmB);
        setPWMValueC(pwmC);
    }
}


10.レポートとタイムアタック競技,プレゼンテーション
(1)各自ライントレーサ製作に関するレポートを提出すること。ただし,レポート採点者はこの指導書の存在は知らない立場で採点する。自分がどの部分に貢献したのかを含めること。レポートはMicrosoftWordを用いて作成し,指示する方法で電子提出すること
(2)タイムアタック競技を行なう。
(3)レポートをもとにプレゼンテーションを行なう。


11.資料
(1)LED L-513LE1T
赤色5φ超高輝度LED 波長625nm、輝度1200mcd(IF=20mA)、指向角15°
アノード(+)からカソード(-)へ電流を流す
足の長い方がアノード(+)
切欠きのある方がカソード(-)

(2)フォトトランジスタ TPS603A
TPS603A

(3)オペレーショナルアンプ LMC660
LMC660

(4)パワーMOSFET 2SK2956
2SK2956

(5)パワーMOSFET 2SK2231
2SK2231

(6)ショットキーダイオード 1S10
モータのノイズ減少のためモータ駆動部につける
1S10
ショットキーダイオードの特徴は,高速,高周波の信号を整流することができること,順方向電圧降下が小さい(0.2V~0.3V,一般のダイオードでは0.6V程度)ことである。

(7)プログラムサンプル
H8/3664のプログラムサンプル
ヘッダファイルH8_3664.h
ヘッダファイル3664F.H

(8)H8/3664の使い方
ここで解説しているマザーボードはCPUカードへの電源供給が7~12Vになっているところが異なる
H8/3664

(9)H8/3664のハードウェアマニュアル
j602223_h83664.pdf

(10)アルミシャーシスピードタイプ
山崎教育システム

(11)実装図テンプレート
実装図テンプレート(PPTファイル)