センサーを使う

センサーの使い方

センサーは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変換の設定が少し面倒くさいですが,他に難しい部分はないと思います.

この文書の履歴

Copyright © binzume all rights reserved.