2019年8月24日 (土)

Arduinoで作ろう(25) 気温・湿度・気圧のデータロガー

Sdcardshield_3

 Arduinoで作ろう(23) でBME280を使って気温・湿度・気圧を測定しましたが,この取得データをSDカードに記録してみました。いわゆるデータロガーですな。
 使ったのは,Seeed Studio製のSDカードシールド。これを使えばCR類の配線をしなくていいからラクチンです。

8578d9e3f67546688955ea77bd4f41a0

 Arduino IDEのスケッチ例「Datalogger」をちょっと書き換えただけですが,スケッチはコレ→20190823sd_write.ino

 このSDカードシールドのFritzingパーツを見つけられなかったので,RTC付きのSDカードシールドで配線図を描きました。でも,僕のシールドにはRTCが付いてないので,millis()でArduino起動後の経過時間を記録し,あとでExcel上で処理してやることにします。

/*
  SD card datalogger
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11 , MISO - pin 12 , CLK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)
 */

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SparkFunBME280.h"
BME280 sensor;
const int chipSelect = 4;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    while (1);
   }
  Serial.println("card initialized.");
  Wire.begin();
  sensor.beginI2C();
}

void loop() {
   String dataString = "";
    dataString += String(millis()/1000);
    dataString += ",";
    dataString += String(sensor.readTempC());
    dataString += ",";
    dataString += String(sensor.readFloatHumidity());
    dataString += ",";
    dataString += String(sensor.readFloatPressure()/100.0);
 
   File dataFile = SD.open("datalog.csv", FILE_WRITE);
    if (dataFile) {
     dataFile.println(dataString);
     dataFile.close();
     Serial.println(dataString);
    }
  delay(600000); //10分(600秒)ごとに測定
}

 24時間測定して得られたcsvファイルをExcelで読み込みました。
B列を挿入してA列の値を hh:mm:ss の形式に変えます。

Excel

んで,グラフを作るとこんな感じ。

Graph

木造住宅2階の室内での測定です。深夜から明け方に気圧が下がり,雨が降って湿度が上がっています。

| | コメント (0)

2019年8月22日 (木)

Arduinoで作ろう(24) 赤外線リモコンの信号解読

Ir-reciever_2

 Arduinoの中華製シールドを収集するのが趣味なのですが,少し前に買った KEYESTUDIO多機能シールドVer.1 を使って,TVリモコンの赤外線信号解読をやってみました。

800pxks0183_pinout

 いろいろなパーツが載ってますが,赤外線レシーバ(たぶんVS1838)とブザーを使います。

 I2CのLCDを接続できるピンも出てるので,コレをつないでみました。(リンク先の説明には,I2Cアドレスは0x27と書いてありますが,実際には0x3Fでした) このLCD用のライブラリはココでダウンロードできます。

/*
 * SHARPリモコンの信号を赤外線レシーバで受信
 */

#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2); // I2Cアドレス 0x3F, 16x2
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
//Serial.begin(9600);
lcd.init();
lcd.backlight();
irrecv.enableIRIn();
pinMode(5,OUTPUT);
}

void loop() {
 if (irrecv.decode(&results)) {
  lcd.setCursor(0, 0);
  lcd.print("HEX:");
  lcd.print(results.value, HEX);lcd.print(" ");
  lcd.setCursor(0, 1);
    switch (results.value) {
    case 0x5324450A:lcd.print("button: 1");break;
    case 0xE072CF12:lcd.print("button: 2");break;
    case 0xCB96DB61:lcd.print("button: 3");break; 
    case 0x2F834551:lcd.print("button: 4");break;
    case 0x81041FF3:lcd.print("button: 5");break;
    case 0x9B14063:lcd.print("button: 6");break;
    case 0x1E5F84CF:lcd.print("button: 7");break;
    case 0xAB5F67EF:lcd.print("button: 8");break;
    case 0xF9792C4D:lcd.print("button: 9");break;
    case 0x82264CBD:lcd.print("button:10");break;
    case 0x2A0F2522:lcd.print("button:11");break;
    case 0x7E31B95A:lcd.print("button:12");break;
    default:lcd.print("button: ?");break; //1から12以外のボタンが押されたとき
    }
     for(int i=31;i>=0;i--){
     digitalWrite(5,bitRead(results.value,i));
     //Serial.print(bitRead(results.value,i));
     }
   //Serial.println("");
   irrecv.resume(); // Receive the next value
  }
 delay(200);
}

スケッチはこちら→ 20190821_irremote.ino

 SHARPのTVリモコンをIRレシーバに向けて操作すると,受信した信号を16進数で表示し,さらにswitch~caseで分けて,押されたボタンをLCDに表示するようにしてあります。他メーカーのリモコンなら,switch~caseの部分を書き換えればOKです。
 あと,bitRead(results.value,i)で32桁のバイナリデータを取り出して,これでブザーを鳴らしています。押したボタンによって音が異なります。

|

2019年8月20日 (火)

Arduinoで作ろう(23) 複合気象センサ BME280で気温・湿度・気圧を測定

Bme280

 秋月電子で買った 複合気象センサ AE-BME280を使って,気温・湿度・気圧を測ってみました。

Aebme280

 AE-BME280はI2CでArduinoと通信するのですが,このセンサは3.3Vで動作します。でも,ArduinoのSDAとSCLは5Vの電圧でデータをやり取りするので,レベルコンバータを使ってI2Cの電圧を変換してやる必要があります。

 ネット上の情報を探ると,定格内ぎりぎりの電圧でArduinoと直接接続できそうなんだけど,ここは安全策を採ってaitendoのレベルコンバータLVCNV-I2Cを使うことにしました。LCDもaitendoのコレを使ってます。

BME280のライブリはココでダウンロードできます↓
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library

スケッチはコレ→ 20190819bme280.ino

/*
 * 温度・湿度・気圧センサ
 * 秋月AE-BME280 I2C接続
 * aitendo I2Cレベルコンバータ LVCNV-I2C
 */

#include <Wire.h>
#include "SparkFunBME280.h"
#include <ST7032.h>
BME280 sensor;
ST7032 lcd;

void setup() {
  lcd.begin(16, 2);
  lcd.setContrast(30);
  Wire.begin();
  sensor.beginI2C();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print(sensor.readTempC(), 1);lcd.write(0b11011111);lcd.print("C , ");
  lcd.print(sensor.readFloatHumidity(), 1);lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print(sensor.readFloatPressure() / 100.0, 1);lcd.print("hPa");
  delay(3000);
}

| | コメント (0)

2019年8月18日 (日)

Arduinoで作ろう(22) 磁気センサと電磁石を使って空中浮遊

Magnetic_levitating  

https://www.tubefr.com/arduino.html

で紹介されている「空中浮遊」をやってみました。

手持ちのホールセンサは秋月のA1324LUA-Tってやつで,ピンポン玉くらいの重さのものしか持ち上げられませんが,これはなかなか愉快です。

20190818

電磁石は5mmの鉄製ボルトに0.4mmのエナメル線を巻いてつくります。

ホールセンサは写真の位置に両面テープで貼り付けました。

スケッチはこんなかんじ。

/* 空中浮揚 Arduino NANO
 ホールセンサ A1324LUA
 モータドライバ TA7291P */
void setup() {
     //Serial.begin(9600);
     pinMode(2,OUTPUT);
     pinMode(3,OUTPUT);
 }
 
void loop() {
    //Serial.println(analogRead(0));
    if (analogRead(0)>950){
    digitalWrite(2,HIGH);
    digitalWrite(3,LOW);
   }else {
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
   }
 }

 

| | コメント (0)

2018年8月15日 (水)

Arduinoで作ろう(21) 屈折走行するクルマ

20180815  高校物理・波動分野の授業で「異なる媒質の境界で波が屈折するのは,媒質が異なると波の伝わる速さも異なるからだ」なんてことを教えますが,これを説明するための道具を作ってみました。
秋月電子で買ったフォトリフレクタLBR-127HLDを使って床で反射する赤外線LEDの光を見て,反射光が強い場合(白い床)はモーターを高速回転させ,反射光が弱い場合(黒い床)は低速回転させています。
モーターの回転数はArduinoのPWM出力でコントロールしています。

スケッチはこちら→ 20180815.ino

 

/*
Arduino + フォトリフレクタLBR-127HLD で屈折するクルマ
*/

void setup() {
Serial.begin(9600);
}

void loop() {
int Rval = analogRead(A0); // 右のフォトリフレクタの出力0~5Vを10bitでAD変換(0~1023)
int Lval = analogRead(A1); // 左のフォトリフレクタの出力0~5Vを10bitでAD変換(0~1023)

Rval = map(Rval, 0, 1023, 150, 255); //右 0~1023の値を160~255の値にマッピング
Lval = map(Lval, 0, 1023, 150, 255); //左 0~1023の値を160~255の値にマッピング

Serial.print(Lval); Serial.print(" "); Serial.println(Rval);

analogWrite(5, Rval); //右モーターにPWM出力
analogWrite(6, Lval); //左モーターにPWM出力
}

 

 

| | コメント (0) | トラックバック (0)

2018年7月14日 (土)

Arduinoで作ろう(20) 3軸加速度センサKXR94-2050

Keypadshield_kxr942050

 秋月で買った3軸加速度センサモジュールKXR94-2050で加速度計を作ってみました。
このモジュールの6,7,8ピンにそれぞれx軸,y軸,z軸方向の加速度がアナログ電圧値で出力されるんだそうです。
電源が5Vだと,加速度0m/s^2で2.5Vが出力される仕様です。
しかし,正確に言うと「加速度」ではなくて「重力+慣性力」の大きさを測っているみたいです。センサを水平に静かに置いてみると,z軸には10bitでAD変換された値で700前後が出力されています。
「なんだ,ばねにおもりをぶら下げて,ばねの伸びを測ってるみたいだな」と思って調べてみたら,実際この小さなモジュールの中にばねが何本も入っているらしいです。よくそんな小さなばねが作れるもんですな。驚きました。

 で,Arduinoにつないで測定してみました。
センサを水平に置いたとき,鉛直方向(z軸方向)は,9.8m/s^2ですが,AD変換された値で700程度の出力がありました。x軸,y軸方向は500程度です。
ところが,この値が実に不安定で,電源を入れ直したり,センサを傾けて元の水平位置に戻したりするたびにz軸方向は680~705程度,x軸・y軸方向は500~525程度の幅で出力値が変化します。これでは物理実験に使えないなあ。電源が不安定なのかもしれないと考えて,いろいろな電源で試してみましたが改善は見られません。どうやら,このセンサはその程度のモノのようです。ちょっと期待してただけにガッカリです。

スケッチはこちら→ 20180714.ino

/*
LCD KeyPad Shield
3軸加速度センサ KXR94-2050
*/


#include <LiquidCrystal.h>
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7);


void setup() {
lcd.begin(16, 2);
//Serial.begin(9600);
}


void loop() {
int Zdata = analogRead(A1);
int Ydata = analogRead(A2);
int Xdata = analogRead(A3);
lcd.setCursor(0, 0);
lcd.print("X:"); lcd.print(9.8 * (Xdata - 500) / (700 - 500));
//Serial.print("X:"); Serial.print(Xdata);
lcd.print(" Y:"); lcd.print(9.8 * (Ydata - 500) / (700 - 500)); lcd.print(" ");
//Serial.print(" Y:"); Serial.print(Ydata);
lcd.setCursor(0, 1);
lcd.print("Z:"); lcd.print(9.8 * (Zdata - 500) / (700 - 500));
//Serial.print(" Z:"); Serial.println(Zdata);
}

 

| | トラックバック (0)

2018年7月 7日 (土)

Arduinoで作ろう(19) LCDシールド を作ってみた

20180707_095224

1602lcd

 そういえば以前 秋月電子で買った16文字×2行のLCDがパーツ箱の肥やしになってるなあ と思って,これを同じく秋月のArduino用ユニバーサル基板に乗っけてLCDシールドにしてみました。

FritzingにSD1602Hのパーツがないので,別のLCDのパーツを使って描いてます。
LCDのピンの番号に注意してください。

スケッチはこんな感じでOKです。

/* 自作 LCD Shield Hello,World */

#include <LiquidCrystal.h>
LiquidCrystal lcd(10, 9, 8, 3, 2, 4, 7);

void setup() {
lcd.begin(16, 2);
}

void loop() {
lcd.setCursor(0, 0);
lcd.print("Hello,World!");
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
}


| | トラックバック (0)

2018年7月 6日 (金)

Arduinoで作ろう(18) LCD Keypad Shield を買ってみた

Arduinolcdkeypadforstore3_chop

AmazonでLCD キーパッド シールド を買ってみました。

Photo
 680円でこのクォリティなら,十分すぎます。ココココにあるPDFを見ると,Arduinoのどのピンが使われているのかが分かりますし,LCDはライブラリ LiquidCrystal.h で普通に使えます。

 今回は5つのタクトスイッチを使えるようにしてみました。
5つのタクトスイッチは,左図のように分圧回路を使ってA0ピンひとつだけで,どのスイッチが押されているか判定しようというものです。なかなか良くできてますよね。

このスケッチ「20180706_LCD_KeyPadShield_switch_Test.ino」を使って,5つのスイッチを順に押しながらA0の電位(10bitにAD変換された値)を調べてから,下のようなスケッチを書いてみました。

「20180706_LCD_KeyPadShield_switch_Test2.ino」

/* LCD KeyPad Shield A0のスイッチテスト2 */

#include <LiquidCrystal.h>
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7);

void setup() {
lcd.begin(16, 2);
}

void loop() {
int ADCdata = analogRead(A0);
lcd.setCursor(0, 0);
if (ADCdata < 50) {
lcd.print("RIGHT ");
}
else if (ADCdata < 150) {
lcd.print("UP ");
}
else if (ADCdata < 350) {
lcd.print("DOWN ");
}
else if (ADCdata < 500) {
lcd.print("LEFT ");
}
else if (ADCdata < 750) {
lcd.print("SELECT");
}
else {
lcd.print("None ");
}

lcd.setCursor(0, 1);
lcd.print(ADCdata); lcd.print("/1023 ");
delay(500);
}


| | トラックバック (0)

2018年7月 1日 (日)

Arduinoで作ろう(17) MPL115A2で大気圧測定

Multifunctionshield_mpl115a2

 Multi Function Shield にI2C接続の大気圧センサ MPL115A2 をつないで大気圧計にしてみました。
前回LCDに表示させてたやつの7セグLED版です。

スケッチはこちら→ 20180701MPL115A2.ino

/* Multi_function_shield 大気圧センサ MPL115A2 */

#include <Wire.h>
#include <MPL115A2.h>
const int LAT = 4; // Latchピン
const int CLK = 7; // Clockピン
const int SDI = 8; // Serial Data In ピン
int pressure;
int Buffer[4] = {0}; //1~4桁 数字のバッファ

byte digit[10] = //7seg 点灯パターン
{
B00000011, // 数字 0
B10011111, // 1
B00100101, // 2
B00001101, // 3
B10011001, // 4
B01001001, // 5
B01000001, // 6
B00011011, // 7
B00000001, // 8
B00001001 // 9
};

const byte keta[4] =
{
B00010000, //1桁め
B00100000, //2桁め
B01000000, //3桁め
B10000000 //4桁め
};

void setup() {
pinMode(SDI, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(LAT, OUTPUT);
MPL115A2.begin();
//Serial.begin(9600);
}

void loop() {
pressure = MPL115A2.read();
//Serial.println(pressure);
Buffer[3] = int(pressure) / 1000;
Buffer[2] = (int(pressure) % 1000) / 100;
Buffer[1] = (int(pressure) % 100) / 10;
Buffer[0] = (int(pressure) % 100) % 10;
Disp();
}

void Disp() {
for (byte j = 0; j < 4; j++) {
digitalWrite(LAT, LOW);
shiftOut(SDI, CLK, LSBFIRST, digit[Buffer[j]]);
shiftOut(SDI, CLK, LSBFIRST, keta[j]); // 桁
digitalWrite(LAT, HIGH);
delay(4);
}
}

| | コメント (0) | トラックバック (0)

2018年6月30日 (土)

Arduinoで作ろう(16) HC-SR04 で距離の測定

Multifunctionshield_hcsr04_

 Multi function shieldに測距センサHC-SR04をつないで距離計を作ってみました。
前回はLCDに表示させてますが,今回は7セグLEDです。

このシールドは,どこに何の端子が出ているのか分かりにくいのですが,この回路図とか,Fritzingのパーツの絵を見ると分かりますよ。3×4列のピンヘッダのところにD5,D6,D9,A5と+5V,GNDのピンがあります。
そういえば,この基板上にジャンパピンが2つありますが,これの役割も上記の回路図を見ると確認できます。これ,結構重要な情報ですよね。


スケッチはこちら→ 20180701.ino


/*
Multi_function_shield
超音波センサ HC-SR04
*/

#include
const int LAT = 4; // Latchピン
const int CLK = 7; // Clockピン
const int SDI = 8; // Serial Data In ピン
const int trig = 5;
const int echo = 6;
int time;
float distance;
int Buffer[4] = {0}; //1~4桁 数字のバッファ

byte digit[10] = //7seg 点灯パターン
{
B00000011, // 数字 0
B10011111, // 1
B00100101, // 2
B00001101, // 3
B10011001, // 4
B01001001, // 5
B01000001, // 6
B00011011, // 7
B00000001, // 8
B00001001 // 9
};

const byte keta[4] =
{
B00010000, //1桁め
B00100000, //2桁め
B01000000, //3桁め
B10000000 //4桁め
};

void setup() {
pinMode(SDI, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(LAT, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
}

void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(1);
digitalWrite(trig, HIGH);
delayMicroseconds(11);
digitalWrite(trig, LOW);

time = pulseIn(echo, HIGH);
distance = (time / 2) * 0.0340 * 10;
Serial.println(distance / 10);

Buffer[3] = int(distance) / 1000;
Buffer[2] = (int(distance) % 1000) / 100;
Buffer[1] = (int(distance) % 100) / 10;
Buffer[0] = (int(distance) % 100) % 10;
Disp();
}

void Disp() {
for (byte j = 0; j < 4; j++) {
digitalWrite(LAT, LOW);
shiftOut(SDI, CLK, LSBFIRST, digit[Buffer[j]]);
if (j == 1) {
shiftOut(SDI, CLK, LSBFIRST, digit[Buffer[j]]&B11111110);
}
shiftOut(SDI, CLK, LSBFIRST, keta[j]); // 桁
digitalWrite(LAT, HIGH);
delay(4);
}
}

| | トラックバック (0)