距離センサを利用して、障害物までの距離を測定します。この出力はアナログ信号なので、この信号レベルを調節しPIC88のAD変換機能を利用してディジタル変換し、これをLEDで表示します。
距離センサーには、GP2D12を利用します。これは、赤外線を利用し、対象物までの距離を測定します。測定範囲は5-80cmで、80cm以上の遠距離の測定は困難です。下図1ピンがアナログ出力で、2ピンをグランド、3ピンを5Vに接続します。電源の接続を間違えないよう、注意してください。
この距離センサーからの信号は、2.5V以下ですから演算増幅器を用いて2倍に増幅する必要があります。
距離に対する出力電圧のグラフうぃ示します。距離と共に出力電圧が減少しますが、10cm以下になると、再び電圧が減少するため注意が必要です。また、25cm以上では電圧の変化が少なくなります。また、計測時間も
40mS 程度必要ですから、これ以下の時間で読み取りをしても意味はありません。
http://www.sharp.co.jp/products/device/lineup/data/pdf/datasheet/gp2d12_j.pdf
より
電圧印加後、出力が安定するまで、30mS程度必要です。消費電流は 50mA で半導体部品としては電力が必要です。
オペアンプは信号を増幅したり、直接接続をすると信号レベルが変化してしまうアナログ信号を受け取り安定な出力を供給する目的で使用されます。オペアンプにも多くの種類がありますが、高い周波数(100KHz以上)、高度な安定性、大きな出力、などが必要でない場合、「汎用型」のオペアンプなら何でも利用できます。
オペアンプは、±両極性の信号を扱う場合、±の電源が必要ですが、ここでは、入力電圧は
+ ですから、単電源用のオペアンプが利用できます。ここでは、LM358 を利用します。
オペアンプの増幅度は外付けの抵抗で定まります。下の回路は「非反転増幅回路」で増幅率は二つの抵抗R2,R1より、1+
R2/R1で定まります。R2=R1 の場合増幅度は2になります。
PIC16F88はPIC16F648の機能に加えて、AD変換機能が組み込まれています。ポートA側の端子はアナログ端子と共通ですので、アナログとディジタルの切り替えが必要です。
PIC16F88は内部発振回路が組み込まれているので、これを利用します。
詳細は、PIC入門の「アナログ処理」を参照してください。
ここでは、16F88に発振子を接続します。セラミック発振子の中央のピンをグランド、両側のピンをPICの15,16ピン(OC1,OC2)に接続します。
左の3ピンのコネクタに距離センサーを接続します。距離センサーを前方上から見た場合、向かって左が1ピン(信号)になります。2ピンはグランド、3ピンはVCC(5V)に接続します。
この信号を汎用のOPアンプ LM358 で2倍に増幅します。LM358の4ピンにグランド、8ピンにVCC(5V)の電源を接続します。
PIC16F88にはアナログ入力の最大電圧を自身の参照電圧発生機能で変更できますが、ここでは、他の応用を考えて、OPアンプを利用します。利用しているOP(おぺ)アンプは、「単一電源対応」型なら何でも構いません。
この図は16F88を利用していますが、16F873でも同様です。光センサーの項を参照してください。
A0端子をアナログ入力として利用するには、
setup_adc_ports(sAN0);
で設定します。また、ADコンバータ用のクロックを指定するため、ここでは、
setup_adc(ADC_CLOCK_DIV_32);
を行います。
アナログ信号は、A0、..、A3 までの4本の信号を切り替えて選択可能です。A0、..、A3
の信号は0から4のチャンネルに対応します。0チャンネルに設定すると、A0端子の信号を読み取ります。
set_adc_channel(0)
でチャンネルを設定し、
value=read_adc();
でアナログ信号を、10bitのディジタル信号として読み込むことできます。ADコンバータからの信号は10bitですから、この信号を受け取るには、
long 型(16bit)の変数が必要です。ここでは、AD変換した値を4で割って8bitに変換し、結果をLEDで表示しています。
PICに16F873(マイクロローダ)を用いる場合、#include #fuses をコメントしたものと交換してください。
//RA0:アナログ入力 //RB0: ディジタル出力 #include <16f88.h> //#include <16f873A.h> #fuses HS,NOWDT,NOLVP,NOMCLR //WDT,LVPなし //#fuses HS,NOWDT,NOLVP //16F873の場合 #use delay(CLOCK=20000000) #byte port_b = 6 long value; int vu8,vl2; void main() { set_tris_b(0x0); setup_adc_ports(sAN0); setup_adc(ADC_CLOCK_DIV_32); while(1){ set_adc_channel(0); delay_us(60); value=read_adc(); vu8 = value/4; port_b = vu8; delay_ms(200); } }
このセンサーの出力は距離に比例していません。距離とサンサー出力のグラフを作成し、これを折れ線近似して、距離に比例する出力を出すようなプログラムを作成してください。
数字表示やバーLEDの表示を試してください。
距離により音の高さが変わるプログラムを作成し、簡易「テルミン」もどきを作成してください。