人感センサー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 );
}