宇都宮大学工学部平田研究室のホームページです。

Hirata Laboratory

PICマイコンカーを用いたオープンキャンパスプロジェクト2007 #2

武田のページ

目次

はじめに
基礎知識
製作
結果
参考文献

はじめに

PICマイコンとセンサをミニカーに搭載し,スタート地点から2m先のゴール地点まで直進させ停止させる.という目的に沿って、 センサとしてローム製のフォトレフレクタRPR-220を用いて、ミニ四駆のタイヤの回転回数を制御することを個人の目標 とし製作する。

基礎知識

フォトリフレクタとは

フォトリフレクタ

フォトリフレクタは上図のように発光素子(赤外線)LEDと受光素子(フォトトランジスタ)が1つのケースに組み込んだ 光センサで、対象からの反射光を検出できるようになっている。ただ、フォトリフレクタは数mmの距離でしか反応しないので 、近接型センサとして使用する。
フォトランジスタには可視光遮断フィルタがついていて外乱光の影響が受けにくく、そのため黒っぽく見える。

赤外線LEDとは

発光ダイオードの一種で、赤外線波長の光を発生するようにしたものである。この赤外線LEDは光を遠くまで届かせられるように 非常に大きなパルス電流で点灯させるようになっていて、100μsec以下の短パルスであれば最大1Aの順電流が流せるようなものも ある。
また、1Aまでの電流に比例して発光強度が強くなるようになっている。

フォトランジスタとは

トランジスタのベースに光を受けると、光の強さに比例して出力(コレクタ)電流が流れるので、光の強さを知ることができる。

(例)
白と黒の紙に対して反射させる場合、出力は白紙に対しては反射光が多いのでコレクタ電流が大きくなり、フォトトランジスタに 接続された負荷抵抗の電圧降下が大きくなり、コレクタ電圧が下降する。
逆に黒紙に対しては、黒は赤外線を吸収するので反射光が少なくなり、結果的にコレクタ電圧が上昇する。
この電圧の大小で白か黒か判別し、1つのパルスを作る。

出力電圧波形

製作

実装

下図のようにミニ四駆のタイヤの内側にアルミと黒の紙を貼り付け、 それにセンサを向けるように取り付ける。

タイヤは1回転で約8cm進むので1回転で1回のパルスだと最大8cmの誤差が生じる、2回のパルスだと最大4cmの誤差が生じる、 また3回のパルスだと最大2.6cmの誤差が生じる。
この結果より誤差を少なくするためには1回転で多くのパルスを発生させればいいが、タイヤにつけるアルミや黒紙の太さ も考慮しなければいけないので、1回転で2回パルスを生じさせるようにした。
ここで白紙からアルミに変更したわけは白紙だとしっかりと反射してくれないときがあるためアルミにした。

タイヤとフォトリフレクタ フォトリフレクタ取り付け図

回路図

回路図

フォトリフレクタ

回路図の左部分のフォトリフレクタの基本回路では、受光側のフォトトランジスタのコレクタ側に負荷をおいたコレクタ負荷回路で、 出力負荷に50KΩの半固定抵抗を接続して、検出感度を調整できるようにする。 また、発光LED側には100Ωの抵抗をつけ数十mA程度のやや多目の電流を流すようにして感度を高める。

モータドライバ

回路図の右側にあるのはモータードライバでTA7291Pを使用している。
モータードライバを使うことで、モータを制御することができ停止、正転、逆転をすることができる。
4番目の端子についている半固定抵抗はモータの電源電圧を調整する為のものである。
モータドライバについての詳しい説明は他のページで詳しく載っているので省略する。

LED

LEDはアルミの検出(カウント)回数を2進数で示すためのものである。

取り付け図

斜めから見た車体 上から見た車体 後ろから見た車体

プログラム

はじめに、アルミを検出したらカウント+1とするプログラムを作る。
このとき、アルミと黒の境界でセンサの出力電圧にブレが生じるのでチャタリング防止をプログラムに施す。
2メートルミニ四駆を手押ししてカウント数を確認すると49であったので目標カウント数を49とする。

・プログラムを以下のように考え変更を加えていった。

最初に、目標カウント数で止まるようなプログラムを考え実験してみたが惰性の影響で行き過ぎた。
次に、常にカウント数を見て49より少なかったら正転、多かったら逆転しカウントを下げて、 49でストップというようなプログラムを考えたが、カウントが50になったとき逆転の命令をだすが惰性のほうが勢いが強く、 逆転せずに進んでしまうため新たなプログラムを考えた。
新たに考えたのは、はじめ正転させカウントが49になったら停止させ、数秒後にカウント数を見て49より少なかったら正転、 多かったら逆転しカウントを下げ、49になったら停止、ということを繰り返し停止させるプラグラムを作った、がやはり惰性の影響が強く、 安定するまで時間がかかるので以下のようなプログラムに改良した。


プログラム
フローチャート
全体的な処理の流れを簡単に以下に記す。


待ち時間を1.8秒にしたのは待っている間ストレスを感じなく、なおかつミニ四駆が完全に止まることを考慮した結果 である。

またカウント34で1回停止させるのは、惰性でおよそ15カウント分進むためである。

実験動画

結果

以上のプログラムで実験してみると誤差が±2cm以内になったので目的に達したといえる。 しかし、電池のパワーの状態でミニ四駆が後退できない。 これは本来ミニ四駆は前進するためのものなので,後退するときギヤに上手く力が伝わらないためである。

参考文献

  • 鈴木美朗志"たのしくできるC&PIC実用回路"東京電機大学出版局,(2004)
  • 後閑哲也"誰にでも手軽にできる電子工作入門"技術評論社,(2001)

リンク

PICマイコンカープロジェクトTOP
・各個人のページ
 ∟大沼 /坂田 /武田 /橋本 /江田











プログラム

#include   //条件-1.目標回転数は256未満
#include"delay.h"
__CONFIG(HS&WDTDIS&PWRTEN&UNPROTECT);
void ioport(void);
void interr(void);
void teisi(void);
char a=49; //目標回転数
char c=0;
char f =1; //停止して1.8秒経ったフラグ	
char d = 0;
void main()
{
	char sw = 1;
	PORTB=0;
	ioport();
	interr();
	RA0=0;
	RA1=0;
	if(RA2==0)
	{		
		DelayMs(250);
		while(1)
	{		
	if(f==1)
	{
		teisi();
	}
	while(sw==1)
	{
		if(f==1)
		{
			teisi();
		}
		sw=RA4;
		DelayMs(2);
		if((RA4==0)&&(sw==0))
		{
			if(d==1) //正回転のとき
			{
				PORTB=PORTB++;
			}
			else    //逆回転のとき
			{
				PORTB=PORTB--;
			}
			if((PORTB==a)||(PORTB==a-15))
			{
				RA0=0; //停止
				RA1=0;
				GIE=1; //タイマ0割り込みスタート
			}
		}
	}
	sw=RA4;
	DelayMs(2);
	}
	}
}
void ioport(void)
{
	TRISA=0x14;  //入力をRA4,RA2のみ
	TRISB=0;
}
void interr(void) //タイマ0設定
{
	GIE=0;
	T0IE=1;
	T0IF=0;
	TMR0=0;
	T0CS=0;
	PSA=0;
	PS0=1;
	PS1=1;
	PS2=1;
}
interrupt isr() //割り込んだとき
{

	T0IF=0;
	c=c+1;
	if(c==69)  //1.8秒経ったとき
	{
		f=1;
		c=0;
	}
}
void teisi (void) //停止して1.8秒立ったとき
{
	GIE=0;
	f=0;
	if(PORTB!=a) 
	{
		if(PORTB<a)
		{
			RA0=1;  //正転
			RA1=0;
			d=1;	
		}
		else
		{
			RA0=0; //逆転
			RA1=1;
			d=0;
		}	
	}
}

フローチャート

フローチャート
△Page Top