找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 17913|回复: 21

NXC中利用颜色传感器读回亮度值——颜色传感器可当亮度传感器使用!

[复制链接]
发表于 2011-2-6 02:12:41 | 显示全部楼层 |阅读模式
本帖最后由 grant7788 于 2011-2-8 17:54 编辑

理个目录:
1. 用RGB的值算出亮度。见顶楼。
2. 设成红色LED灯亮,可以读回亮度值,返回值与NXT-G中设成亮度传感器相同。程序见12# / 15#。

刚开始学习NXC,在坛子里看到一个巡线的例子,是用NXC写的,PID调节算法。刚好前两天用NXT-G玩过巡线,不过由于8547套件只有颜色传感器,只能是左右走,一抖一抖地前进。
看了那个PID的例子以后,很有兴趣地试了一下在NXC下读回颜色传感器的值,结果发现仍是只有颜色值,没有原始的数据。
不甘心... 又找了一阵子,被我看到这个帖子:
8547颜色传感器测试最终报告:
http://www.cmnxt.com/thread-927-1-4.html
居然,可以读回R/G/B分量?
那样不是可以直接算出亮度值吗?Y = 0.229R + 0.587G + 0.114B
写个程序试试... 成功!嘿嘿...  这下颜色传感器可以当亮度传感器用啦!
呵呵,太晚了,先睡去了,有时间改一下PID控制的巡线程序。
  1. // 取样时间
  2. #define dt 100

  3. // 定义颜色传感器
  4. #define COLORSENSOR SENSOR_2

  5. task main()
  6. {
  7.     int i;
  8.     float Y;

  9.     /*
  10.     #define  INPUT_RED   0
  11.     #define  INPUT_GREEN   1
  12.     #define  INPUT_BLUE   2
  13.     #define  INPUT_BLANK   3
  14.     #define  INPUT_NO_OF_COLORS   4
  15.     */
  16.     unsigned int raw[3]={0,0,0};

  17.     // 开传感器
  18.     SetSensorColorFull(IN_2);

  19.     // 循环
  20.     while (true)
  21.    {
  22.        // 读取传感器实施数值
  23.        ReadSensorColorRaw(S2,raw);
  24.        for (i=0; i<3; i++)
  25.        {
  26.            NumOut(10, i*10+10, raw[i]);
  27.        }
  28.        Y = 0.229*raw[0] + 0.587*raw[1] + 0.114*raw[2];
  29.        NumOut(10, 40, Y);

  30.        // 等待取样时间
  31.        Wait(dt);
  32.     }
  33. }
复制代码
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2011-2-6 02:24:00 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-6 02:37 编辑

啊~ 写完这帖觉得不对...
前两天玩的某高人写的自平衡小车,就是用NXT-G写的啊...
翻出代码一看,果然...
NXT-G中,Color Sensor的工作模式,有两种,一种是读回Color值,另一种就是读回亮度...
汗啊... 还是不够认真仔细,呵呵~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-6 02:27:14 | 显示全部楼层
太晚了,先去睡了。
明天如果有时间的话去啃一下函数库,看看是否有对颜色传感器直接读回亮度值的函数。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-6 02:36:03 | 显示全部楼层
不甘心,查了一下chm文件,没看到可以直接对颜色传感器读回亮度值的函数。
睡了睡了... 明天还有事儿呢。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-6 09:26:35 | 显示全部楼层
请问你那个光值的公式怎么来的。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-6 09:42:13 | 显示全部楼层
糖伯虎 发表于 2011-2-6 09:26
请问你那个光值的公式怎么来的。

玩单反时看过NEF (Nikon的RAW格式)的解算法,印象里里面有这一段。昨天没去重新翻找这段算法,而是直接从网上google了一下。
我试下来,至少反应了亮度的变化。
看今天有没有时间试一下。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-6 10:31:56 | 显示全部楼层
楼主很强大啊!!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-6 11:13:21 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-6 11:14 编辑

回复 jerryyuzhihao 的帖子

楼主不强大... 楼主是NXT新人。我的理解,这种PID的算法,如果只有颜色值的变化,几乎是阶跃响应,恐怕起不到PID的真正作用。不过只是想法,找时间试了才知道。



如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-6 13:07:41 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-6 13:11 编辑

呵呵,刚才回头看时,有个系数错了...
因为每个数字都是255的话,出来的值应该是255...
Y = 0.229R + 0.587G + 0.114B
==>
Y = 0.299R + 0.587G + 0.114B
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-6 20:22:05 | 显示全部楼层
回复 grant7788 的帖子

LZ一上来就来两个高质量帖子,很有震撼力,我兔年收到大礼,LZ新年快乐。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-6 22:43:16 | 显示全部楼层
lmd 发表于 2011-2-6 20:22
回复 grant7788 的帖子

LZ一上来就来两个高质量帖子,很有震撼力,我兔年收到大礼,LZ新年快乐。

呵呵,坦白讲,这两个帖子应该归并到一个帖子里的。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 01:48:18 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-7 02:13 编辑

忽然发现,
如果把光线设成Red,读回来的值就和NXT-G中设成LightSensor的值一样了!======
不对... 本帖子内容有误。
有几种颜色的读回值有问题。
太晚了,明天继续试...
  1. // 取样时间
  2. #define dt 500

  3. // 定义颜色传感器
  4. #define COLORSENSOR SENSOR_3

  5. task main()
  6. {
  7. int error = 0;
  8. float setpoint = 0;
  9. float actual_position = 0;

  10. // 开传感器
  11. SetSensorColorRed(IN_3);

  12. // 传感器在黑线上方为启示状态
  13. TextOut(1,LCD_LINE1,"Setpoint");
  14. setpoint = COLORSENSOR;
  15. NumOut(50,LCD_LINE1,setpoint);

  16. // 循环
  17. while (true)
  18.   {
  19.    // 读取传感器实施数值
  20.    actual_position = COLORSENSOR;
  21.    TextOut(1,LCD_LINE2,"Actual");
  22.    NumOut(50,LCD_LINE2,actual_position);

  23.    // 等待取样时间
  24.    Wait(dt);
  25.    }
  26. }
复制代码

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 03:06:57 | 显示全部楼层
前面搞错了。
SetSensorColorRed之后,仅能读回Red分量。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 03:07:55 | 显示全部楼层
555... 伤心地去睡了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-8 17:52:23 | 显示全部楼层
grant7788 发表于 2011-2-7 01:48
忽然发现,
如果把光线设成Red,读回来的值就和NXT-G中设成LightSensor的值一样了!======
不对... 本帖子 ...

重新试验,发现,那天晚上是因为电量不足,造成的试验失误。实际上这种做法是可以的。刚才重新做了这个试验,读回的数据和NXT-G下设成Light Sensor是一样的。
昨晚和John Hansen通了封email,也证实了此事。
以下是John回复的邮件中的示例代码。

  1. task main()
  2. {
  3.   SetSensorColorRed(S1);
  4.   while (true) {
  5.     TextOut(0, LCD_LINE1, "        "); // erase value on line 1
  6.     NumOut(0, LCD_LINE1, SENSOR_1);
  7.     Wait(MS_3); // sensor values are only updated once every 3 milliseconds, iirc
  8.   }
  9. }
复制代码



如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-23 14:53 , Processed in 0.100391 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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