分類: Arduino

TCS230/3200/3210 顏色感測器

No Comments

手上有數十種傳感器或功能模組,這顆是接下來想要來玩玩的。很多都是兩三年前就入手的至今完全都沒關愛過。。。
當前有考量是否要順道使用輸出入擴展 IC 來實作,因為初步構想有想要同時使用上兩顆 tcs230 和一顆 rgb led 及一顆埋控來建構範例,但可能會失焦,且 gpios 似乎還夠用。然則,輸出入擴展 ic 的函式庫化也是近身的一項目標。
驅動使用它並不難,網路上已有很多簡單的範例,但筆者想試著做得更細膩點。

由於沒有此板的文件。谷歌及量測後,OE 已經直接接地了。LEDs 也已有上限流電阻,並由 LED pin 作 on/off。參考文件

參考文件劃重點

  • 此感光元件並非真的能識別顏色;它的功用是把光強度轉為電流強度,再轉為頻率大小。因此我們便能偵測頻率以反推光強。
  • 其次,加了三原色濾光片,便能偵測每種原色的光強度,再依據原色強度的配比,當然便能一對一對應任何入射的顏色了。
  • 此元件由三個原色區塊及一個全色(無濾片)區塊所組成一個 8×8 的陣列。重講,
  • TCS230 筆者沒再去查,TCS3200 是一個 8×8 的陣列,其中 R/G/B/W(white/clear) 各佔 16 個 cells。TCS3210 則是 4×6 陣列,各佔 6 cells(感光二極體)。當然,cells 愈多精準度愈高/雜訊愈低。
  • 由 S2,S3 pins 選擇 OUTput 哪個區塊的感光 frequency。
  • OE low 有效,為致能該元件;high 則讓 OUT 成 high impedance,如此可並接多顆感光元件或不同元件。OE low 盡可能地 low 可以降低輸入干擾。其他所有輸入腳位都不能 floating 以防止雜訊趁隙滲入。
  • S0,S1 都設為 low 時為 powerdown 模式以節電。其他組合則對輸出頻率除頻以適合不同應用場合。
  • 輸出頻率固定為 50% duty cycle,故兩次變化(low/high/high/low 斥或 high/low/low/high)便可推定頻率。
  • 原生輸出頻率大變動的前提下,使用除頻相當於將該原生輸出頻率做以平均;即使用除頻為佳;但精準度/解析度相對地會降低。
  • 延遲問題。在某一時刻下的該顏色,我們是分時地量測三原色及一全光強。所以如果即時性是問題,則延遲就會是問題也不是問題。後者是,分時量測是必然所以不是問題。不過,切換除頻/選擇原色/開關量測都會有延遲,這些動作一被改變都會在下個 OUT-freq high 時作內部的變動,所以有效資料會是在一個輸出週期(從遇到 high 之後)加上 1us(按照文意若 1us 不是問題當不會提 1us 因 1us 遠小於最小週期)之後的第一個週期;即,改變->遇害->跳過兩個週期含遇害那個->有效週期。
  • bring up from power down 100us。OE enabled 100ns。
  • 運作特性表。依據此表及 figure 1 來考量如何取決甜蜜點,甜蜜點是指什麼我現下也不知道XD。畢竟光譜是連續的。該表也只是該強度下三個代表性原色頻率下的參考比例。我再想想吧。。。
  • E=hv,所以能量跟頻率成正比關係。我們不僅可以將所量測到的頻率視為光譜的降階,白光跟其他三色可能也可以用和的概念來運算(下述)。而振幅強度亦跟能量有關,不過量測結果全以頻率表示,表示振幅被透明化了,但前提是光譜上的(振幅)強度是各點相同的,又或即便不同,某點振幅更強意謂其色更顯著。故,不需想太多了。。。
  • 因為沒有所謂的正紅正藍正綠所以也就沒有所謂的參考點。
  • 舉例來說,我們從表中看到 red 會超出 clear 的量測值,105%,這或許是誤差,或許是分時取樣的結果,又或許是 red & clear 本就無法有一個共同參考點例如製程差異(上述,所以於此,白光跟其他三色無法用和的概念來看待),再又或許是來自光能量的吸收轉化。
  • 藍綠紅,波長是由小而大,但我們在紅波長的那一行觀察到藍色比例高於綠色比例又或許是其累積能量仍會是綠大於藍。故採累計平均或許是無可避免的。並且可預期所量測到的頻率下,相較之下紅色的會很穩定,而綠或藍將會有快速且大的變動。
    更正,波長依序應是綠藍紅,一時不察,當時是想到藍移紅移現象,要想到彩虹才是。
  • 最後,不除頻,前表數據是 500k-600k,但不知為何後表數據最高只有 20k。故我們當先實驗使用除頻來反推。
  • 結論,應就是使用彼此間的比例;但更精確的是也不比例就是只使用頻率來表示;而再精確的是 clear 也納入參考。即,四種頻率數值 F4 =(Ar, Ag, Ab, Aw)代表某一種顏色。再假設光強度會影響 OUT 頻率大小,例如只打某一波長的 led 發光二極體,增加電壓讓發光更強。那麼就把頻率正規化到 Full-scale frequency 的上界,例如取上界是 20k,那麼 F4_20 = F4 x [ 20 / Max(F4) ]。

初版

  • 注意事項,
  • 腳位若以變數代表,必須使用 volatile。
  • 此板使用 100% freq,最高也都不超過 20k。
  • 若 OTA,仍需先將中斷關掉。
  • 有時無法 bring up,就拔插 usb 重新上電。
  • led 若耗電過大則額外供 vcc 電。

再版

  • 只是加了扣貝斯及範例,
  • 用上了兩張 tcs,
  • 將百分比選擇腳位定死,故只需要 out,color select 共三支腳位,並且 color select 也可共用於兩張 tcs,故總共只要用掉四支 gpios,
  • 這次這張成板的實測,確定 freq 會超過 60k。恰巧一張 tcs 亮四燈,另一張 tcs 只能亮二燈,原因未知,應是板子線路設計有盲點。重點是四燈的,就會超過 60k,因此可判斷光強愈強頻率愈高,二 tcs 經正規化,雖仍有差距但不大。
  • 將實作這範例:一張 tcs 測物件顏色,另一張 tcs 測經程式調配而産生的一顆全彩 led(二者密封不漏光),務求逼近該物件顏色。並有另一顆全彩 led 顯示結果給人觀看。

三版

  • 如圖,這是這條路的終點了。
  • 不講細節只講重點,
  • led 是由 R/G/B 三獨立的電壓通道(gpios),透過 pwm 來調配 Vrms 的大小。然而在時間的微觀尺度下,某顏色下,各自的 duty cycle 不同,例如,以時間來說,R(100us/1ms),G(200us/1ms),B(800us/1ms),很清楚地看到,TCS 的取樣的時間點,將決定顏色為何,而此顏色單單地被決定成,(R,G,B)哪些原色存在,哪些原色不存在,如此而已 XD
  • 因此解決的方式,必需由硬體實現真正的 Vrms,時時刻刻都有電壓/都有該原色,不同的只是電壓/光強的大小。這是第一個問題與解法。
  • 然而,還有第二個很可能的問題。全彩 led 內部,可能是 R/G/B 三個發光二極體不重疊而排列著。即便如圖,筆者選擇霧面 led,仍可依稀看到分離不融合的三原色,這應只是表示該 led 並未就此光學問題作優化讓三原色於空間中重疊。因此,解法,讓 led 旋轉/但只能騙過眼球,被 tcs 取樣仍不見得可行,要不就是必須加裝散光板。
  • 事實上上述兩個問題,應都可由全彩 led 模組來化解,即,筆者應要來找找市面上更合理製成的全彩 led 模組了。希望會有,不然就是又得 DIY 了 XD。
  • 當前,包含程式,可能都先醬了。程式可能也還需就方法的正確與否作除錯,或更改成更好的方法。
  • 先找一下 datasheet,看是否來評估這顆 ws2812b

Categories: Arduino Arduino Brick

Tags:

PHP Code Snippets Powered By : XYZScripts.com