Arduino上进行使用传感器的开发,非常轻松!搭载8种传感器的罗姆传感器评估套件用后感

转载自 Device Plus,获得了相关许可,特此声明

颜色传感器模块

DSC_0196

使Arduino+各种传感器的电子制作更轻松的罗姆传感器评估套件

截至上次发文,我们学习了使用地磁传感器的基础知识。接下来,作为连载,这次我们要学习使用以前从未接触过的"颜色传感器"来验证罗姆传感器评估套件的强大功能。

 

此次的电子工程配方

完成为止的大致时间标准:60分钟
必要零件

※罗姆传感器评估套件可通过以下网站购买!
AMEYA360
RightIC

 

何谓颜色传感器?

恰如其名,颜色传感器是可以获取颜色数据的传感器。颜色传感器还有"色彩传感器"、"颜色识别传感器"、"辨色传感器"、"数字颜色传感器"等名称。颜色传感器的原理是通过其内部的红(R)、绿(G)、蓝(B)传感器加上滤色器将可视光区分为不同的信号来获取颜色数据。

罗姆传感器评估套件中搭载了"BH1745NUC"作为颜色传感器模块。

照片1 颜色传感器模块BH1745NUC

照片1 颜色传感器模块BH1745NUC

照片2 颜色传感器模块BH1745NUC

照片2 颜色传感器模块BH1745NUC

 

颜色传感器的试用

下面,我们介绍通过Arduino使用颜色传感器的方法。

 

颜色传感器的安装

从下图可知,颜色传感器的安装区域与地磁传感器一样,均为I2C I/F区。关于电源电压,地磁传感器为1.8V,颜色传感器为3V,因此应将左上方的电源电压切换跳线针脚切换到3V的位置。

图1 传感器护罩的连接方法说明

图1 传感器护罩的连接方法说明

 

照片3 颜色传感器的安装

照片3 颜色传感器的安装

 

安装完成后,应进行Arduino的程序设定。

 

下载颜色传感器用的库文件

接下来,和地磁传感器时一样,应安装使用传感器的库。通过颜色传感器说明页面下方的软件下载来下载库文件。

图2 颜色传感器用库文件的下载

图2 颜色传感器用库文件的下载

 

文件下载完成后,打开Arduino IDE添加库,选择下载的文件"BH1745NUC.zip",颜色传感器的动作准备即告完成。

照片4 添加库 BH1745NUC

照片4 添加库"BH1745NUC"

 

顺利添加库后,可以在"sketch示例"及"使用库"的栏中确认BH1745NUC的标识。

照片5 BH1745NUC被添加到库

照片5 BH1745NUC被添加到库

 

运行颜色传感器的样本程序(sketch)

从sketch示例中,调用BH1745NUC的样本程序。该程序单纯显示颜色传感器获取的值。
※样本程序(sketch)的编译未通过时,可能是Arduino IDE较旧,请用最新的Arduino IDE进行尝试。

BH1745NUC的样本程序(sketch)

/*****************************************************************************

 BH1745NUC.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 <BH1745NUC.h>



BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



void setup() {

 byte rc;



 Serial.begin(9600);

 while (!Serial);



 Wire.begin();



 rc = bh1745nuc.init();

}



void loop() {

 byte rc;

 unsigned short rgbc[4];



 rc = bh1745nuc.get_val(rgbc);

 if (rc == 0) {

 Serial.write("BH1745NUC (RED) = ");

 Serial.println(rgbc[0]);

 Serial.write("BH1745NUC (GREEN) = ");

 Serial.println(rgbc[1]);

 Serial.write("BH1745NUC (BLUE) = ");

 Serial.println(rgbc[2]);

 Serial.write("BH1745NUC (CLEAR) = ");

 Serial.println(rgbc[3]);

 Serial.println();

 }

 delay(500);

}

 

照片6 颜色传感器样本程序的运行结果

照片6 颜色传感器样本程序的运行结果

 

观看串行监视器中显示的数值,可以看见RED、GREEN、BLUE中增加了CLEAR。这个CLEAR表示可以获取可视光波长强度的值。一边观察串行监视器,一边将带颜色的物体靠近传感器,或者将光靠近传感器,可以发现传感器的值会发生变化。若将传感器遮蔽起来,由于光自身无法进入传感器,CLEAR的值会变小。这种情况下,RGB的数值也会变小,很难进行颜色判别。与此相反,若用彩色LED等照射传感器,则可以检测到超过10000的数值。由此可见,通过彩色LED等进行输入是比较合适的。

 

利用颜色传感器分析颜色,用全彩色LED显示

我们通过样品对颜色传感器的动作进行确认后,下一步将对其进行具体的应用。首先,为了正确处理颜色数据,我们必须制作一个简单的电路,即通过颜色传感器判别颜色,并将判别的颜色用全彩色LED显示出来。

将颜色传感器的值通过全彩色LED显示的sketch程序

#include <Wire.h>

#include <BH1745NUC.h>



BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



void setup() {

  byte rc;



  Serial.begin(9600);

  while (!Serial);



  Wire.begin();



  rc = bh1745nuc.init();



  pinMode(9,OUTPUT);

  pinMode(10,OUTPUT);

  pinMode(11,OUTPUT);

}



void loop() {

  byte rc;

  unsigned short rgbc[4];



  rc = bh1745nuc.get_val(rgbc);


  int rVal  = 0;

  int gVal  = 0;

  int bVal  = 0;



  int maxVal  = 0;

  if (rc == 0) {

    for(int i=0;i&amp;amp;lt;3;i++){

      if(maxVal &amp;amp;lt; rgbc[i]){

        maxVal  = rgbc[i];

      }

    }



    rVal  =  (float(rgbc[0])/maxVal)*255;

    gVal  =  (float(rgbc[1])/maxVal)*255;

    bVal  =  (float(rgbc[2])/maxVal)*255;



    Serial.print(rVal);

    Serial.print(",");

    Serial.print(gVal);

    Serial.print(",");

    Serial.print(bVal);

    Serial.print(",");

    Serial.print(rgbc[3]);

    Serial.println("  ");



  }

  analogWrite(9,rVal);

  analogWrite(10,gVal);

  analogWrite(11,bVal);

  delay(500);

  analogWrite(9,LOW);

  analogWrite(10,LOW);

  analogWrite(11,LOW);

  delay(500);

}

このコンテンツを見るためにはJavaScriptを有効にしてください。Please enable JavaScript to watch this content.


for(int i=0;i<3;i++){
if(maxVal < rgbc[i]){
maxVal = rgbc[i];
}
}
rVal = (float(rgbc[0])/maxVal)*255;
gVal = (float(rgbc[1])/maxVal)*255;
bVal = (float(rgbc[2])/maxVal)*255;


此程序改变了样本程序的一部分。在红色指定的部分,RGB获取最大值,将其作为最大值(maxVal)保存在变量中,然后与该最大值进行比较,计算出RGB各颜色的强度比率(float(rgbc[0])/maxVal部分)。然后,由于AnalogWrite可输出0~255的值,通过颜色强度比率乘以AnalogWrite的最大值255,将检出的颜色大致转换为RGB,输出到全彩色LED中。

由于试用的全彩色LED的特性不同,有时会出现无法正确反映RGB各值的情况,这种情况下可通过调整LED的电阻值、或者忽略程序中的小值等方法,来获取分级的颜色。在以下程序中,我们将红色字符部分小于50的各值忽略不计,将其作为0来处理。


//设定各颜色的阈值
if(rVal < 50){
rVal = 0;
}
if(gVal < 50){
gVal = 0;
}
if(bVal < 50){
bVal = 0;
}

将颜色传感器的值通过全彩色LED显示的sketch程序2

#include <Wire.h>

#include <BH1745NUC.h>



BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



void setup() {

  byte rc;



  Serial.begin(9600);

  while (!Serial);



  Wire.begin();



  rc = bh1745nuc.init();



  pinMode(9,OUTPUT);

  pinMode(10,OUTPUT);

  pinMode(11,OUTPUT);

}



void loop() {

  byte rc;

  unsigned short rgbc[4];



  rc = bh1745nuc.get_val(rgbc);



  int rVal  = 0;

  int gVal  = 0;

  int bVal  = 0;



  int maxVal  = 0;

  if (rc == 0) {



    for(int i=0;i&amp;amp;lt;3;i++){

      if(maxVal &amp;amp;lt; rgbc[i]){

        maxVal  = rgbc[i];
      }

    }



    rVal  =  (float(rgbc[0])/maxVal)*255;

    gVal  =  (float(rgbc[1])/maxVal)*255;

    bVal  =  (float(rgbc[2])/maxVal)*255;



    //それぞれの色の閾値を設定

    if(rVal &amp;amp;lt; 50){

      rVal = 0;

    }

    if(gVal &amp;amp;lt; 50){

      gVal = 0;

    }

    if(bVal &amp;amp;lt; 50){

      bVal = 0;

    }



    Serial.print(rVal);

    Serial.print(",");

    Serial.print(gVal);

    Serial.print(",");

    Serial.print(bVal);

    Serial.print(",");

    Serial.print(rgbc[3]);

    Serial.println("  ");



  }

  analogWrite(9,rVal);

  analogWrite(10,gVal);

  analogWrite(11,bVal);

  delay(100);

}

 

このコンテンツを見るためにはJavaScriptを有効にしてください。Please enable JavaScript to watch this content.

这一边的颜色清晰地反映出来了。整体上的印象是比以往的操作更轻松。

总结

不同的颜色传感器、使用方法,有时会出现各自十分有趣的情形。下一次,我们将在颜色传感器的基础上将气压传感器、温度传感器等多个传感器组合在一起,制作出更为智能的照明元器件!