AVRとPSDセンサの接続

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
keysumer

AVRとPSDセンサの接続

#1

投稿記事 by keysumer » 8年前

AVR(ATmega328P-20PU)と、PSDセンサ(SHARP 2Y0A21)を接続し、ADCにより変換された値をUARTでパソコンに送信し、TeraTermで値を読むというプログラムを作成しています。

反固定抵抗をセンサーの代わりに用いた際は、以下のプログラムで、0~1023の値を読むことが出来ました。
しかし、このセンサーに変更して値を読むと、8~19程度のとても小さな値しか返ってこないのです。

マイコンへの接続は、ADCピンに直で繋いでいます。

PSDセンサーの故障かとも思い、いくつかのセンサーで試してみましたが、どれも同じ結果でした。

プログラムの問題なのでしょうか、それともセンサーとマイコンの間に、コンデンサなどのフィルタを入れるなどの、ハード的な問題なのでしょうか。

回答のほど宜しくお願いします。

コード:

#include<avr/io.h>	/*DDR,PORTの指定が可能*/
#include<util/delay.h>	/*delayが利用可能*/
#include<math.h>

//#define F_CPU 1000000UL;	/*CPUのクロック周波数を設定*/


volatile unsigned short cnt=0;		/*ADC格納用,最適化防止, 0~65535*/
volatile unsigned short sum=0;

unsigned short adc[100];
unsigned char data[6];			/*Tera term転送用データ 格納用配列*/
static unsigned int i=0;
static unsigned int j=0;




int main(void){


/////////////////////////////////////////////////////*Port*////////////////////////////////////////////////////////////////////

/*LED用*/
DDRB  = 0b11111111;	/*PORTB全てを出力モード*/
PORTB = 0b00000000;	/*PORTBを初期化*/

/*PSD用*/
DDRC  = 0b11101111;	/*PC5のみ入力モード*/
PORTC = 0b00000000;	/*PORTCを初期化*/

/*Speaker用*/
DDRD  = 0b11111111;	/*PORTD全てを出力モード*/
PORTD = 0b00000000;	/*PORTDを初期化*/



///////////////////////////////////////////////////*Resister*///////////////////////////////////////////////////////////////////


/*ADC用*/

ADCSRA = 0b10001111;	/*1/1024のプリスケーラ*/
ADMUX  = 0b00000101;	/*ADC5を使用*/
_delay_ms(5);			/*ADMUXの設定終了まで待機*/


/*Speaker用*/

TCCR1A = 0b10000010;
TCCR1B = 0b00011001;
TCCR1C = 0x00;
TIMSK1 = 0x00;

OCR1A  = 1300; /*音色変更*/ 


/*Serial用*/

UBRR0  = 25;		/*動作周波数/(ボーレート*16)-1*/
UCSR0A = 0b00100000;
UCSR0B = 0b00011000;
UCSR0C = 0b00000110;




	while(1){
		
		sum = 0;


		for(j=0;j<9;j++){
			
			ADCSRA = ADCSRA | 0b01010000;	/*ADCスタート,ADC割り込みスタート*/
			while(bit_is_set(ADCSRA,ADSC));	/*ADCが終了(ADSC=0)するまでloop*/
			
			
			adc[j] = ADC;	

			sum += adc[j];
		
		}
		
		cnt = sum/10;

		
		data[0]='0'+(cnt/10000)%10;
		data[1]='0'+(cnt/1000)%10;
		data[2]='0'+(cnt/100)%10;
		data[3]='0'+(cnt/10)%10;
		data[4]='0'+cnt%10;
		data[5]='\n';		

		
		for(i=0;i<6;i++){

			while(!(UCSR0A&0b00100000));
			UDR0 = data[i];
			_delay_ms(30);

		}


		while(!(UCSR0A&0b00100000));
		UDR0 = '\r';
		_delay_ms(10);



		if(0<=cnt && cnt<=10){
			PORTB = 0b01111101;
			ICR1  = 0;
		}
		else if(20<cnt && cnt<=25){
			PORTB = 0b00000101;
			ICR1   = 3821;/*C*/
		}
		else if(15<cnt && cnt<=20){
			PORTB = 0b00001101;
			ICR1   = 3404;/*D*/
		}
		else if(10<cnt && cnt<=15){
			PORTB = 0b00011101;
			ICR1   = 3032;/*E*/
		}		
		else if(5<cnt && cnt<=10){
			PORTB = 0b00111101;
			ICR1   = 2862;/*F*/
		}
		else if(30<cnt && cnt<=35){
			PORTB = 0b01111101;
			ICR1   = 2550;/*G*/
		}
		else if(35<cnt && cnt<=40){
			PORTB = 0b01111101;
			ICR1   = 2271;/*A*/
		}
		else {
		
			PORTB = 0b00000000;
			ICR1   = 2023;/*B*/
		}
	}
	return 0;
}



keysumer

Re: AVRとPSDセンサの接続

#2

投稿記事 by keysumer » 8年前

説明が不十分だったので、補足します。

PSDセンサーから読み取った値に応じて、点灯するLEDの数を変更し、スピーカーから出す音の音色を変更しています。

この2つの動作は、反固定抵抗の時には正常に動作していました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: AVRとPSDセンサの接続

#3

投稿記事 by softya(ソフト屋) » 8年前

使ったことがないセンサーですので間違っていたらすいません。
オシロやテスターで電圧などの確認はできてますか? ADCピンに入っている電圧を確認して下さい。回路ミスの可能性が捨て切れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

keysumer

Re: AVRとPSDセンサの接続

#4

投稿記事 by keysumer » 8年前

現在確認したところ、最大で0.1V程度しか入っていないことが分かりました。

反固定抵抗の方では、0~4.9V程度まで変動することが確認できました。

となると、PSDセンサーの配線を間違えているということでしょうか?
データシート通りに、Vcc(黒)は電源、GND(赤)はGND、Vo(白)はADCに接続しているのですが、

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: AVRとPSDセンサの接続

#5

投稿記事 by softya(ソフト屋) » 8年前

2Y0A21のデータシートを見る限り、3Vまでセンサは出力されるんですよね。
AVRとの結線を外して2Y0A21のoutput電圧を確認してみてください。テスタの問題で電圧が正しくないかもしれません。AVRを切り離して問題を切り分けましょう。

AVRとの接続が問題なら、AVRのプルアップとかでしょうかね。
ATmega328P-20PUのデータシートを確認して、ADCピンの初期化を再確認してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

keysumer

Re: AVRとPSDセンサの接続

#6

投稿記事 by keysumer » 8年前

PSDセンサーのVccとGNDを電源に直に接続し、テスターの+を信号線に、-をGNDに接続して電圧を測定しました。

その結果、2.1Vから値が変動していないことが分かりました。
これは、どういったもんだいなのでしょうか。

keysumer

Re: AVRとPSDセンサの接続

#7

投稿記事 by keysumer » 8年前

今、別のセンサーで確認したところ、AVRとの結線なしで、同じように計測したところ、値の変動がみられました。

しかし、信号線をADCピンに接続して、電圧を測定してみると、0.1V程度のとても小さな値になってしまうことが分かりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: AVRとPSDセンサの接続

#8

投稿記事 by softya(ソフト屋) » 8年前

初期化の問題でADCのピンがちゃんと入力になっていない可能性があります。
あるいは、プルアップorプルダウンの可能性です。
ATmega328PのADC利用時の初期化を再確認してください。
私はATmega328Pを使っていないので勘で答えれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

keysumer

Re: AVRとPSDセンサの接続

#9

投稿記事 by keysumer » 8年前

大変申し訳ありません。
非常に単純なミスをおかしていました。

PSDを接続しているピンが出力モードになっていました。
(正確には、PC5ではなくPC4が入力になていました。)

こちらを変更したところ、万事うまくいきました。

この問題に気づくのに遅れた原因としまして、自分の不注意と共に、
反固定抵抗を用いていたことがあると思います。


回答者様の貴重な時間を割いてしまい申し訳ありませんでした。

今後は、このような事にならないよう注意します。
ありがとうございました。

keysumer

Re: AVRとPSDセンサの接続

#10

投稿記事 by keysumer » 8年前

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る