第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 -