できること

第46回 紫外線センサ、近接・照度センサで作る植物育成デバイス 〜Arduino+センサの開発が劇的に楽になる!ローム・センサ評価キットを試してみた

2016-06-29 17.25.36

これまでの連載で、センサ評価キットに付属しているたくさんのセンサの使い方を学んできました。残るセンサは少なくなってきましたが、今回は複数回に分けて紫外線センサ、近接・照度センサの2つのセンサを使い、第22回で作成した観葉植物監視デバイスのパワーアップに挑戦してみたいと思います。

今回の電子工作レシピ

完成までの時間目安:60分
必要なパーツ

※ロームセンサ評価キットは下記サイトから購入できます!
チップワンストップ
ザイコストア

目次

  1. 近接・照度センサの役割と使い方
  2. 紫外線センサの役割と使い方
  3. 紫外線計測器を作ってみる
  4. まとめ

1.近接・照度センサの役割と使い方

近接センサと照度センサ自体は、過去の連載(第5回第15回)で取り扱っていますね。照度センサはその名の通り照度=明るさを測るセンサで、第5回ではわかりやすく光センサと呼んでCDSというパーツを使っています。↓↓↓の写真のようなパーツです。今回使うセンサも同じ仕様でしょうか、はたまたちょっと違ったりするのでしょうか、調べみましょう。

2014-07-04-17.30.12写真1 CDS光センサとフォトリフレクタ

センサ評価キットに付属されている近接センサの仕様をウェブサイト上のデータシートで確認すると、下記のように記載されています。

RPR-0521RS は、光学式近接センサと赤外線 LED(IrLED)、デジタル照度センサを 1chip 化したモジュールです。
近接センサ (PS) は IrLED から放射された光の近接物による反射光により、人や物体が近づいたことを検出します。また、照度センサ (ALS)は、暗がりから直射日光までの幅広い範囲の照度を測定できます。照度データに応じて、LCD ディスプレイやキーパッドの輝度を調整することにより、セットの低消費電力化や画面の視認性を向上させることができます。

近接センサは第15回で使ったフォトリフレクタと同じような仕組みで検出するようです。

さらに特徴を見ていくと、

[特徴]

  1.  I2C バスインターフェース対応(f/s mode support)
  2.  1.8V ロジック入力インターフェース対応
  3.  パワーダウン機能により低電流化が可能。
  4.  照度センサの波長感度ピークは可視光領域(Data0)と赤外光領域(Data1)の 2 出力対応
  5.  照度センサは広い入力光範囲に対応
  6.  照度センサは 50Hz / 60Hz 光ノイズ除去機能搭載
  7.  広い近接検出レンジに対応 1 – 100mm (I2C により調整可能)
  8.  可変設定可能な IrLED 用電流ドライバ回路内蔵

とあります。これまで使っていたCDSの光センサは目に見えない赤外線領域でのデータは取得できませんでしたが、この照度センサではそれも検出することができるみたいですね。

 

2016-06-29 17.20.59

写真1 近接・照度センサRPR-0521RS

近接・照度センサの取り付け

さっそく設置してサンプルを動かしていきます。今回使う近接・照度センサはセンサ評価キットモジュールの下記図の中、青いエリア(デジタル信号を扱うI2C I/Fエリア)に設置します。このセンサは動作電圧が3.0Vなので、ジャンパピンを3.0Vのところにセットしてください。

 

図1 センサシールドの接続方法解説

図2 センサシールドの接続方法解説

 

近接・照度センサのサンプルプログラムを動かす

連載をご覧いただいている方はもう何度もやった手続きだと思いますが、いつもの手順にそってサンプルプログラムを動かしてみます。サンプルプログラムを動かす流れは以下のとおりです。

  1. Arduinoにセンサ評価キットシールドと使いたいセンサパーツを設置
  2. ウェブサイトからセンサのライブラリファイルをダウンロード
  3. Arduinoにライブラリをインストール
  4. スケッチの例(example)からセンサのサンプルプログラムを実行

センサパーツの取り付けが完了したら、Arduinoでセンサを動かすために必要なライブラリ一式をウェブサイトのページ最下部「ソフトウェア」からダウンロードします。

図2 ライブラリの追加

図3 ライブラリの追加

zip形式のライブラリをダウンロードしたらArduinoの「スケッチ」 – 「Include Library」 – 「Add .Zip Library」からライブラリをArduinoに組み込みます。

組み込みが完了したらさっそくスケッチの例にサンプルプログラム「RPR-0521RS」が追加されているので、動かしてみましょう!(Arduinoが古い場合、フォルダ内に「-」が含まれるためライブラリを読み込めない場合がありますので、その場合はArduinoを最新にしてみてください)

 

近接・照度センサのサンプルプログラム

/*****************************************************************************
 RPR-0521RS.ino

 Copyright (c) 2016 ROHM Co.,Ltd.

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
******************************************************************************/
#include <Wire.h>
#include <RPR-0521RS.h>

RPR0521RS rpr0521rs;

void setup() {
 byte rc;

 Serial.begin(9600);
 while (!Serial);
 
 Wire.begin();
 
 rc = rpr0521rs.init();
}

void loop() {
 byte rc;
 unsigned short ps_val;
 float als_val;
 byte near_far;
 
 rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
 if (rc == 0) {
 Serial.print(F("RPR-0521RS (Proximity) = "));
 Serial.print(ps_val);
 Serial.print(F(" [count]"));
 near_far = rpr0521rs.check_near_far(ps_val);
 if (near_far == RPR0521RS_NEAR_VAL) {
 Serial.println(F(" Near"));
 } else {
 Serial.println(F(" Far"));
 }
 
 if (als_val != RPR0521RS_ERROR) {
 Serial.print(F("RPR-0521RS (Ambient Light) = "));
 Serial.print(als_val);
 Serial.println(F(" [lx]"));
 Serial.println();
 }
 }
 
 delay(500);

}
図4 近接・照度センサの結果

図4 近接・照度センサの結果

無事に動くと、センサに手を近づけたり話したりすると近接センサの数値が変わるのがシリアルモニタで確認できます。

 

2.紫外線センサの役割と使い方

次は、紫外線センサも使ってみます。「紫外線」と聞くと、あーお肌のあれね、と思うのですが実際にはどういう性質を持って、センサで計測できるとどんなことがうれしいのでしょうか?基本的に私達人間にとっては紫外線は有害なことが多いのですが、その性質を活かして殺菌効果や、最近だとネイル材やUVレジンなどの造形分野で紫外線を一定時間あてることで材料を硬化させるなどの使い方もされています。

ウェブサイトのデータシートから概要や特徴を確認してみます。

概要
ML8511A は、紫外線(UV 光)をLSI内部のフォト・ダイオードで受光し、光強度に依存した光電流をアナログ電圧に変換して出力する機能を有しています。小型パッケージで低消費電力であり、屋内および屋外での UV光のセンサとして最適です。出力インタフェースは汎用のアナログ・デジタル変換回路(ADC)との接続が容易で、UVセンサを応用した各種アプリケーションに適しています。パワーダウン時の待機電流は 0.1μA と少なく、電池駆動機器の長時間動作に最適です。

特長

  • UV-A および UV-B に対する光センサ
  • アンプ内蔵
  • UV光強度に比例したアナログ電圧出力
  • 低電流動作(300μA 標準値)および低待機電流(0.1μA 標準値)
  • 小型・低背パッケージ(4.0mm x 3.7mm x 0.73mm)、12 ピンQFNセラミックパッケージ(1.0mm端子間隔)

 

写真3 紫外線センサ

写真2 紫外線センサML8511

紫外線センサはアナログの図2 センサシールドの接続方法解説の赤いアナログ入力のエリアに設置します。近接センサのときと同様に、ウェブサイトからライブラリをダウンロードしてサンプルを動かしてみましょう。

紫外線センサのサンプルプログラム


/*****************************************************************************
 ML8511A.ino

Copyright (c) 2016 ROHM Co.,Ltd.

Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
******************************************************************************/
#include <ML8511A.h>

int uvout_pin = A0;

ML8511A ml8511a;

void setup() {

Serial.begin(9600);
 while (!Serial);

ml8511a.init(uvout_pin);

Serial.println("ML8511A Sample");

}

void loop() {
 float uv;

ml8511a.get_val(&uv);

Serial.write("ML8511A UV = ");
 Serial.print(uv);
 Serial.println(" [mW/cm2]");
 Serial.println();

delay(500);
}

 

3.紫外線計測器を作ってみる

紫外線センサの数値も確認できたら、紫外線センサと前回登場したシフトレジスタ&7セグメントLEDを使って簡易紫外線計測器を作ってみたいと思います。といっても、基本的には回路は変わらず、パーツを紫外線センサに変えてプログラムを修正するだけなので、センサの数値を確認したい場合、一度7セグLEDで表示できる回路を作っておくと楽ですね。

 

図5 紫外線計測器の回路

図5 紫外線計測器の回路

 

 

基本的にプログラム側もセンサから取得する部分を変更して、今回の紫外線センサからの値が小数点なのでそれに合わせて表示用に桁を調整しているなどの変更点を加えているのみです。また、紫外線センサは角度などで入力される紫外線の量が変わり数値が変動するので、一定期間(500回カウントさせている)の最大値を7セグメントLEDに表示するようにしています。

紫外線センサのサンプルプログラム


#include <ML8511A.h>
//シフトレジスタ用
#define SCK_PIN 13
#define RCK_PIN 10
#define SI_PIN 11

//桁制御用
#define DP1 2
#define DP2 3
#define DP3 4
int count = 0;

int uvout_pin = A0;
float uvMax = 0;

ML8511A ml8511a;

//7セグLEDの数字配列
const int digits[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
};

void setup() {

Serial.begin(9600);
while (!Serial);

ml8511a.init(uvout_pin);

Serial.println("ML8511A Sample");

pinMode(SCK_PIN, OUTPUT);
pinMode(RCK_PIN, OUTPUT);
pinMode(SI_PIN, OUTPUT);
pinMode(DP1, OUTPUT);
pinMode(DP2, OUTPUT);
pinMode(DP3, OUTPUT);

}

void loop() {
float uv;
ml8511a.get_val(&uv);

if(uv < uvMax){
uvMax = uv;
}

if(count > 500){
uvMax = 0;
count = 0;
}
count++;

int dispUvVal = uvMax * 100;
SEGMENT_OUT(dispUvVal);
delay(1);
}
void SEGMENT_OUT(int num){
Serial.write("ML8511A UV = ");
Serial.println(num);

for(int i = 0; i < 3; i++){
int disp_num = 0;
int dots = 0;
//1桁目の処理
if(i==0){
disp_num = NumParse(num,1);
digitalWrite(DP1, LOW);
digitalWrite(DP2, HIGH);
digitalWrite(DP3, HIGH);
}
//2桁目の処理
else if(i==1){
dots = 0b10000000;
disp_num = NumParse(num,2);
digitalWrite(DP2, LOW);
digitalWrite(DP1, HIGH);
digitalWrite(DP3, HIGH);
}
//3桁目の処理
else if(i==2){
disp_num = NumParse(num,3);
digitalWrite(DP3, LOW);
digitalWrite(DP1, HIGH);
digitalWrite(DP2, HIGH);
}

digitalWrite(RCK_PIN, LOW);
shiftOut(SI_PIN, SCK_PIN, MSBFIRST, digits[disp_num]+dots);
digitalWrite(RCK_PIN, HIGH);
delay(3);
}
}


//3桁をそれぞれの桁で分解する関数
int NumParse(int Number,int s){
int val[3];
val[0] = (Number % 10); Number /= 10; // 1桁目を取り出す
val[1] = (Number % 10); Number /= 10; // 2桁目を取り出す
val[2] = (Number % 10); Number /= 10; // 3桁目を取り出す
return val[s-1];
}

無事に動きました!植物用LEDと通常のLEDライトを当てると数値が変わるのが確認できますね。さらに直射日光に向けると数値がぐんっと上がりました。↓↓↓の写真では7セグLEDがうまく映っていませんが、8.1を示しています。ちょうど晴れてたのですが紫外線、恐るべし!

 

写真5 紫外線計測器の結果

写真3 紫外線計測器の結果(直射日光だと室内の10倍以上を検出)

 

まとめ

2つのセンサの動きがわかったところで、次回はこれらのセンサを実際に組み合わせて植物育成デバイスのパワーアップを図っていきます!

2016-06-29 16.50.11

アバター画像

電子工作や新しいデバイスをこよなく愛するエンジニア。日常生活のちょっとしたことを電子工作で作って試して、おもしろく過ごしたいと日々考えています。

ロボコニストが伝授!ぼくらの就職活動