人感センサ

概要

SP&PIRリーフに搭載された近距離検出用途の赤外線センサIC(AKM AK9754AE)を使って、人が近づいたら音が鳴るシステムを作りましょう。

ir_about

使用するリーフ

以下のリーフを使用します

Type Name Q’ty
AZ62 Connector Cover 1
AI02 SP&PIR 1
AZ01 USB 1
AP01 AVR MCU 1
AV01 CR2032 1
CR2032 coin cell battery 1
M2*15mm screw 2

リーフの組み立て

下図のようにリーフを組み立てましょう。

assemble1

ソースコード

Arduino IDEで下記のプログラムを書きましょう。

//=====================================================================
//  Human Sensing
//
//    (c) 2021 LEAFONY SYSTEMS Co., Ltd
//    Released under the MIT license
//    https://opensource.org/licenses/MIT
//
//      Rev.00 2021/04/01  First release
//=====================================================================
#include <Wire.h>

#define I2C_PIR_ADDR   0x65
#define I2C_SEND_BUF_LENGTH 10
#define I2C_RECV_BUF_LENGTH 10

unsigned char i2c_sendBuf[I2C_SEND_BUF_LENGTH];
unsigned char i2c_recvBuf[I2C_RECV_BUF_LENGTH];

double irData;
double tempData;

// Function to be called when a person is detected
void onHumanDetected()
{
  Serial.println("Detect!");
  tone(5, 262, 300);  // Make a beep sound
}

void setup() {
  // initialize serial communication at 115200 second per second:
  Serial.begin(115200);
  // initialize i2c communication with AK9754AE:
  Wire.begin();
  delay(100);

  // Human sensor setting
  i2c_write_byte(I2C_PIR_ADDR, 0x20, 0xFF); //CNTL1  Resrt
  i2c_write_byte(I2C_PIR_ADDR, 0x2A, 0xF2); //CNTL11 Human detection algorithm enabled / Interrupt output enabled
  i2c_write_byte(I2C_PIR_ADDR, 0x25, 0x0F); //CNTL6  Sensor gain 205% (maximum)
  i2c_write_byte(I2C_PIR_ADDR, 0x2B, 0xFF); //CNTL12 Mode=1 start Meas(Continuous measurement mode)
  delay(1000);

  // Human proximity detection interrupt
  attachInterrupt(0, onHumanDetected, FALLING );
}

void loop() {
  // Clear buffer
  clearI2CReadbuf();
  // Register read
  i2c_read(I2C_PIR_ADDR, 0x04, 6, i2c_recvBuf);

  // IR Sensor
  irData = clacIR();
  Serial.print("IR    = ");
  Serial.print(irData,2);
  Serial.println(" pA");

  // Sensor temperature
  tempData = clacTemp();
  Serial.print("TSENS = ");
  Serial.print(tempData,2);
  Serial.println(" deg");
  Serial.println("===================================");

  delay(1000);
}


double clacTemp()
{
  double ret;
  unsigned short val = (unsigned short)((i2c_recvBuf[4] << 8) |  i2c_recvBuf[3]);
  if ( (val & 0x8000) == 0x8000)
  {
     val = ~val + 1;
     ret = (double)((val) *   0.0019837 ) * -1;
  }
  else
  {
    ret = (double)val * 0.0019837;
  }
  return ret + 25;
}

double clacIR()
{
  double ret;
  unsigned short val = (unsigned short)((i2c_recvBuf[2] << 8) |  i2c_recvBuf[1]);
  if ( (val & 0x8000) == 0x8000)
  {
    val = ~val + 1;
    ret = (double)(val *   0.4578 ) * -1;
  }
  else
  {
    ret = (double)(val *  0.4578 );
  }
  return ret;
}


/**********************************************
* I2C Write 1 byte to the slave device
**********************************************/
void i2c_write_byte(int device_address, int reg_address, int write_data){
  Wire.beginTransmission(device_address);
  Wire.write(reg_address);
  Wire.write(write_data);
  Wire.endTransmission();
}


/**********************************************
* I2C Read 1 byte from the slave device
**********************************************/
unsigned char i2c_read_byte(int device_address, int reg_address){

  int read_data = 0;

  Wire.beginTransmission(device_address);
  Wire.write(reg_address);
  Wire.endTransmission(false);

  Wire.requestFrom(device_address, 1);
  read_data = Wire.read();

  return read_data;
}


/**********************************************
* I2C Write multiple bytes to the slave device
**********************************************/
void i2c_write(int device_address, int reg_address, int lengrh, unsigned char* write_byte){

  Wire.beginTransmission(device_address);
  Wire.write(reg_address);
  for (int i = 0; i < lengrh; i++){
    Wire.write(write_byte[i]);
  }
  Wire.endTransmission();
}


/**********************************************
* I2C Read multiple bytes from the slave device
**********************************************/
void i2c_read(int device_address, int reg_address, int lengrh, unsigned char* read_byte){

  Wire.beginTransmission(device_address);
  Wire.write(reg_address);
  Wire.endTransmission(false);

  Wire.requestFrom(device_address, lengrh);
  for (int i = 0; i < lengrh; i++){
    read_byte[i] = Wire.read();
  }
}


/**********************************************
* I2C Receive buffer clear
**********************************************/
void clearI2CReadbuf(){
  memset(&i2c_recvBuf[0], 0x00, sizeof(i2c_recvBuf));
}

Human_Sensing.ino

実行結果

人が近づくと音が鳴ります。

前のページに戻る


最終更新 January 29, 2023