トップページ > 製品案内 > マルチセンサシールド

製品案内 - マルチセンサシールド

多彩なセンサを搭載したArduinoのシールド!!
 

特徴

・Arduinoにシールドとして搭載可能なマルチセンサボード
 - ジャイロ(ENC-03R)
 - 3軸加速度(ADXL345)
 - 匂い(TGS2450)
 - 温度(LM35DZ)
 - 照度(NJL7502L)
 - 大気圧(MPL115A2)
・リアルタイムクロック(RTC8564NB)を搭載
 - 計測した時刻を記録可能
 - 電気二重層コンデンサによる電源バックアップ
・MicroSDカードスロットを搭載
 - 計測した値をSDカードに記録可能
・Arduino周辺回路の学習用として最適

仕様

Arduino Unoによるインタフェース
・大気圧センサ(MPL115A2)、3軸加速度(ADXL345)、リアルタイムクロック(RTC8564NB)
 ⇒ I2Cによるアクセス

・温度センサ(LM35DZ)
 ⇒ A0 から値を取得

・ジャイロ(ENC-03R)出力1
 ⇒ D9=HIGH, D6=LOW, D8=LOW, D5=LOWの状態で A3から値を取得

・ジャイロ(ENC-03R)出力2
 ⇒ D9=LOW, D6=HIGH, D8=LOW, D5=LOWの状態で A3から値を取得

・照度センサ(NJL7502L)
 ⇒ D9=LOW, D6=LOW, D8=HIGH, D5=LOWの状態で A3から値を取得

・匂いセンサ(TGS2450)
 ⇒ D9=LOW, D6=LOW, D8=LOW, D5=HIGH, D2=HIGH の状態で A3から値を取得
  匂いセンサは、D3でヒータ調節をする必要あり(8ms HIGH/242ms LOWを繰り返し実行)

・LEDインジケータ
 ⇒ D7=HIGH で ON

・Arduino標準のSDライブラリを利用してSDカードの読み書きが可能

サンプルコード

サンプルコード(必要なライブラリ含む)のダウンロード
//Multi Sensor shield用サンプルコード
//約0.5秒ごとに各センサの値を読みだして
//SDカードに時間とともに書き込みます.
//SDに書き込む際にLEDが光ることで動作確認ができます.
#include
#include
#include
#include
#include

#define SENSOR_ADRS 0x60

skMPL115A2 Pa(SENSOR_ADRS) ; // MPL115A2関数ライブラリを生成する

ADXL345 adxl; //variable adxl is an instance of the ADXL345 library

//for SD
const int chipSelect = 4;
/*******************************************************************************
* 電源起動時とリセットの時だけのみ処理される関数(初期化と設定処理) *
*******************************************************************************/
void setup()
{
  // pin setting
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);

  Rtc.begin();
  delay(3000) ; // 3Sしたら開始
  Pa.CoefficientRead() ; // MPL115A2のメモリーマップから係数を読出して置く

  adxl.powerOn();

  //for SD
  pinMode(SS, OUTPUT);
  // SDライブラリを初期化
  if (!SD.begin(chipSelect)) {
    while(1);
  }
  // 日付と時刻を返す関数を登録
  SdFile::dateTimeCallback( &dateTime );

  //for ADXL345
  //set activity/ inactivity thresholds (0-255)
  adxl.setActivityThreshold(75); //62.5mg per increment
  adxl.setInactivityThreshold(75); //62.5mg per increment
  adxl.setTimeInactivity(10); // how many seconds of no activity is inactive?

  //look of activity movement on this axes - 1 == on; 0 == off
  adxl.setActivityX(1);
  adxl.setActivityY(1);
  adxl.setActivityZ(1);

  //look of inactivity movement on this axes - 1 == on; 0 == off
  adxl.setInactivityX(1);
  adxl.setInactivityY(1);
  adxl.setInactivityZ(1);

  //look of tap movement on this axes - 1 == on; 0 == off
  adxl.setTapDetectionOnX(0);
  adxl.setTapDetectionOnY(0);
  adxl.setTapDetectionOnZ(1);

  //set values for what is a tap, and what is a double tap (0-255)
  adxl.setTapThreshold(50); //62.5mg per increment
  adxl.setTapDuration(15); //625us per increment
  adxl.setDoubleTapLatency(80); //1.25ms per increment
  adxl.setDoubleTapWindow(200); //1.25ms per increment

  //set values for what is considered freefall (0-255)
  adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment
  adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment

  //setting all interrupts to take place on int pin 1
  //I had issues with int pin 2, was unable to reset it
  adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT, ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT1_PIN );
  adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT1_PIN );

  //register interrupt actions - 1 == on; 0 == off
  adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT, 1);
  adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);
  //END of ADXL345
}
/*******************************************************************************
* 繰り返し実行される処理の関数(メインの処理) *
*******************************************************************************/
void loop()
{
  //for RTC
  Rtc.available();

  //for SD
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  float air_p;
  int i = 0;
  int rad1 = 0;
  int rad2 = 0;
  int light = 0;
  float temp = 0;
  int s_val;
  air_p = Pa.PressureAVE(20) ; // 平均化された気圧値の計算を行う

  //switch sensors and read value
  digitalWrite(9,HIGH);
  rad1 = analogRead(2);//gyro 1
  digitalWrite(9,LOW);
  digitalWrite(6,HIGH);
  rad2 = analogRead(2);//gyro 2
  digitalWrite(6,LOW);
  digitalWrite(8,HIGH);
  light = analogRead(2);//light sensor
  digitalWrite(8,LOW);
  temp = analogRead(0)*500/((float)1024);//temperature sensor

  //smell sensor
  digitalWrite(5,HIGH);
  digitalWrite(3,HIGH);
  delay(8);
  digitalWrite(3,LOW);
  delay(237);
  digitalWrite(2,HIGH);
  delay(2);
  s_val = analogRead(2);
  delay(3);
  digitalWrite(2,LOW);
  digitalWrite(5,LOW);

  //Boring accelerometer stuff
  int x,y,z;
  adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables x,y,
  double xyz[3];
  double ax,ay,az;
  adxl.get_Gxyz(xyz);
  ax = xyz[0];
  ay = xyz[1];
  az = xyz[2];

  //write data to microSD
  if (dataFile) {
    digitalWrite(7,HIGH);//LED on
    dataFile.print(0x2000+Rtc.years(),HEX);
    dataFile.print("/");
    dataFile.print(Rtc.months(),HEX);
    dataFile.print("/");
    dataFile.print(Rtc.days(),HEX);
    dataFile.print(" ");
    dataFile.print(Rtc.hours(),HEX);
    dataFile.print(":");
    dataFile.print(Rtc.minutes(),HEX);
    dataFile.print(":");
    dataFile.print(Rtc.seconds(),HEX);
    dataFile.print(",");
    dataFile.print(air_p);
    dataFile.print(",");
    dataFile.print(ax);
    dataFile.print(",");
    dataFile.print(ay);
    dataFile.print(",");
    dataFile.print(az);
    dataFile.print(",");
    dataFile.print(rad1);
    dataFile.print(",");
    dataFile.print(rad2);
    dataFile.print(",");
    dataFile.print(light);
    dataFile.print(",");
    dataFile.print(temp,1);
    dataFile.print(",");
    dataFile.println(s_val);
    dataFile.close();
    digitalWrite(7,LOW);//LED off
  }
  // ファイルが開けなかった場合
  else {
  }

  delay(250) ; // 約0.5秒ごとに繰り返す
}

void dateTime(uint16_t* date, uint16_t* time)
{
  uint16_t year = 2013;
  uint8_t month = 2, day = 3, hour = 9, minute = 0, second = 0;

  // GPSやRTCから日付と時間を取得
  // FAT_DATEマクロでフィールドを埋めて日付を返す
  *date = FAT_DATE(year, month, day);

  // FAT_TIMEマクロでフィールドを埋めて時間を返す
  *time = FAT_TIME(hour, minute, second);
}

SDカードへの出力例 (datalog.txt の中身)

2001/1/1 9:0:3,1005.71,0.07,0.10,0.75,289,285,118,24.4,160
2001/1/1 9:0:4,1004.97,0.09,0.05,0.78,292,293,115,24.4,159
2001/1/1 9:0:4,1004.97,0.08,0.06,0.78,291,292,97,24.4,159
2001/1/1 9:0:5,1006.16,0.06,0.05,0.76,288,286,68,24.4,158
2001/1/1 9:0:6,1004.97,0.06,0.05,0.75,292,286,35,24.4,158
2001/1/1 9:0:6,1004.97,0.05,0.07,0.76,288,290,24,24.4,157
2001/1/1 9:0:7,1006.16,0.05,0.07,0.75,290,289,21,24.4,157
2001/1/1 9:0:7,1004.97,0.04,0.06,0.76,290,284,17,24.4,156
2001/1/1 9:0:8,1006.16,0.07,0.08,0.74,287,289,13,24.4,156
2001/1/1 9:0:9,1004.97,0.01,0.06,0.79,293,289,87,24.4,155
2001/1/1 9:0:9,1006.16,0.05,0.10,0.76,288,301,88,24.4,155
2001/1/1 9:0:10,1006.16,0.12,0.16,0.79,292,294,55,24.4,155
2001/1/1 9:0:10,1004.97,0.16,0.20,0.75,290,287,52,24.4,154
2001/1/1 9:0:11,1004.97,0.21,0.21,0.76,288,278,16,24.4,154
2001/1/1 9:0:12,1004.97,0.24,0.21,0.72,284,289,17,24.4,153
2001/1/1 9:0:12,1005.42,-0.26,0.11,0.76,285,251,48,24.4,153
2001/1/1 9:0:13,1005.42,-0.91,0.18,0.16,286,292,229,24.9,153
2001/1/1 9:0:13,1005.42,-0.90,0.17,-0.19,284,307,45,24.9,152
2001/1/1 9:0:14,1005.42,-0.71,0.13,0.43,299,420,49,24.9,151
2001/1/1 9:0:15,1005.42,0.14,0.02,0.73,298,295,202,24.9,151
2001/1/1 9:0:15,1006.61,0.80,-0.01,0.44,288,291,48,24.4,150
2001/1/1 9:0:16,1005.42,0.97,-0.20,0.01,288,267,29,24.4,150