在线时间32 小时
UID337676
ROHM金币0
注册时间2018-4-18
该用户从未签到
金牌会员
- 最后登录
- 2023-11-3
|
这次我们要学习使用以前从未接触过的"颜色传感器"来验证罗姆传感器评估套件的强大功能。
何谓颜色传感器?恰如其名,颜色传感器是可以获取颜色数据的传感器。颜色传感器还有"色彩传感器"、"颜色识别传感器"、"辨色传感器"、"数字颜色传感器"等名称。颜色传感器的原理是通过其内部的红(R)、绿(G)、蓝(B)传感器加上滤色器将可视光区分为不同的信号来获取颜色数据。
罗姆传感器评估套件中搭载了"BH1745NUC"作为颜色传感器模块。
照片1 颜色传感器模块BH1745NUC
照片2 颜色传感器模块BH1745NUC
颜色传感器的试用下面,我们介绍通过Arduino使用颜色传感器的方法。
颜色传感器的安装从下图可知,颜色传感器的安装区域与地磁传感器一样,均为I2C I/F区。关于电源电压,地磁传感器为1.8V,颜色传感器为3V,因此应将左上方的电源电压切换跳线针脚切换到3V的位置。
图1 传感器护罩的连接方法说明
照片3 颜色传感器的安装
安装完成后,应进行Arduino的程序设定。
下载颜色传感器用的库文件接下来,和地磁传感器时一样,应安装使用传感器的库。通过颜色传感器说明页面下方的软件下载来下载库文件。
图2 颜色传感器用库文件的下载
文件下载完成后,打开Arduino IDE添加库,选择下载的文件"BH1745NUC.zip",颜色传感器的动作准备即告完成。
照片4 添加库"BH1745NUC"
顺利添加库后,可以在"sketch示例"及"使用库"的栏中确认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 颜色传感器样本程序的运行结果
观看串行监视器中显示的数值,可以看见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&lt;3;i++){
-
- if(maxVal &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);
-
- }
复制代码
for(int i=0;i<3;i++){
if(maxVal < rgbc){
maxVal = rgbc;
}
}
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
这一边的颜色清晰地反映出来了。整体上的印象是比以往的操作更轻松。
总结不同的颜色传感器、使用方法,有时会出现各自十分有趣的情形。下一次,我们将在颜色传感器的基础上将气压传感器、温度传感器等多个传感器组合在一起,制作出更为智能的照明元器件!
|
|