照度センサ

このエントリーをはてなブックマークに追加

 

 今回は照度センサです。照度センサでは明るさを取得することができます。取得する明るさの単位は[lx](ルクス)です。今回のシステムでは室内の照度を対象としています。太陽光を測定する場合、フィルタをつけて明るさを抑えるなどの改造が必要です。
 以前作成した7セグメントディスプレイシステムにシリアル通信を使用して照度を送り表示します。

 回路図およびプログラムに関する各種詳細は、以下の記事を参考にしてください。

 

1.今回使用するPICについて

 今回使用するPICは「PIC12F1822」です。

 

2.回路

2.1 電子回路図

 

 

2.2 電子回路の写真

 


抵抗の左側にあるのが照度センサです

 

2.3 回路説明

2.3.1 使用するパーツ一覧
パーツ名 説明 使用数
PIC12F1822 PIC本体 1
照度センサ(S9648-100) 照度センサ 1
抵抗(1[kΩ]) 電源電圧により変更すること 1

注:PICと照度センサにはバイパスコンデンサをつけることを推奨します。つける場合、コンデンサ容量は0.1[μF]でいいと思います。無くても問題なく動作はしていますが、安定しているかどうかはわかりません。

 

2.3.2 PICの配線
PICのピン 接続 補足
VDD 電源 5[V]
RA0 シリアル通信(TxD:送信) 7セグメントディスプレイへデータ転送
RA1 -未使用-  
RA2 -未使用-  
RA3 -未使用-  
RA4 照度センサ(S9648-100)  
RA5 -未使用-  
VSS グランド  
2.3.3 照度の計算方法

 照度を求める場合、以下の計算を行います。

照度 = 電流 / 照度係数

照度係数 = 0.26[mA]/100[lx]
電流 = 電圧 / 抵抗

 

2.3.4 取得可能照度

 今回は最大999[lx]とします。7セグメントディスプレイが3桁であるためと、室内では3桁で十分なためです。もし999[lx]を超えた場合、999[lx]を表示します。

 

3.プログラム

 プログラムの基本的な部分は以下の記事を参考にしてください。AD変換に関しては温度センサの記事を参考にしてください。

3.1 プログラムの説明

 プログラムを見ながら以下の説明を見てください。ソースコードは次の節にあるので、そちらを参照してください。

 

3.1.1 グローバル変数の宣言
#define _XTAL_FREQ 32000000

#define TX_UART_SIZE 3

#define VOLTAGE_REFERENCE   5000
#define VOLTAGE_RESOLUTION  1024
#define R1_OHM              1000

volatile unsigned char uart_tx_msg[TX_UART_SIZE] = {0};
volatile unsigned char uart_tx_cnt = 0;

 定数の宣言およびグローバル変数の宣言。グローバル変数は7セグメントディスプレイへのシリアル通信でのデータ転送用です。

 

3.1.2 シリアル通信用割り込み処理
void interrupt isr_ctrl( void )
{
    if( TXIF )
    {
        if( uart_tx_cnt < TX_UART_SIZE )
        {
            TXREG = uart_tx_msg[ uart_tx_cnt ];
            uart_tx_cnt++;
        }
        else
        {
            TXIE = 0;
        }

        if( uart_tx_cnt >= TX_UART_SIZE )
        {
            uart_tx_cnt = 0;
            TXIE = 0;
        }

        TXIF = 0;
    }
}

 シリアル通信でのデータ転送処理です。

 

3.1.3 PICの初期設定
unsigned short ad_data;
long voltage,current;
short work1,work2,work3,work4,illuminance;

OSCCON = 0b01110000 ;    // 内部クロック8MHz

ANSELA = 0b00010000 ;    // AN3をアナログにし、他はデジタルI/Oに割当てる
TRISA  = 0b00011010 ;    // RA1,3,4を入力にし、他は出力に割当てる
PORTA  = 0b00000000 ;    // 出力ピンの初期化(全てLOWにする)

ADCON1 = 0b10100000 ;   // 右寄せ、Fosc/32,VDDをリファレンスにする

ADCON0 = 0b00001101 ;   // AN3を使用する
__delay_us(5);          // ch設定後、反映待ち

TXSTA   = 0x24;         // 送信情報設定:非同期モード 8ビット・ノンパリティ
RCSTA   = 0x90;         // 受信情報設定
BAUDCON = 0x08;         // 16bit

SPBRG  = 0x40;          // ボーレートを9600(高速モード)に設定
SPBRGH = 0x03;

RXDTSEL = 0;
TXCKSEL = 0;

TXIE    = 0;
TXIF    = 0;
PEIE    = 1;
GIE     = 1;

 各種初期設定です。周波数、ポート設定、シリアル通信設定などを行っています。

 

3.1.4 AD変換
// AD 変換
GO_nDONE = 1;   // 変換開始

// アナログをデジタルに変換
while( GO_nDONE )
{
    // wait
}

ad_data = ADRESH;
ad_data = (ad_data << 8) | ADRESL;

 AD変換し電圧の取得を行っています。

 

3.1.5 電圧から照度計算
// mVへ変換
voltage = ((long)VOLTAGE_REFERENCE * (long)ad_data) / VOLTAGE_RESOLUTION;

// mVからuAを求める
current = (voltage * (long)1000) / (long)R1_OHM;

// uAからlxへ変換
illuminance = (short)(current * (long)100 / (long)260);

 取得した電圧から照度を求めています。PICは小数点の計算は苦手なので、できる限り整数にしています。

 

3.1.6 照度を7セグメントディスプレイPICへ送信
if( illuminance < 1000 )
{
     // 位で分割
    work1 = illuminance % 10;
    illuminance /= 10;
    work2 = illuminance % 10;
    illuminance /= 10;
    work3 = illuminance % 10;
    illuminance /= 10;
    work4 = illuminance;

    // 送信データ構築
    uart_tx_msg[0] = 0x00;  // 少数点位置の設定
    uart_tx_msg[1] = 0x0f & work3;
    uart_tx_msg[2] = (work2 << 4) | work1;
}
else
{
    // 送信データ構築
    uart_tx_msg[0] = 0x00;  // 少数点位置の設定
    uart_tx_msg[1] = 0x09;
    uart_tx_msg[2] = 0x99;
}
uart_tx_cnt = 0;
TXIE = 1; // 送信開始

 照度をシリアル通信を使用して7セグメントディスプレイに送信するためのデータを作成しています。

 

3.2 ソースコード

 プログラムの全文を掲載します。

  プログラム新しいウィンドウで開く

<注意>
ファイル名は必要に応じて変更し利用してください。
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。

    

 

5.動作確認

 起動すると7セグメントディスプレイに照度を表示します。

 

<更新履歴>

 

 日付  内容
2015年7月26日 新規作成
2016年10月7日 フォーマット変更(内容の変更はなし)

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)