製品案内 - マルチセンサシールド
多彩なセンサを搭載した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 |