2012-06-14

樂高機器人的彩色感應器(顏色感應器)9694




 


NXT樂高機器人的彩色感應器比較

探奇 邱信仁 2012.06



NXT 樂高機器人9797內附光源感應器Light Sensor,只能根據反射光線的強弱辨識顏色,例如紅,藍等。如果是相近的顏色就無法辨識,例如藍跟綠。特別是這次WRO比賽,所有競賽項目都需要辨識 顏色,(足球賽也可能需要辨識綠色地板的深淺),這時只好依賴彩色感應器。



目前適用於NXT樂高機器人的彩色感應器(Color Sensor,顏色感應器)有兩款,

一顆是樂高官方的9694 Color Sensor

另一顆是HiTechnic公司的NXT Color Sensor V2 (NCO1038)

兩顆感應器的比較可以參考Philo先生的文章,探奇也發文介紹過,

請參考探奇舊文章:Plilo先生的精彩文章--NXT彩色感應器的比較

同時探奇也利用彩色感應器進行軌跡車的測試,請參考探奇舊文章:NXT彩色感應器軌跡車

以下我們來看看彩色感應器還有哪些其他的用法。

LEGO官方彩色感應器(顏色感應器) 9694


在NXT-G的命令方塊中,彩色感應器能夠偵測六種顏色,黑藍綠黃紅白,

根據Xander文章介紹,這顆樂高官方的彩色感應器只有LED跟光電晶體,

(請參考探奇舊文章:『樂高機器人8547的彩色感應器』大解剖)

紅綠藍三種光輪流發光,瞬間取得光電晶體的數值。

也就是發出紅光時,所得到的就是被測物體反射紅光的光電晶體讀值。

相同原理,當LED發出藍光,綠光時,也能得到相對應的讀值。

綜合三原色的讀值,就能判斷被測物體的顏色。


Team Hassenplug的Color Range Block

樂高官方的彩色感應器是類比式感應器,也就是直接利用類比數位轉換


電線的訊號,得到數值。目前我手邊並沒有資料顯示NXT主機是由電線的哪些腳位得到讀值,加上因為Color Sensor Block的限制,我們只能讀取顏色值,而非紅藍綠光的個別讀值。

    幸好Team Hassenplug解決了這個問題,他們提供了一個第三方命令方塊,Color Range Block,可以分別讀取發出紅綠藍三種顏色的光感應器讀值,甚至還包含Ambient讀值(是指不發光模式下的讀值?)

LED發光模式


使用彩色感應器的Color Mode偵測顏色時,三色LED燈用肉眼觀看,看起來似乎是同時點亮的。不過亮度並沒有像三種顏色單獨點亮時來的高,再加上Philo先生文章的敘述,我 想應該是三種光輪流點亮,或是以『紅光-->綠光-->藍光-->全滅』的順序快速輪動。



雖然沒有高速攝影機,但是我想還是可以透過數位相機鏡頭,試著找出LED輪流點亮的證據。順手寫了一段程式,配合拍攝,推測結果應該是對的,三色LED燈是輪 流點亮,從下面的影片中可以看到,點亮單色光時,拍攝到的光是比較亮的,當切換感應器為Color Mode時,拍攝到的光是相對較暗,而且有彩色光點閃動。




實驗測量分析


上圖:距離0.5公分





上圖:距離1.3公分(示意圖,數值沒有更新)




探奇使用Color Range Block撰寫程式簡單記錄RGBA的數值,測試對象是樂高積木,挑選黑藍綠黃紅白六種顏色的積木。探奇發現樂高積木顏色比較鮮豔,彩色感應器很容易偵測 出正確的顏色,如果拿一般印刷品(例如雜誌)進行測試,就不一定能偵測正確的顏色。同時我也利用其他積木架設測試台,固定測試積木的距離,盡量減少變因。



下面是測試結果:

顏色    距離    R          G        B     A


黑    0.5 cm    188    194    191    70


黑    1.3 cm    139    158    147    80


藍    0.5 cm    265    312    433    76


藍    1.3 cm    191    252    373    86


綠    0.5 cm    204    381    243    71


綠    1.3 cm    144    316    200    85


黃    0.5 cm    591    479    259    79


黃    1.3 cm    517    423    230    103


紅    0.5 cm    559    269    237    85


紅    1.3 cm    458    213    179    95


白    0.5 cm    611    577    535    89


白    1.3 cm    522    500    459    94



R表示Red;G表示Green;B表示Blue;A是Ambient。




上面的測試大致符合我的推測,例如測試紅色積木時,R數值提高,GB數值下降;白色積木的結果則是RGB都呈現高數值;黃色則是RG數值較高,B數值較低的結果。



距離遠近也是正常的,距離比較遠(1.3公分)的確得到比較低的數值。




探奇發現每次測試,數值仍然會有些許差異,或許這個測試還可以更進一步以多次測試處理平均值,期望得到更可靠的實驗結果。



至於A讀值,實在是有點怪怪的,符合黑色較低,白色或高亮度較高的定義。但是也同時出現一些奇怪現象,例如103,高於100的數值;以及近距離(0.5cm)反而比遠距離(1.3公分)較低。這些需要再思考問題何在。


積木顏色量測

原本進行實驗時想試試System Brick(無洞)與Technic Brick(有洞)的差異,因為直覺認為空洞也會影響光線的反射,但是試測後發現完全沒有差別,我想是因為樂高積木的品質太好了。



根據彩色感應器的原理,我想有下列因素會影響顏色的偵測:



1. 感應器與待測物距離:根據說明,一般需要將感應器保持在1-1.5公分的範圍,才不會偵測錯誤。如果距離太遠,沒有足夠的反射光線,那麼當然都是判斷為黑色。

2. 環境光的影響:周遭光線太亮,造成反射光過多,也會誤判。

3. 主機電壓:這只是我的推測,在不足的電壓下,發出的LED光源強度可能比較弱,接收的光電晶體也可能出現不同讀值。雖然不清楚Color Sensor Block內部的運算方式,但是極有可能影響判斷結果。這點還需要測試。

最後的疑問

   
    有了Color Range Block,應該可以補足Color Sensor Block的不足。以三色光線的讀值來判別顏色,也許還能分辨顏色的深淺。

    不過還有個疑問,NXT主機是如何接收三種色光分別的讀值呢?

是透過不同的接線腳位?需要三條接線?(有點複雜)



還是依照時間順序接收?(這樣就不太可能達到2.5ms的反應)


還請大家一起討論!




7 則留言:

  1. 邱老師真是專業又用心

    拍拍手!!!
    [版主回覆06/14/2012 21:57:18]哪裡,只是寫出一些自己知道的東西,

    謝謝老師的鼓勵!

    回覆刪除
  2. NXT color sensor是analog sensor, 所以讀取值都是透過pin 1(白色線),
     另外推測也會類似Light sensor一樣, 使用pin5(黃色線)與pin6(藍色線)來控制發光二極體的開關與顏色,
    2個bits的值可以提供4種狀態的切換, 但實際上卻有五種狀態: None' Full' R' G' B,
    所以, FULL狀態可能是由firmware以快速切換RGB方式來顯示,
    這應該與邱老師觀察到的結果一樣.
    以上純屬推測, 請多指教

    [版主回覆06/15/2012 09:41:06]謝謝提示,Photo Detector的值都是由Pin 1取得,那麼比較不清楚的是如何快速取得三個值,計算出對應顏色,如果真如Philo所說,反應在2.5 ms,實在是太快了。

    LED亮燈狀態,我推想應該是類似家裡的電子式電燈開關,就是吊扇燈,可以輪流切換三顆燈,六顆燈那種IC,

    如此一來只要切換Pin 5, Pin 6, 就由Color Sensor裡面的IC控制亮燈,依序是R, G, B, Full, None,Full直接由Sensor裡的IC控制,快速輪流點亮。

    理論上應該也可以增加IC模式,變成RG 或RB 或 GB點亮。





    回覆刪除
  3. 剛才查了一下NXC programer's guide, 在firmware中有一個 ColorSensorRead 的system call,
    可以在一次呼叫之後, 用陣列同時回傳RGB個別的raw value, 所以, 我想透過firmware是有機會很快地讀取到感應器的偵測值,
    另外, 在Input sensor type的常數定義, 關於color sensor就有5個, 分別是:



    #define
    SENSOR_TYPE_COLORFULL       IN_TYPE_COLORFULL

    #define
    SENSOR_TYPE_COLORRED         IN_TYPE_COLORRED

    #define
    SENSOR_TYPE_COLORGREEN    IN_TYPE_COLORGREEN

    #define
    SENSOR_TYPE_COLORBLUE       IN_TYPE_COLORBLUE


    #define
    SENSOR_TYPE_COLORNONE      IN_TYPE_COLORNONE
    這些是指定color sensor預備要用來讀取哪一些特定顏色的值,
    FULL就是全彩, 因此LED會是白燈,
    NONE就是讀取環境光源, 因此LED會OFF(暗),
    另外的R'G'B Input type, 則分別會讓LED顯示個別的顏色,
    除此這些以外, 沒有其他的input type,
    因為這些都是Firmware已經內建好的功能,
    我還沒有找到讓LED顯示其他的顏色的設定,
    可以再研究看看
     


    [版主回覆06/16/2012 14:15:31]謝謝您的資訊,

    我昨天也是查了NXC及ROBOTC的函式庫,的確是由Firmware直接處理這些Raw Data,所以可以直接得到相對應的顏色值。

    至於LED的亮燈模式,我想應該還是由感應器本身直接控制比較方便。

    目前也沒有人能夠控制彩色感應器點亮其他燈光組合。

    回覆刪除
  4. 邱老師:我不知道為何我已下載Color Range Block,但卻無法安裝至nxt-g(我會安裝nxt block),請您幫幫我吧~
    [版主回覆06/22/2013 22:24:03]

    你好:

    請將下載解壓縮後的目錄名稱由ColorRangeBlock改為Color Range Block,(R,B前面有空格)

    目錄名稱需要跟裡面的檔案名稱相同,這樣NXT-G才找得到檔案。

    祝你成功!


    回覆刪除
  5. 老師您好,最近我正在嘗試用EV3寫RGB,但是EV3的軟體沒有RGB的命令方塊,曾經我有用過HiTechnic的命令方塊來寫RGB,但是失敗了,在測試中中途燈就不亮,換線也沒用,請問老師娜裡下載的到用來寫RGB的命令方塊?

    回覆刪除
    回覆
    1. 你好:
      Mindcuber中有顏色感應器RGB的EV3軟體控制命令,你可以參考使用。
      http://mindcuber.com/mindcub3r/mindcub3r.html#ColorSensorRGBBlock
      祝你順利!

      刪除
  6. 謝謝老師

    回覆刪除

探奇歡迎大家留言討論!謝謝分享你的意見。