请选择 进入手机版 | 继续访问电脑版
搜索
热搜: ROHM 模拟 车载
查看: 969|回复: 8

[分享] 详解罗姆颜色传感器模块

  [复制链接]

该用户从未签到

51

主题

72

帖子

0

精华

高级会员

最后登录
2019-11-1
发表于 2018-7-24 10:37:58 | 显示全部楼层 |阅读模式
1.jpg
这次我们要学习使用以前从未接触过的"颜色传感器"来验证罗姆传感器评估套件的强大功能。
何谓颜色传感器?恰如其名,颜色传感器是可以获取颜色数据的传感器。颜色传感器还有"色彩传感器"、"颜色识别传感器"、"辨色传感器"、"数字颜色传感器"等名称。颜色传感器的原理是通过其内部的红(R)、绿(G)、蓝(B)传感器加上滤色器将可视光区分为不同的信号来获取颜色数据。
罗姆传感器评估套件中搭载了"BH1745NUC"作为颜色传感器模块。
2.jpg
照片1 颜色传感器模块BH1745NUC

3.jpg
照片2 颜色传感器模块BH1745NUC


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

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


5.jpg
照片3 颜色传感器的安装


安装完成后,应进行Arduino的程序设定。
下载颜色传感器用的库文件接下来,和地磁传感器时一样,应安装使用传感器的库。通过颜色传感器说明页面下方的软件下载来下载库文件。
图2 颜色传感器用库文件的下载


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


顺利添加库后,可以在"sketch示例"及"使用库"的栏中确认BH1745NUC的标识。
7.png
照片5 BH1745NUC被添加到库


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

  2. BH1745NUC.ino



  3. Copyright (c) 2016 ROHM Co.,Ltd.



  4. Permission is hereby granted, free of charge, to any person obtaining a copy

  5. of this software and associated documentation files (the "Software"), to deal

  6. in the Software without restriction, including without limitation the rights

  7. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

  8. copies of the Software, and to permit persons to whom the Software is

  9. furnished to do so, subject to the following conditions:



  10. The above copyright notice and this permission notice shall be included in

  11. all copies or substantial portions of the Software.



  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

  13. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

  14. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

  15. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

  16. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  17. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

  18. THE SOFTWARE.

  19. ******************************************************************************/

  20. #include <Wire.h>

  21. #include <BH1745NUC.h>



  22. BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



  23. void setup() {

  24. byte rc;



  25. Serial.begin(9600);

  26. while (!Serial);



  27. Wire.begin();



  28. rc = bh1745nuc.init();

  29. }



  30. void loop() {

  31. byte rc;

  32. unsigned short rgbc[4];



  33. rc = bh1745nuc.get_val(rgbc);

  34. if (rc == 0) {

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

  36. Serial.println(rgbc[0]);

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

  38. Serial.println(rgbc[1]);

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

  40. Serial.println(rgbc[2]);

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

  42. Serial.println(rgbc[3]);

  43. Serial.println();

  44. }

  45. delay(500);

  46. }
复制代码




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


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

利用颜色传感器分析颜色,用全彩色LED显示我们通过样品对颜色传感器的动作进行确认后,下一步将对其进行具体的应用。首先,为了正确处理颜色数据,我们必须制作一个简单的电路,即通过颜色传感器判别颜色,并将判别的颜色用全彩色LED显示出来。
将颜色传感器的值通过全彩色LED显示的sketch程序
  1. #include <Wire.h>

  2. #include <BH1745NUC.h>



  3. BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



  4. void setup() {

  5. byte rc;



  6. Serial.begin(9600);

  7. while (!Serial);



  8. Wire.begin();



  9. rc = bh1745nuc.init();



  10. pinMode(9,OUTPUT);

  11. pinMode(10,OUTPUT);

  12. pinMode(11,OUTPUT);

  13. }



  14. void loop() {

  15. byte rc;

  16. unsigned short rgbc[4];



  17. rc = bh1745nuc.get_val(rgbc);


  18. int rVal  = 0;

  19. int gVal  = 0;

  20. int bVal  = 0;



  21. int maxVal  = 0;

  22. if (rc == 0) {

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

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

  25. maxVal  = rgbc[i];

  26. }

  27. }



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

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

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



  31. Serial.print(rVal);

  32. Serial.print(",");

  33. Serial.print(gVal);

  34. Serial.print(",");

  35. Serial.print(bVal);

  36. Serial.print(",");

  37. Serial.print(rgbc[3]);

  38. Serial.println("  ");



  39. }

  40. analogWrite(9,rVal);

  41. analogWrite(10,gVal);

  42. analogWrite(11,bVal);

  43. delay(500);

  44. analogWrite(9,LOW);

  45. analogWrite(10,LOW);

  46. analogWrite(11,LOW);

  47. delay(500);

  48. }
复制代码




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来处理。
  1. #include <Wire.h>

  2. #include <BH1745NUC.h>



  3. BH1745NUC bh1745nuc(BH1745NUC_DEVICE_ADDRESS_39);



  4. void setup() {

  5. byte rc;



  6. Serial.begin(9600);

  7. while (!Serial);



  8. Wire.begin();



  9. rc = bh1745nuc.init();



  10. pinMode(9,OUTPUT);

  11. pinMode(10,OUTPUT);

  12. pinMode(11,OUTPUT);

  13. }



  14. void loop() {

  15. byte rc;

  16. unsigned short rgbc[4];



  17. rc = bh1745nuc.get_val(rgbc);



  18. int rVal  = 0;

  19. int gVal  = 0;

  20. int bVal  = 0;



  21. int maxVal  = 0;

  22. if (rc == 0) {



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

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

  25. maxVal  = rgbc[i];
  26. }

  27. }



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

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

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



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

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

  33. rVal = 0;

  34. }

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

  36. gVal = 0;

  37. }

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

  39. bVal = 0;

  40. }



  41. Serial.print(rVal);

  42. Serial.print(",");

  43. Serial.print(gVal);

  44. Serial.print(",");

  45. Serial.print(bVal);

  46. Serial.print(",");

  47. Serial.print(rgbc[3]);

  48. Serial.println("  ");



  49. }

  50. analogWrite(9,rVal);

  51. analogWrite(10,gVal);

  52. analogWrite(11,bVal);

  53. delay(100);

  54. }
复制代码


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

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



这一边的颜色清晰地反映出来了。整体上的印象是比以往的操作更轻松。
总结不同的颜色传感器、使用方法,有时会出现各自十分有趣的情形。下一次,我们将在颜色传感器的基础上将气压传感器、温度传感器等多个传感器组合在一起,制作出更为智能的照明元器件!

回复

使用道具 举报

该用户从未签到

1763

主题

5868

帖子

1

精华

论坛元老

最后登录
2019-11-15
发表于 2018-7-24 16:37:15 | 显示全部楼层
测量的准确度怎么样?
回复 支持 反对

使用道具 举报

该用户从未签到

204

主题

4124

帖子

0

精华

论坛元老

最后登录
2019-11-10
发表于 2018-7-24 20:50:00 | 显示全部楼层
看看了
回复

使用道具 举报

该用户从未签到

1153

主题

5857

帖子

0

精华

论坛元老

最后登录
2019-10-3
发表于 2018-7-24 21:54:08 | 显示全部楼层
实验类的就是好
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

586

帖子

0

精华

金牌会员

最后登录
2019-11-15
发表于 2018-7-28 16:12:24 | 显示全部楼层
wudianjun2001 发表于 2018-7-24 16:37
测量的准确度怎么样?

要准确度得校正,楼主这个只是一个方法,非商品级无需有多大的准确度。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

230

帖子

0

精华

论坛元老

最后登录
2019-11-11
发表于 2018-8-4 07:53:39 | 显示全部楼层
zwei99999999 发表于 2018-7-28 16:12
要准确度得校正,楼主这个只是一个方法,非商品级无需有多大的准确度。 ...

我觉得应该问的是精度如何?
回复 支持 反对

使用道具 举报

该用户从未签到

18

主题

395

帖子

0

精华

金牌会员

最后登录
2019-6-28
发表于 2018-8-4 10:31:15 | 显示全部楼层
学习学习
回复

使用道具 举报

该用户从未签到

29

主题

512

帖子

0

精华

金牌会员

最后登录
2019-11-15
发表于 2018-8-15 10:31:13 | 显示全部楼层
牛逼~~~~~~~~~~~~
回复

使用道具 举报

该用户从未签到

0

主题

187

帖子

0

精华

高级会员

最后登录
2019-3-26
发表于 2018-8-25 11:26:47 | 显示全部楼层
这个识别色彩范围怎么样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

小黑屋|手机版|Archiver|罗姆半导体技术社区

GMT+8, 2019-11-17 17:44 , Processed in 0.114918 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表