センサーを使う
センサーの使い方
センサーはPC-2~PC-5につながっています.
ただし,ボタンと同じようにPINCを読んでもずっと0のままだと思います.これは,トランジスタも何もついていないので,センサーの出力が,1になる電圧に足りていないためです.
そこで,A/D変換して電圧を取得します.A/D変換の結果は0~255の8ビットですが,白い紙の上でも40~50くらいのようです.
プログラム例
テキストエディタにコピーして貼り付けて,ad_test.cという名前で保存してください.
A/D変換の結果によって光らせるLEDの数を変えます.白い紙の上にセンサーを乗せるとLEDが光ると思います.距離によって値が変わるので,簡易の距離センサーにもなりそうですね.
センサーと対象物は1mmくらい空けておかないと,うまく読み取れません.
ad_test.c
//////////////////////////////////////////////////////////////////////////// // A/D 変換サンプル // #include<avr/io.h> // 指定された時間だけ待つ void wait(uint16_t w){ while(w--){ volatile uint16_t i=200; while(i--); } } // A/D 初期化 void ad_init(void) { ADMUX = (1<<ADLAR); // 左揃え ADMUX |= (1<<REFS0); //基準電圧 ADCSRA |= (1<<ADEN); // A/D変換許可 ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //A/D変換クロック選択 DIDR0 = (1<<ADC2D) | (1<<ADC3D) | (1<<ADC4D); // PC2,3,4 デジタル入力禁止 } // A/D 変換 uint8_t ad_conv(int8_t n) { ADMUX = (ADMUX&0xF0) | n; // ピン選択 ADCSRA |= (1<<ADSC); // 変換開始 while (ADCSRA & 1<<ADSC) ; // 変換完了を待つ return (uint8_t)ADCH; } int main() { int v; DDRB=0xFF; PORTB=1<<5; // センサーの電源をON DDRC=0x00; DDRD=0xFF; PORTD=0x00; ad_init(); for(;;) { v = ad_conv(2); // A/D変換(センサー1) if (v<2) { PORTD = 0x00; // 0000 } else if (v<4){ PORTD = 0x01; // 0001 } else if (v<8){ PORTD = 0x03; // 0011 } else if (v<12){ PORTD = 0x07; // 0111 } else { PORTD = 0x0F; // 1111 } wait(100); // 少し待つ } }
解説
後日.
A/D変換の設定が少し面倒くさいですが,他に難しい部分はないと思います.
この文書の履歴
- 2006-07-01 作成
Copyright © binzume all rights reserved.