光センサーは光の強さにより、抵抗値が変わる物質(cds)を利用しています。光が殆どないときは、数十Kオームの高抵抗ですが、、室内照明程度の明るさで、数Kオームまで抵抗が低下します。
このcdsの抵抗変化を電圧として取り出し、PICのAD変換機能を利用すると、光センサーからの電圧により、出力の制御を行うことができます。
図で楕円で囲まれた抵抗の記号がCDS光センサです。CDSの面への明るさが変わると、図の出力端子の電圧が変化します。
setup_adc_ports(AN0);//A0端子をアナログ入力AN0として利用する setup_adc(ADC_clock_div_32);//クロックは内部クロックの1/3216F873は6本のアナログ信号端子があります。まず、まず set_adc_channel(0) で読み込む端子(チャンネル)を指定し、少し時間を置いてから read_adc() で変換値を読み込みます。読み込む値は10bitですから、変数は long 型で宣言します。
long vd;//16ビット整数 set_adc_channel(0);//0チャンネルを選択 delay_us(30);//変換時間待つ vd=read_adc();//変換結果を読む
setup_adc_ports(AN0); setup_adc(ADC_clock_div_32); set_adc_channel(0);コンパイルで、AN0がエラーになる場合、
//A0(2ピン)にCDSの電圧を接続する //Cポートの下位4ビットにLEDを接続する //cds の明るさの変化を15段階にしてポートCのLEDで表示する #include <16F873.h> #device ADC=10 #fuses HS,NOWDT,NOLVP,NOPROTECT,NOBROWNOUT #use delay(clock = 20000000) long vd0,df; int ct,sw,dv; long vmax0,vmin0,vsum0; void main(){ setup_adc_ports(AN0); setup_adc(ADC_clock_div_32); ct=0; vsum0=0; vmax0=0;vmin0=10000; while(1){ set_adc_channel(0); delay_us(10); vd0=read_adc(); if(vmax0 < vd0) vmax0=vd0;//最大の更新 if(vmin0 > vd0) vmin0=vd0;//最小の更新 vsum0 += vd0; if (ct==10) { output_toggle(PIN_B0); vsum0=vsum0/10;//平均 df=(vmax0-vmin0)/15;//最大と最小の間を15レベルにする dv=(vsum0-vmin0)/df; if(dv>15) dv=15;//15を超えたときは15にする ct=0; output_c(dv); } //delay_us(10); ct++; delay_ms(100); } }
電源から20KΩでCDS に接続しCDSの他の端子をグランドに接続します(図では4.7kですが変更、A1に接続するスイッチは不要)。ポートC(下位4ビット)にはLEDを接続します。
プログラムをコンパイルし、MicroCodeLoader 経由でPICに書き込み実行してください。PICにはシリアル接続が必要です。
プログラムを書き込んだら、cds の面を指でふさいで、明るさを変化させます。このとき、LEDの表示が変化することを確認してください。