第5回 インターフェイス:センサからの入力によるA/D変換

Figure:自然界とコンピュータ
自然界は、時間や物理量が連続的な値をとる世界です。ところがコンピュータは、時間や物理量を離散的にしか扱うことができません。そこで、連続的な量を離散的に扱う変換が必要になります。アナログからデジタルへの変換を行うさいには、連続的なデータをある離散的な区分に区切って、各区間ごとの代表点をサンプルします。ここでA/D コンバータが必要になります。A/D コンバータはアナログ信号をデジタル信号に変換する「変換器」の名称です。
例えば、入力可能なアナログ電圧が0~5V に対して、A/D コンバータが10 ビットである場合、1024 個の数を扱うことができるので、デジタルに変換したときの最小の電圧区分は、5/1024 = 5mV になります。ATMega168 には10 ビットのA/D コンバータが6 チャンネル用意されています。
A/D 変換の手順は
- 1. レジスタA にAD 使用のためのビット情報を書き込む
- 2. チャネルを選択する
- 3. AD スターとのビットをたてる
- 4. 変換完了ビットをみて、データレジスタ内の値を取り込む
AVR のA/D コンバータには内部基準電圧が用意されています。この内部基準電圧をA/D コンバータ内の基準電圧として使用します。
A/D 変換の変換値は、

で計算されます。

Figure:AD 変換の概念図
A/D 変換プログラミング
#include <avr/io.h>
int main()
{
int x;
DDRB= 0xFF; //PORTB はすべて出力
DDRC= 0x00; //PORTC はすべて入力
ADCSRA= 0x80; //AD コンバータ機能をON
ADMUX= 0x01; //ch1 を選択(cds がつながっている)
while(1){
ADCSRA |= 0x40; //AD 変換スタート
while(ADCSRA & 0x40); //変換終了待ち
x=ADC; //変換した値をADC から取得
PORTB= (x>>2); //上位8bit を表示
}
return 0;
}
光センサを使ったI/O プログラミング
光センサ
光センサとしてCds を用います。これは硫化カドミウムセルの略です。Cds は当たる光の量に従って抵抗値が変化する電子ディバイスです。光の量は抵抗値に変換され、セルに当たる光が多ければ、抵抗値は低くなります。約数百~数MΩ の広いレンジで電気抵抗が変化します。ただし反応速度は低いので、光通信には向きませんが、街灯を自動的にオン・オフさせるスイッチとしてよく使われています。

Figure:AD 変換の概念図
課題
手を光センサにかざしたら、音楽が鳴り始めるプログラムを書こう。スイッチからの入力の時に使ったif 構文による条件分岐を使います。センサからの入力であるADC をx に読み取って、x に関する条件分岐の構文を作ります。
赤外線センサを使ったI/O プログラミング
赤外線センサ
赤外線リモコン受信モジュールを使って、赤外線による信号を受信します。このもモジュールは、変調された赤外線信号を増幅・成形出力まで行うデバイスうです。市販品では38kHZ~40kHz あたりに変調された赤外線に対して受信感度のピークをもつものが多い。出力端子には、デジタル信号[0][1] に対応して、[0V][5V]が出力されます。
A/D 変換プログラミング
#include <avr/io.h>
int main()
{
int l;
DDRB= 0xFF; //PORTB はすべて出力に設定し、LED を点灯させる
DDRC= 0x00; //PORTC はすべて入力に設定し、スイッチ類からの入力に使う
DDRD= 0xFB; //D ポート2 番ピンにモジュールがあるので、そこを入力に使う
while(1){
if((PIND&0x04)!= 0) PORTB= 0;
else{
PORTB= 0xFF;
for(l=0; l<10000; l++);
}
}
return 0;
}
以下は毎回使うプログラムのコンパイルと転送コマンドです。いずれもスーパーユーザになってから実行します。スーパーユーザになるためにはsu と入力します。whoami と入力して「root」と表示されればスーパーユーザになっていることが確認できます。
- 1. コンパイル命令:途中に小文字のo と大文字のOがありますが、いずれも「オー」です。avr-gcc -mmcu=atmega168 -o t
- 2. 実行ファイルへの変換:大文字のオーがあることに注意してください。avr-objcopy -O ihex test1.elf test1.hex
- 3. プログラムをボードに転送する命令:ep00 は「ゼロゼロ」です。avrdude /dev/usbdev1.1_ep00 -c usbasp -p m168 -



