人感センサーAKE-1(RE-210)と16ビットADコンバーターMCP3425(K-08018)で人感してみた
 
AKE-1(RE-210)このセンサー結構扱い難しいですよね。
今回は今週れに入れたADC(MCP3425(K-08018))を使ってarduinoにて人感センサーしてみます。
 
■こんな感じで動きます。
https://youtu.be/159qh-mHIHg

 
■回路
 

 
■プログラム解説
ADCコンバーターから受け取った電圧100回分の平均と直近の1回分を比較して
5mV違った場合に変化があった(人を検出)と判断してLEDを10秒間点灯します。
■プログラム
 

#include <Wire.h>
#define MCP3425_address 0x68

#define TABLE_MAX 100
float table[TABLE_MAX];
int table_idx=0;

void setup()
{
    //
    pinMode(13, OUTPUT);
    //
    Wire.begin();
    Serial.begin(9600);
    Serial.println("AKE-1(RE210)---adc mcp3425");

    //モード設定 16ビット 15回/秒 PGA=1 連続変換モード
    Wire.beginTransmission(MCP3425_address);
    Wire.write(0b10011000);
      // bit7 :レディービット
      //        読み込み時
      //         0=レジスタ更新あり、1=レジスタ更新なし
      //        書き込みで連続変換モード時
      //         影響なし
      //        書き込みでワンショット時
      //          0=影響なし
      //          1=新しい変換を開始
      // bit6  :使用しない
      // bit5  :使用しない
      // bit4  :変換モード
      //         1=連続
      //         0=ワンショット(ワンショット後低電力モードへ)
      // bit3-2:サンプルレート
      //         00=240回/秒(12ビット)
      //         01= 60回/秒(14ビット)
      //         10= 15回/秒(16ビット)
      // bit1-0:PGAゲイン(前段のアンプみたいなやつ)
      //         00=1倍
      //         01=2倍
      //         02=4倍
      //         03=8倍
    Wire.endTransmission();
    
    //table初期化
    for(int i=0;i<TABLE_MAX;i++){
      table[i]=0.0;
    }
}

int led_count=0;
void loop()
{
    //
    int adcValue = getADC();
    float Volts = (int)adcValue * 2.048 / 32767.0 ;
    //Serial.println(String(Volts,5));
    //Serial.print(" ,");
    //Serial.println(adcValue);

    //tableの平均を求める
    float total = 0;
    for(int i=0;i<TABLE_MAX;i++){
      total = total + table[i];
    }
    float ave = total / TABLE_MAX;

    //比較
    if(Volts < (ave - 0.005)){
      digitalWrite(13, HIGH);
      led_count=0;
      Serial.print("volt = ");
      Serial.print(String(Volts, 5));
      Serial.print(" ave = ");
      Serial.println(String(ave, 5));
    }
    
    //tableに格納
    table[table_idx]=Volts;
    table_idx++;
    if(table_idx>=TABLE_MAX){
      table_idx = 0;
    }

    if(led_count>1000){
      digitalWrite(13, LOW);
    }
    led_count++;
    delay(10);
}
 
int getADC()
{
    Wire.requestFrom(MCP3425_address, 2);
    int nfRtn = (Wire.read() << 8 ) + Wire.read();
    return ( nfRtn );
}