カテゴリー別アーカイブ: Arduino

Arduinoで作成したセンサーシステムの電源をソーラーパネル由来にしました

センサーボード(Arduino)の電源をこれまでDC9Vアダプターで商用電源から得ていましたが、本日2017/02/01 16:00からソーラーの独立電源に切り替えました。

イーサネットボードの消費電力が大きいため、USBタイプの電流・電圧計で測ると0.2Aほど流れていますので、消費電力はボード全体でトータルで5V*0.2AH=1WHになります。DC-DCコンバータをまだセットアップしていないので、本日のところはUSB電源アダプタ(12V->5V変換)をバッテリに接続しています。接続が簡単だったので、このまま使うかもしれないです。

ソーラーパネルは、最小構成で考えると20W程度でよさそうですが、屋外には設定せず、室内に設置し、しかもスリガラス越しのため、20Wでは必要な電力が得れないため、120W分のパネル(60Wx2枚)を予定していました。120W分のパネルでスリガラス越しでは最大発電量は50W程度でした。建物の位置の都合で、冬の時期は日が当たるのはせいぜい1時間程度です。12月に1ヶ月程度の予備実験を行ったところ、120Wパネルで平均30WH/日の電力が蓄積できたので、おそらく120W分のパネルで大丈夫でしょう。

切り替えにあたり、60Wx2枚を置いている窓際を見ると、120Wパネルを1枚追加できそうだったのでトライしたところ、ぴったり設置できたので、結局ソーラーパネルは合計240Wになりました。まあまあ、パワーが得られそうな設備ですね。設置条件は決してよくないですからパネル面積で電力を得る方針です。
うまくいけば、60WH/日は確保できますので、さらに尤度が増します。ちなみにバッテリはリン酸鉄リチウムイオンバッテリの12.8V/20AHですので、何日間はセンサーシステムを動作させられます。

夕方から電源をバッテリに切り替えており、ソーラーパネル由来電力で全くダメなのかどうかは、すぐに結論が出るでしょう。うまくいってもいかなくても、何か面白いですね。

AM2302(DHT22/RHT03)を5個使って温度・湿度を測定

2014-11-27 15.00.05 2014-11-27 14.58.13 [概要]
AOSONG社のAM2302(DHT22,RHT03とも呼ばれているらしい)を5個使って室内の温度・湿度の測定値を蓄積してみた。使ったのは、SainSmartUno+EhternetShield+ブレッドボードと自作のWebサービス。
[測定プログラム]
AM2302の測定値取得には以下のWebサイトのコードを利用させたいただいた。作者の方に感謝。
(Arduino温湿度測定ロガー・湿度センサーの比較)
http://www.geocities.jp/bokunimowakaru/diy/arduino/humidity.html
[測定値蓄積Webサービス]
同時に複数の測定値を蓄積してグラフ化したかったのでWebサービスを自作した。Webサービスは公開して、みんなに使ってもらえるようにしたい。連続稼働テストの様子を見ながら、その時が来たら公開したいと思う。
現在は最速で約7秒間隔で(温度+湿度)*5個=10個の測定値をまとめて送信している。
Webサービスは1台運用なので、サーバが停止している、ArduinoからWebサービスに送信できない、といった障害が起こると、測定値はどこにも蓄積されない。つまり、失われる。
商用化する場合は、障害への対応が(サーバ側、センサー側とも何かしら)できる必要がある。

2014-11-30_temperature 2014-11-30_humidity [測定値のグラフ表示]
とりあえず、Highchartsを使うことにした。有償で商用利用できるのだが、現状どうするか決めていないので、試用させていただく。
http://www.highcharts.com/

【測定期間】2014/11/30 00:00:00~2014/11/30 23:59:59
【湿度個数5センサー分】26000個(3.2秒)
【温度個数5センサー分】14000個(2.4秒)
()の数値はhtmlデータの生成時間、実際に描画する時間が数秒程度以上かかる。 (全データを吐き出させると湿度、温度毎にそれぞれ63800個になる。同じ値が連続する場合は、途中の測定値を間引いて個数を減らしている。描画間隔を5分とかに拡大して、平均値をプロットさせようと思うが、現状は生データを素直に出力させている)
11/30のデータだがグラフは12/30-12/31のようになっている。これは、JavaScript出力させていている Date.UTC(2014,10,30…
の月の部分を0始まりなのに誤って1始まりとして以下のように記述したため。
Date.UTC(2014,11,30…

HighchartsはJPG/PNG形式などでグラフを保存できるのだが、今回テスト表示したグラフでは画像が作成できずエラーメッセージが表示された。センサーを1個にすれば画像が作られたが5個になると無理っぽい。

実際に動かすといろいろなことがあって面白い。

さて、肝心の温度・湿度センサーの評価だが、個々のセンサーにより値が異なるが、全体の傾向は同じである。個体差があること、誤差があることを考慮したうえで使うのであれば問題はないと思う。温度はカタログ精度は±0.5℃、真値はわからないけど、緩めて±1℃と思えば使えそうかなと思う。湿度も同じように精度を緩めればいけるかな。

温度と湿度を測定できるようになったので、次は、このブレッドボードに照度センサー、気圧センサーを付けて測定してみようと思う。温湿度センサーは5個は多いと思うけど、スペースがあったら置いておきましょうか。

CC3000WiFiモジュールピッチ変換基板の写真

2014-10-20 10.10.29
スイッチサイエンスで購入したCC3000WiFiモジュールの基板。
ヘッダピンが届いたので、明日Arduinoで使ってみる予定。
ネットで見る限りは、普通にみなさん使えているようですね。
トラブルなく使えることを期待してます。

うまく動いてくれよぉ。

N008 ArduinoでTFTカラーLCDディスプレイモジュール(SainSmart ST7735)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

サインスマート(SainSmart) 1.8″ TFT カラー LCD ディスプレイ モジュール SPI インタフェース & MicroSD 付き for Arduino UNO MEGA R3
(2014/09/07時点¥ 1590 税込)
電源は3.3V/5VともOKでした。
TFTカラーLCDディスプレイモジュールとはSPI接続です。

参考にした記事

サンプルスケッチは、ArduinoIDEのメニューから次のコードを利用。
ファイル>スケッチの例>TFT>Arduino>TFTDisplayText

作者の方々に感謝いたします。

ST7735とArduinoの接続ピン情報
ST7735 Arduino UNO
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D13
SDA    D11
DC     D09
RES    D08
CS     D10
------------------

ST7735 Arduino MEGA
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D52
SDA    D51
DC     D09
RES    D08
CS     D10
------------------
組み立てた様子
2014-09-09 08.51.31
ジャンパーピンの「オス-メス」を持っていないので、「オス-オス」「メス-メス」を接続して「オス-メス」を作りました。
少々配線が長いですが、ジャンパーピン7本だけで接続ができます。
この本数で接続して使えるのは楽です。
SPI接続は初めてでしたので、ピン情報を調査しました。
SPI接続のピン情報は以下のサイトを参考にしました。

液晶画面には1から順番に999999まで表示し、また1に戻って表示するようにしました。
intは16ビット長でしたので、longにしてプログラムを書いています。


実行直後の画面
2014-09-09 09.31.55
背景色が真っ白になるので、ディスプレイ表面の保護シートにかかれている「7」の数字がよく見えます。これって何なんだろう。



スケッチ
/*
  Arduino TFT text example
  
  This example demonstrates how to draw text on the 
  TFT with an Arduino. The Arduino reads the value 
  of an analog sensor attached to pin A0, and writes 
  the value to the LCD screen, updating every
  quarter second.
  
  This example code is in the public domain

  Created 15 April 2013 by Scott Fitzgerald
 
  http://arduino.cc/en/Tutorial/TFTDisplayText


(2014/09/09 append CXY-LABO)
Reference
http://arduino.cc/en/Reference/SPI

Pin connection

ST7735 Arduino UNO
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D13
SDA    D11
DC     D09
RES    D08
CS     D10
------------------

ST7735 Arduino MEGA
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D52
SDA    D51
DC     D09
RES    D08
CS     D10
------------------
*/

#include <TFT.h>  // Arduino LCD library
#include <SPI.h>

// pin definition for the Uno
#define cs   10
#define dc   9
#define rst  8  

// pin definition for the Leonardo
//#define cs   7
//#define dc   0
//#define rst  1 

// create an instance of the library
TFT TFTscreen = TFT(cs, dc, rst);

// number length to print to the screen
#define DISP_LEN (6+1)

// char array to print to the screen
char sensorPrintout[DISP_LEN];

void setup() {
  // Put this line at the beginning of every sketch that uses the GLCD:
  TFTscreen.begin();

  // clear the screen with a black background
  TFTscreen.background(0, 0, 0);
  
  // write the static text to the screen
  // set the font color to white
  TFTscreen.stroke(255,125,255);
  // set the font size
  TFTscreen.setTextSize(2);
  // write the text to the top left corner of the screen
  TFTscreen.text("Sensor Value :\n ",0,0);
  // ste the font size very large for the loop
  TFTscreen.setTextSize(4);

//SPI.setClockDivider(1);
}

long i=1;
long loop_end =pow(10,DISP_LEN-1)-1;
char fmt_buf[10];  // prepare enough buffer
void loop() {
  i++;
  if(i>loop_end){i=1;}
  sprintf(fmt_buf,"%%0%dld",DISP_LEN-1);  // if you wand to print ' ' padding, remove 0
  sprintf(sensorPrintout,fmt_buf,i);  // i is long then format is %##ld

  //String sensorVal = String(i);
  // convert the reading to a char array
  //sensorVal.toCharArray(sensorPrintout, DISP_LEN);

  // set the font color
  TFTscreen.stroke(255,255,255);
  // print the sensor value
  TFTscreen.text(sensorPrintout, 0, 20);
  // wait for a moment
  //delay(250);
  // erase the text you just wrote
  TFTscreen.stroke(0,0,0);
  TFTscreen.text(sensorPrintout, 0, 20);
}



前の記事: N007 デジタル・コンパスモジュールGY-271(HMC5883L)
この記事: N008 TFTカラーLCDディスプレイモジュール(SainSmart ST7735)
次の記事: 未定

N007 Arduinoでデジタル・コンパスモジュールGY-271(HMC5883L)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

デジタル・コンパスモジュール(HMC5883L)はAmazonで購入
HMC5883L 使用 3軸 デジタル・コンパス モジュール (3-5V 動作)
(2014/09/09時点¥ 540 税込)
電源は3.3V/5VともOKでした。
GY-271(HMC5883L)のI2C addressは0x1Eでした。

HMC5883Lセンサーモジュール(購入品)
2014-09-08 19.02.27
チップは基板実装済みだけど、基板に端子を半田付けしないといけない。

HMC5883Lセンサーモジュール(端子をはんだ付け)
2014-09-08 19.09.14


参考にしたソフトウェア

動作確認の際に利用させていただいたサイトとサンプルスケッチ

サンプルスケッチをArduino IDE 1.0.5-r2でコンパイルすると、関数名を変更しなさいと指摘されたので、以下のように変更した。
  1. Wire.receive()をWire.read()に名称変更
  2. Wire.send()をWire.write()に名称変更

作者の方々に感謝いたします。

GY-271(HMC5883L)とArduinoの接続ピン情報
GY-271 Arduino UNO
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   A5(SCL)
SDA   A4(SDA)
DRDY  -
------------------

GY-271 Arduino MEGA
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   D21(SCL)
SDA   D20(SDA)
DRDY  -
------------------
組み立てた様子
2014-09-08 19.37.47

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-08 19.38.12
3種類の数値が表示されているので動作OKです。
動作確認だけですので、数値の細かい意味は理解していません、実際に使う際に考えます。


スケッチ
/*
An Arduino code example for interfacing with the HMC5883

by: Jordan McConnell
 SparkFun Electronics
 created on: 6/30/11
 license: OSHW 1.0, http://freedomdefined.org/OSHW

Analog input 4 I2C SDA
Analog input 5 I2C SCL
*/

#include <Wire.h> //I2C Arduino Library

#define address 0x1E //0011110b, I2C 7bit address of HMC5883

void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Wire.begin();
  
  //Put the HMC5883 IC into the correct operating mode
  Wire.beginTransmission(address); //open communication with HMC5883
  Wire.write(0x02); //select mode register
  Wire.write(0x00); //continuous measurement mode
  Wire.endTransmission();
}

void loop(){
  
  int x,y,z; //triple axis data

  //Tell the HMC5883 where to begin reading data
  Wire.beginTransmission(address);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
  
 
 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(address, 6);
  if(6<=Wire.available()){
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb
  }
  
  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.println(z);
  
  delay(250);
}


前の記事: N006 加速度センサーモジュールGY-521(MPU-6050)
この記事: N007 デジタル・コンパスモジュールGY-271(HMC5883L)
次の記事: N008 TFTカラーLCDディスプレイモジュール(SainSmart ST7735)

N006 Arduinoで加速度センサーモジュールGY-521(MPU-6050)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

Amazonで以下の商品を購入
MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール
(2014/09/09時点 ¥430税込)
電源は3.3V/5VともOKでした。
I2C addressは0x68でした。

MPU-6050センサーモジュール(購入品)
2014-09-08 18.57.51
チップは基板実装済みだけど、基板に端子を半田付けしないといけない。

MPU-6050センサーモジュール(端子をはんだ付け)
2014-09-08 18.22.35


参考にしたソフトウェア

動作確認の際に利用させていただいたソフトウェア
加速度+ジャイロのGY-521(MPU-6050)を使ってみた
作者の方々に感謝いたします。

GY-521(MPU-6050)とArduinoの接続ピン情報
GY-521 Arduino UNO
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   A5(SCL)
SDA   A4(SDA)
XDA   -
XCL   -
AD0   -
INT   D2
------------------

GY-521 Arduino MEGA
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   D21(SCL)
SDA   D20(SDA)
XDA   -
XCL   -
AD0   -
INT   D2
------------------
組み立てた様子
2014-09-08 18.54.32

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-08 18.51.20
温度と9種類の情報が表示されているので動作OKです。
115200bpsで接続すると文字化けしまくったので9600bpsにしています。
対応策もあるようですが、今回はモジュールの動作テストだけですので、9600bpsでよしとします。


スケッチ
// MPU-6050 Accelerometer + Gyro
  #include <Wire.h>

  #define MPU6050_ACCEL_XOUT_H       0x3B   // R
  #define MPU6050_WHO_AM_I           0x75   // R
  #define MPU6050_PWR_MGMT_1         0x6B   // R/W
  #define MPU6050_I2C_ADDRESS 0x68

typedef union accel_t_gyro_union{
  struct{
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  }
  reg;
  struct{
    int16_t x_accel;
    int16_t y_accel;
    int16_t z_accel;
    int16_t temperature;
    int16_t x_gyro;
    int16_t y_gyro;
    int16_t z_gyro;
  }
  value;
};

void setup(){
  Wire.begin();
  int error;
  uint8_t c;
  Serial.begin(9600);
  Serial.print("InvenSense MPU-6050");
  Serial.print("June 2012");
  error = MPU6050_read (MPU6050_WHO_AM_I, &c, 1);
  Serial.print("WHO_AM_I : ");
  Serial.print(c,HEX);
  Serial.print(", error = ");
  Serial.println(error,DEC);
  error = MPU6050_read (MPU6050_PWR_MGMT_1, &c, 1);
  Serial.print("PWR_MGMT_1 : ");
  Serial.print(c,HEX);
  Serial.print(", error = ");
  Serial.println(error,DEC);
  MPU6050_write_reg (MPU6050_PWR_MGMT_1, 0);
}

  void loop(){
  int error;
  float dT;
  accel_t_gyro_union accel_t_gyro;
  error = MPU6050_read (MPU6050_ACCEL_XOUT_H, (uint8_t *) &accel_t_gyro, sizeof(accel_t_gyro));
  Serial.print(error,DEC);
  Serial.print("\t");

    uint8_t swap;
#define SWAP(x,y) swap = x; x = y; y = swap
  SWAP (accel_t_gyro.reg.x_accel_h, accel_t_gyro.reg.x_accel_l);
  SWAP (accel_t_gyro.reg.y_accel_h, accel_t_gyro.reg.y_accel_l);
  SWAP (accel_t_gyro.reg.z_accel_h, accel_t_gyro.reg.z_accel_l);
  SWAP (accel_t_gyro.reg.t_h, accel_t_gyro.reg.t_l);
  SWAP (accel_t_gyro.reg.x_gyro_h, accel_t_gyro.reg.x_gyro_l);
  SWAP (accel_t_gyro.reg.y_gyro_h, accel_t_gyro.reg.y_gyro_l);
  SWAP (accel_t_gyro.reg.z_gyro_h, accel_t_gyro.reg.z_gyro_l);

  dT = ( (float) accel_t_gyro.value.temperature + 12412.0) / 340.0;
  Serial.print(dT, 1);
  Serial.print("\t");

  float acc_x = accel_t_gyro.value.x_accel / 16384.0; //FS_SEL_0 16,384 LSB / g
  float acc_y = accel_t_gyro.value.y_accel / 16384.0;
  float acc_z = accel_t_gyro.value.z_accel / 16384.0;

  Serial.print(acc_x, 2);
  Serial.print("\t");
  Serial.print(acc_y, 2);
  Serial.print("\t");
  Serial.print(acc_z, 2);
  Serial.print("\t");

  float acc_angle_x = atan2(acc_x, acc_z) * 360 / 2.0 / PI;
  float acc_angle_y = atan2(acc_y, acc_z) * 360 / 2.0 / PI;
  float acc_angle_z = atan2(acc_x, acc_y) * 360 / 2.0 / PI;

  Serial.print(acc_angle_x, 2);
  Serial.print("\t");
  Serial.print(acc_angle_y, 2);
  Serial.print("\t");
  Serial.print(acc_angle_z, 2);
  Serial.print("\t");

  float gyro_x = accel_t_gyro.value.x_gyro / 131.0;  //FS_SEL_0 131 LSB / (°/s)
  float gyro_y = accel_t_gyro.value.y_gyro / 131.0;
  float gyro_z = accel_t_gyro.value.z_gyro / 131.0;

  Serial.print(gyro_x, 2);
  Serial.print("\t");
  Serial.print(gyro_y, 2);
  Serial.print("\t");
  Serial.print(gyro_z, 2);
  Serial.println("");
}

// MPU6050_read
int MPU6050_read(int start, uint8_t *buffer, int size){
  int i, n, error;
  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  n = Wire.write(start);
  if (n != 1)
    return (-10);
  n = Wire.endTransmission(false);   // hold the I2C-bus
  if (n != 0)
    return (n);
  // Third parameter is true: relase I2C-bus after data is read.
  Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);
  i = 0;
  while(Wire.available() && i<size){
    buffer[i++]=Wire.read();
  }
  if ( i != size)
    return (-11);
  return (0);  // return : no error
}

// MPU6050_write
int MPU6050_write(int start, const uint8_t *pData, int size){
  int n, error;
  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  n = Wire.write(start);        // write the start address
  if (n != 1)
    return (-20);
  n = Wire.write(pData, size);  // write data bytes
  if (n != size)
    return (-21);
  error = Wire.endTransmission(true); // release the I2C-bus
  if (error != 0)
    return (error);
  return (0);         // return : no error
}

// MPU6050_write_reg
int MPU6050_write_reg(int reg, uint8_t data){
  int error;
  error = MPU6050_write(reg, &data, 1);
  return (error);
}


前の記事: N005 照度計測モジュール(BH1750FVI)
この記事: N006 加速度センサーモジュールGY-521(MPU-6050)
次の記事: N007 デジタル・コンパスモジュールGY-271(HMC5883L)

N005 Arduinoで照度計測モジュール(BH1750FVI)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

照度計測モジュール(BH1750FVI)はAmazonで2014/08/19に購入したもの
照度計測モジュール(BH1750FVI)
(2014/09/07時点では在庫なし、2014/08/19時点 2個入りで¥1280税込)
モジュール上には”GY-30″と記載がありましたので、モジュールとしてはGY-30と呼ぶようです。
GY-30のI2C addressは固定なのかなぁ、と思って調べてみました。
こんな情報がありました。
BH1750 Digital Light Sensor
ステップ 3: Connectionのところに、
about ADDR Pin , I prepare a Library " I will talk about in the next step " , You can select the address of your breakout , Even 0x23 , or 0X5C , this action depend on the ADDR Pin status , if connecting to Gnd , the address will be 0x23 , else if ADDR Connecting to Vcc The address will be 0X5C  .
とあります。
ADDRをVccに接続するとI2C addressは0x5Cになるそうです。実験したところ、確かにアドレスは変わっていました。
測定範囲:1–65535 lx相当、分解能:0.5,1,4 lx(モード切替)だそうです。
(*)モード切替の方法もBH1750 Digital Light Sensorのサイトに載っています。
電源は3.3V/5VともOKでした。


参考にしたソフトウェア

動作確認の際に利用させていただいたソフトウェア
Measurement of illuminance with a BH1750FVI Breakout Board (GY-30) and an Arduino Uno
作者の方々に感謝いたします。

GY-30(BH1750FVI breakout board)とArduinoの接続ピン情報
GY-30 Arduino UNO
------------------
GND   POWER GND
VCC   POWER 5V or 3.3V
ADD   OPEN or connecting to GND:0x23, connecting to Vcc:0x5C
SDA   A4(SDA)
SCL   A5(SCL)
------------------

GY-30 Arduino MEGA
------------------
GND   POWER GND
VCC   POWER 5V or 3.3V
ADD   OPEN or connecting to GND:0x23, connecting to Vcc:0x5C
SDA   D20(SDA)
SCL   D21(SCL)
------------------
組み立てた様子
2014-09-07 22.37.53 ピン端子は半田済みでしたので何もしなくてよかった。楽なのはいいのですが、1か所だけ半田が隣にくっつきそうな点だけ、いまひとつ。まあいいか。

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-07 22.35.52
照度がlxで表示されているので動作OKです。
センサー表面を手で覆ったり、部屋の照明を消すと数値が著しく小さくなったのでよしとします。

スケッチ
#include <Wire.h>

int BH1750_address = 0x23; // i2c Addresse(OPEN or connecting to GND) 
//int BH1750_address = 0x5c; // i2c Addresse(connecting to Vcc)
byte buff[2];

void setup(){
  
  Wire.begin();
  BH1750_Init(BH1750_address);
  
  delay(200);
  Serial.begin(9600);
  Serial.println("Starte Beleuchtungsstaerkemessung - blog.simtronyx.de");
}

void loop(){
  
  float valf=0;

  if(BH1750_Read(BH1750_address)==2){
    
    valf=((buff[0]<<8)|buff[1])/1.2;
    
    if(valf<0)Serial.print("> 65535");
    else Serial.print((int)valf,DEC); 
    
    Serial.println(" lx"); 
  }
  delay(1000);
}

void BH1750_Init(int address){
  
  Wire.beginTransmission(address);
  Wire.write(0x10); // 1 [lux] aufloesung
  Wire.endTransmission();
}

byte BH1750_Read(int address){
  
  byte i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available()){
    buff[i] = Wire.read(); 
    i++;
  }
  Wire.endTransmission();  
  return i;
}


前の記事: N004 超音波距離センサーモジュール(SainSmart HC-SR04)
この記事: N005 照度計測モジュール(BH1750FVI)
次の記事: N006 加速度センサーモジュールGY-521(MPU-6050)

N004 Arduinoで超音波距離センサーモジュール(SainSmart HC-SR04)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

今日は、超音波距離センサーモジュールの動作確認をする。

超音波距離センサーモジュールはAmazonで購入
サインスマート(SainSmart)HC-SR04 超音波距離センサーモジュール
(2014/09/07時点 ¥380税込)

私が買ったものは水晶発振器が「ある」バージョンでした。数量は4個にしてamazonから発送してもらいました。

ソフトウェアダウンロード

動作確認の際に利用させていただいたソフトウェア
Arduino/Arduinoの勉強はじめました
作者の方々に感謝いたします。

HC-SR04とArduinoの接続ピン情報
HC-SR04 Arduino
-------------------
Gnd     POWER GND
Vcc     POWER 5V
Trig    D8
Echo    D9
------------------
組み立てた様子
2014-09-07 21.28.56

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-07 21.30.06
距離cmが表示されているので動作OKです。
距離計算の状況は20℃なので正しくありませんが、障害物の位置を変えると距離cmが変わるのでよしとします。 機会があれば、気温を温度センサーから取得して、距離センサーを再評価したいと思います。
小さいな音がするという記事を読んだので、耳を澄ましました。
う~む、確かに「相当」小さな音が何か聞こえます。しかし、具体的な音はわかりませんでした。
年齢による聴力の衰えでしょう。

スケッチ
/*
 HC-SR04 Ping distance sensor]
 VCC to arduino 5v GND to arduino GND
 Echo to Arduino pin 9 Trig to Arduino pin 8
 More info at: http://goo.gl/kJ8Gl
 */

#define trigPin 8
#define echoPin 9

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}


前の記事: N003 気圧センサーモジュール(SainSmart BMP085)
この記事: N004 超音波距離センサーモジュール(SainSmart HC-SR04)
次の記事: N005 照度計測モジュール(BH1750FVI)

N003 Arduinoで気圧センサーモジュール(SainSmart BMP085)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

今日は、気圧センサーモジュールの動作確認をする。

気圧センサーモジュールはAmazonで購入
サインスマート(SainSmart)BMP085 気圧センサー モジュール
(2014/09/05時点 ¥990税込)

BMP085センサーモジュール(購入品)
2014-09-05 15.29.23
チップは基板実装済みだけど、基板に端子を半田付けしないといけない。

BMP085センサーモジュール(端子をはんだ付け)
2014-09-05 16.01.41
はんだ付けした。いまいちだけど、よいこととする。

ソフトウェアダウンロード

BMP085をArduinoから使えるようにするソフトウェアはこちら(amazonの商品ページにあるリンク先を再掲)
https://s3-ap-northeast-1.amazonaws.com/sain-amzn/20/20-011-925/BMP085.rar

BMP085のI2C addressは0x77でした。

BMP085とArduinoの接続ピン情報
BMP085 Arduino UNO
-------------------
GND    POWER GND
3.3V   POWER 3.3V (または各々5V)
SDA    A4
SCL    A5

BMP085 Arduino MEGA
-------------------
GND    POWER GND
3.3V   POWER 3.3V (または各々5V)
SDA    20(SDA)
SCL    21(SCL)
------------------

BMP085センサーモジュールは5V電源端子があり、5Vで動作すること確認済み。

組み立てた様子
2014-09-05 16.27.50
I2C接続は線が少なくて済むのですっきりしてますね。

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-05 16.27.39
気温と気圧が表示されているので動作OKです。
LCD画面とかに表示させないと今一つ面白くないですね。
気温の精度は、センサーモジュールを使った仕組みを作る機会があれば評価したいと思います。
Arduinoのサンプルコードはネットにたくさんあるので、使える状態に持っていくのが本当に楽でよいですね。

スケッチ(今回は差分情報の掲載のみ)

BMP085.rarを展開したファイル中の試験コード
./BMP085/BMP085_Example_Code/BMP085_Example_Code.pde
を利用してテスト。

Arduino IDE 1.0.5-r2においてコンパイルエラーが発生したので、
エラーメッセージの情報に従い関数名の変更のみ行い動作した。

Wire.send()	->	Wire.write()
Wire.receive()	->	Wire.read()


前の記事: N002 LCD液晶モジュール(SainSmart IIC/I2C/TWI 1602 Serial LCD Module)
この記事: N003 気圧センサーモジュール(SainSmart BMP085)
次の記事: N004 超音波距離センサーモジュール(SainSmart HC-SR04)

N002 ArduinoでLCD液晶モジュール(SainSmart IIC/I2C/TWI 1602 Serial LCD Module)を使う

N002 ArduinoでLCD液晶モジュール(SainSmart IIC/I2C/TWI 1602 Serial LCD Module)を使う
N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

今日は、Arduino MEGAを使ってLCD液晶モジュール(完成品)の動作確認をする。
Arduino MEGAはAmazonで以下の互換品を購入
サインスマート(SainSmart) MEGA2560 互換ボード R3
(2014/09/05時点:¥2,780税込送料無料)

LCD液晶モジュールはAmazonで購入
サインスマート(SainSmart) IIC/I2C/TWI 16*02 LCD液晶 モジュール For Arduino UNO MEGA R3 黄色発光
(2014/09/05時点:¥1,390税込送料無料)

SainSmartの商品ページはこちら
SainSmart IIC/I2C/TWI 1602 Serial LCD Module Display For Arduino MEGA2560 UNO R3
(2014/09/05時点:$10.99)
(I2C Address: 0x3Fと明記されている)

ソフトウェア

最初に書いておくと、私が購入したLCD液晶モジュールのI2C Addressはすべて「0x3F」だった(2個購入)。
このモジュールはアドレスが固定らしい、変更方法は不明。I2Cは複数台のデバイスを接続できるらしいのだが(まだやったことはない)、1台のArduinoでこのデバイスを複数個使うのはできないかもしれない。
よく似た別の液晶モジュールはアドレス変更用のジャンパーピンがあったが、このモジュールには何もない。

当初、Amazonのリンク先から液晶モジュールのドライバをダウンロードして来てサンプルプログラムを動作させようとした。
しかし、ファイルがないとか、型が違うとか、エラーが出て、コンパイルはできなかった。
海外の掲示板をいろいろ探して、最終的にどう修正したらよいかわかり、コンパイルができモジュールも使えた。
ArduinoIDEのバージョンなども原因のようだが、開発が初めての人(最新のIDEを使う人)にはハードルが高いと思う。
(あきらめた人の記事もいくつか目にした)

以下のサイトの情報だと(たぶん)回り道することなく動作させられると思う。
I2C LCD モジュールの使い方 – 電子工作
私が試したライブラリで無変更で動いたものは以下のURLのもの。
http://www.dfrobot.com/image/data/DFR0154/LiquidCrystal_I2Cv1-1.rar

接続ピンの情報(UNOとMEGAの両方で動作確認した、SDA,SCLのピンが異なるので要注意)
[UNO]
LCD Arduino
--------------
GND POWER GND
VCC POWER 5V
SDA A4
SCL A5

[MEGA]
LCD Arduino
--------------
GND POWER GND
VCC POWER 5V
SDA 20(SDA)
SCL 21(SCL)

組み立てた様子
2014-09-04 20.56.48
Arduinoが起動するとLCD画面に「Hello, world!」と表示する。それだけ。
バックライトをオンにすると、黄色(黄緑色かな)に黒色の文字がくっきり見えて、なかなかよい。

私は部品はできる限り2個以上購入することにしていて、今回は2個買っていた。うち1個は液晶の表示が部分的に薄かった。 組立済みで安い商品だし文句は言うまい。色を濃くすれば差は気にならないので、よしとする。

スケッチ
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "Arduino.h"  // WProgram.h

void setup();
void loop();
LiquidCrystal_I2C lcd(0x3F,16,2);

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Hello, world!");
}
void loop()
{
}
int main(void)
{
	init();
	setup();
//	for (;;)
//		loop();
	return 0;
}


前の記事: N001 人感センサー(DYP-ME003)
この記事: N002 LCD液晶モジュール(SainSmart IIC/I2C/TWI 1602 Serial LCD Module)
次の記事: N003 気圧センサーモジュール(SainSmart BMP085)