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的反應)
還請大家一起討論!
邱老師真是專業又用心
回覆刪除拍拍手!!!
[版主回覆06/14/2012 21:57:18]哪裡,只是寫出一些自己知道的東西,
謝謝老師的鼓勵!
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點亮。
剛才查了一下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的亮燈模式,我想應該還是由感應器本身直接控制比較方便。
目前也沒有人能夠控制彩色感應器點亮其他燈光組合。
邱老師:我不知道為何我已下載Color Range Block,但卻無法安裝至nxt-g(我會安裝nxt block),請您幫幫我吧~
回覆刪除[版主回覆06/22/2013 22:24:03]
你好:
請將下載解壓縮後的目錄名稱由ColorRangeBlock改為Color Range Block,(R,B前面有空格)
目錄名稱需要跟裡面的檔案名稱相同,這樣NXT-G才找得到檔案。
祝你成功!
老師您好,最近我正在嘗試用EV3寫RGB,但是EV3的軟體沒有RGB的命令方塊,曾經我有用過HiTechnic的命令方塊來寫RGB,但是失敗了,在測試中中途燈就不亮,換線也沒用,請問老師娜裡下載的到用來寫RGB的命令方塊?
回覆刪除你好:
刪除Mindcuber中有顏色感應器RGB的EV3軟體控制命令,你可以參考使用。
http://mindcuber.com/mindcub3r/mindcub3r.html#ColorSensorRGBBlock
祝你順利!
謝謝老師
回覆刪除