徐志江,張 俊,邵祥兵,盧為黨,4,華驚宇,貢 毅
(1.浙江機電職業技術學院電氣電子技術系,杭州 310053;2.浙江工業大學信息工程學院,杭州 310023;3.浙江工商大學信息與電子工程學院,杭州 310018;4.南方科技大學深圳市物聯網智能信息處理工程實驗室 廣東 深圳 518055)
隨著社會的不斷發展,人們越發關注藍光危害問題,照明燈光源安全性受到重視[1]。因為照明燈在生產過程中不合格或者長時間使用照明燈老化都會導致藍光分量過多,這會對人體產生一定危害,即所謂的藍光危害,因此對照明燈等可見光光源進行光譜質量檢測分析非常有必要。
光譜儀器是應用光學技術、電子技術、圖像技術、傳感器技術以及計算機技術對物質成分、結構、特性等進行測量和分析的基本設備,也是研究光譜學的重要裝置。光譜儀器在許多領域越來越多的發揮著重要作用。在測量應用中可以量測發光體光譜、物質對光譜吸收度和穿透度、色彩等,化學分析應用中可以進行物質分析、成分分析、定性分析[2]等。另外,光譜儀還可以應用于航天遙測、軍事領域中。傳統上大多數光譜設備用于工業或實驗室應用是昂貴的、笨重的[3],由于這些限制,許多光譜研究僅限于實驗室方面。隨著光學、微電子技術等的發展,出現了很多微型光譜儀[4],大大提高光譜設備的便攜性、實用性。
此外,很多光譜設備將數據采集模塊和數據分析顯示模塊集成在一起,或者通過USB接口連接[5],這會降低設備的實用性、可拓展性。也有基于WiFi無線通信的光譜設備[6],但往往只利用WiFi模塊進行數據傳輸,需要額外微控制器進行數據采集控制以及數據傳輸控制,而實際上WiFi模塊內嵌了性能強悍的微控制器,可以不用再添加額外的微處理器。
本文提出并設計了一種手持式可見光光譜分析儀。分析儀采取了基于ESP32 WiFi模塊[7-8]的光譜數據采集設備與基于安卓智能手機上的數據分析與顯示的App應用程序相分離的模式[9-10],兩者之間通過WiFi進行信令和數據的通信交互。光譜數據采集設備以樂鑫公司的ESP32作為控制核心,經過合適的積分時間之后,驅動光譜傳感器C12666MA[11]模擬量數據[3];然后再配合模數轉換(ADC)芯片把模擬量轉換成數字量。整個時序驅動數據采集模塊是放置在ESP32的MicroPython固件[12]中,全部用C語言來編寫實現,避免了Python執行效率偏低無法保證時序的缺點。利用ESP32模塊的WiFi功能產生一個無線AP[13],通過TCP協議[14-15]接收App應用程序連接,解析按照雙方既定的消息格式發送的命令;根據相應命令執行和回傳結果,實現了光譜數據的采集和數據傳輸。光譜數據分析與顯示App客戶端是基于Android平臺的App軟件,利用TCP協議發送數據請求命令,獲取光譜分布數據[14]、繪制可見光光譜圖、顯示光譜分布數據、計算并顯示光譜參數與繪制色品圖。
如果光譜傳感器的積分時間[16-18]不充分或者過飽和,從而導致采集到的光譜數據無效,后續參數估計不可靠的問題。基于此,提出了一種積分時間自適應控制算法,在被測光的強度是未知的情況下,仍然能夠快速、自適應地選擇合適的積分時間。此外,App在繪制相關色品圖時,數據計算量過大導致出現界面延遲加載卡頓現象[19],故而采用雙緩沖機制解決此問題。
本文的組織如下:第1節介紹了分析儀的整個系統設計原理;第2節詳細闡述了軟件系統,包括基于狀態機的光譜數據采集的驅動、快速合理的自適應積分時間控制算法、色度學參數的計算方法和雙緩沖機制原理實現等;第3節是測試和結果分析;最后是結論。
所設計的系統原理框圖如圖1所示。系統分為光譜數據采集設備和基于Android手機的App客戶端軟件。采集設備集成了2000 mAh鋰電池、充放電與升壓一體化模塊、WiFi傳輸和控制為一體的樂鑫ESP32模塊、光譜傳感器C12666MA以及16位模數轉換芯片ADS8326[20]。

圖1 系統原理框圖
光譜數據采集設備的核心器件是濱松C12666MA這顆圖像傳感模塊,它基于濱松MEMS和圖像傳感技術設計的。圖像傳感器是基于CCD(Charge Coupled Device)感應原理工作,內置256個感光像素,具有340 nm~780 nm的光譜響應范圍,最大光譜分辨率為15 nm。
充放電與升壓一體模塊既可以通過外接MicroUSB口為鋰電池充電,又可以把鋰電池放電的輸出電壓升高到5 V,為光譜傳感器和模數轉換芯片供電,同時通過低壓降電源芯片LDO為ESP32模塊提供3.3 V電源。系統在鋰電池滿充滿、ESP32全速運行的情況下,穩定工作時長至少4 h。
微控制芯片采用了ESP-WROOM-32(ESP32)WiFi模塊,是樂鑫最新發布的新一代WiFi和藍牙雙模雙核無線通信芯片,內置了一顆高性能Tensilica LX6雙核處理器以及32 MB大小Flash空間,擁有額外拓展IO口,支持超低功耗待機,是移動設備、可穿戴電子產品和物聯網應用的最佳選擇。EPS32的協議棧只占用一半的系統資源,對于數據采集功能,系統資源夠用。因此,本系統采用ESP32模塊來驅動光譜傳感器C12666MA和模數轉換芯片ADS8326。盡管ESP32內部也集成了12位的ADC,但其輸入的電壓范圍和轉換精度不滿足要求,本系統采用了16位的ADS8326作為模數轉換芯片。
基于Android手機的光譜分析和參數顯示App客戶端軟件,主要是把采集到的光譜分布數據,根據光源色度學標準計算、分析、顯示參數,繪制相關色品圖,顯示內容豐富。
系統軟件設計包含光譜分布數據采集與傳輸軟件和手機App軟件。其中光譜分布數據采集與傳輸包括了光譜傳感器和ADC的驅動程序,以及通過WiFi的、基于TCP協議的信令和數據交互;手機App軟件設計包括自適應積分時間算法、光源色度學參數計算和手機App功能展示等功能;針對加載卡頓現象,提出了采用雙緩沖機制解決此問題。
光譜分布數據采集模塊是驅動光譜傳感器與ADC模塊,以獲取光譜分布數據。C12666MA時序圖如圖2所示,由ESP32控制IO管腳的邏輯電平,生成完全符合圖2的時序狀態,實現了每個像素點的積分、在CLK時鐘信號的驅動下移動出模擬量Video、經過ADC轉換為數字量的驅動功能。

圖2 C12666MA時序圖[11]
光譜分布數據采集驅動采用定時器加狀態機來協同控制光譜傳感器與ADC芯片的時序,以完成數據采集,狀態圖如圖3所示。在就緒狀態,初始化所有控制光譜傳感器和ADC模塊的管腳,為積分和轉換做好準備;啟動積分,使得光譜傳感器進入積分狀態,ST管腳上2次相鄰下降沿的時間差為像素的積分時間;積分時間到,每個像素的模擬信號Video在CLK時鐘的驅動下依次串行移出,然后經過ADC轉換成數字量。根據C12666MA的時序圖,每4個CLK時鐘,串行移出一個像素點的模擬值,只有當模擬量有效時,開啟ADC轉換,并把轉換后的數字量保存到數組中。

圖3 光譜分布數據采集狀態圖
時序驅動主要利用ESP32模塊定時器中斷完成時序模擬、傳感器狀態切換,結合狀態機在定時器中斷服務函數里完成數據采集。首次進入定時器中斷服務程序ISR時,初始化光譜傳感器和ADC芯片的所有管腳,為后續的動作做好準備。每個像素點的積分時間由光譜傳感器ST管腳上的2次相鄰下降沿的時間差來控制,因此在開始積分時刻和積分結束時刻,均在ST管腳上產生下降沿。當進入到讀取像素狀態時,從光譜傳感器中串行移出一個像素的模擬量,需要4個CLK時鐘,也即4個高電平、4個低電平,共8次ISR中斷。在第K次中斷,如果K=3,此時某個像素的模擬量已在光譜傳感器的Video管腳有效輸出,設置ADC的片選有效,為AD轉換做準備;在K=4時,啟動ADC轉換,也即啟動SPI功能;在K=7時,AD轉換已經結束,把轉換后的數字量保存到數組中;然后判斷256個像素是否已經全部移出并且AD轉換完畢,如果是,則在下一個ISR中復位光譜傳感器和ADC芯片,并關閉定時器。
ESP32工作在AP(Access Point)模式下,手機App客戶端通過WiFi與此AP連接。ESP32為服務端,App為客戶端,通過TCP的socket進行通信。服務端采用了select機制來管理所有客戶端,根據雙方既定的協議來進行交互數據。ESP32采用了開源的MicroPython固件,編寫Python代碼來實現通信。利用uselect模塊poll()方法獲取poll對象poll_obj,利用poll_obj對象的register()方法監聽主socket的POLLIN和POLLHUP事件。利用poll_obj對象的poll()方法獲取事件對象events,遍歷事件對象獲取其中socket,如果是主socket,則說明是新增的會話,執行addSession()方法,把新用戶的套接字和地址保存到字典connections中,并且對poll_obj對象中添加新套接字的POLLIN和POLLHUP事件進行監聽;如果不是主socket,則從connections字典中得到客戶端socket,利用usocket模塊recv()方法接收客戶端上發的消息msg。從消息中利用正則模塊ure的search()函數和正則表達式匹配雙方既定的消息格式,提取出命令和參數。如果是合法的,則執行相應的功能;如果是非法的,則向客戶端發送命令/參數錯誤信息。如果是斷開連接的命令,則調用poll_obj對象的unregister()方法和主動斷開所有客戶端的socket,否則繼續監控事件對象events。當網絡出現異常或者客戶端退出時調用delSession()方法,從poll_obj對象中取消事件監聽,并從字典中刪除該用戶的socket。
線陣CCD的積分時間在光譜測量中十分重要,由于CCD的輸出與積分時間之間不是完全線性的,并且當積分時間不充分或者過飽和時,與理想線性值之間的相對誤差非常大。如果在CCD感光元件的非線性區間采用線性方法會對頻譜分布數據的測量帶來較大誤差,導致后續參數估算不可靠的問題。為了解決這一問題,設計了一套完整的CCD自適應調控積分時間算法。記線陣CCD包含的光傳感器像素點個數為N,第k個像素點對應的波長為λk,第k個像素點的零漂為Vd,k,像素點的最大飽和輸出電壓為Vsat,比例系數C1=C2=2,CCD積分時間自適應控制方法包括以下步驟:
①令i=0,給定一個較短的積分時間ti;


(1)
Vk(ti)包含了測量誤差;
④對Vk(ti)作歸一化處理,得到相對電壓值,也即
RVk(ti)=Vk(ti)/Vsat
(2)

(3)

⑥當 RVi∈[1/4,3/4]時,如果i≥1,并且 RVi-1在非線性區間[0,1/8),更新比例系數C1,
C1=C1+μ(RVi-1/2)
(4)
如果 RVi-1在非線性區間(7/8,1],更新比例系數C2,
C2=C2+μ(RVi-1/2)
(5)
式中:μ為學習速率,這里取μ=0.1,同時,積分時間為ti時獲得的光譜分布數據在合理的范圍內,跳出循環,結束;
當 RVi∈[1/8,1/4)和 RVi∈(3/4,7/8]時,雖然在線性區間內,但與最優積分時間相比,相差比較大,因此以最優積分時間為基準、線性增加或減少積分時間;當 RVi∈[0,1/8)時,積分時間明顯不足,以C1倍的線性比增加積分時間;當 RVi∈(7/8,1]時,積分時間明顯太長,以C2倍的線性比減少積分時間。跳到步驟②繼續下次測量。
本系統能夠顯示的光源色度學參數有很多,下面將給出三個重要參數計算方法。
①色品坐標
光源的色品坐標是一個重要的色度學參數。色品坐標精確的表示了照明光源的發光顏色,借助數學方法來表示顏色的基本參數,它可以在色度圖中表示出來。通過測得光源的相對光譜功率分布,從而計算出色品坐標。首先在可見光波段內計算出光源顏色的三刺激值,用下面的公式來進行計算:
(6)
(7)
(8)
(9)

(10)
在實際工作中,首先要用光譜輻射計測量得到光源的相對光譜功率分布或者用分光光度計來測得物體的光譜反射比或者是光譜透射比,然后再根據CIE推薦的標準照明體數據和標準色度觀察者光譜三刺激值數據,最后可編寫計算程序,得到樣品的色品坐標值。
②色溫
光源的色溫是用來描述光源的光譜分布的物理量,它可以量度光線的顏色組成成分。但是,一般光源不會正好落在黑體軌跡線上,因此光源的色溫用相關色溫表示。相關色溫能夠簡便的描述光源的光色,相關色溫相同的光源說明它們的光色相同,但它們的光譜分布可以有較大的差異。相關色溫的經驗計算公式如下:
T=a1A4+a2A3+a3A2+a4A+a5
(11)

③顯色性
光源對物體自然顏色所能呈現的程度稱為顯色性,換言之也就是光源顯現被照物體真實顏色的能力。物體的真實顏色是指在參照照明體(通常為完全輻射體)下所呈現的顏色。光源的顯色性是由顯色指數來衡量的。光源對某一種標準樣品顯色指數叫做特殊顯色指數,用Ri來表示。顯色指數的計算過程如下所示:

(12)
再根據光譜功率分布和顏色樣品的光譜反射系數,計算待測光源照明下15種顏色樣品的色度坐標(xk,i,yk,i),計算(uk,i,vk,i);分別將被測光源的色坐標(uk,vk)、被測光源照射下的顏色樣品色坐標(uk,i,vk,i)代入下式中,計算出ck,dk以及ck,i,dk,i
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)
式中:r為參考光源下標,i為顏色樣品序號的下標,k為被測光源下標。
最后由式(21)和式(22)計算一般顯色指數Ra和特殊顯色指數Ri;
Ri=100-4.6ΔEi
(21)
(22)
為了方便用戶本地查閱和光譜數據的可視化顯示,分析儀借助Android手機設計了一套客戶端App來進行光譜數據的分析和結果顯示。如圖4所示,客戶端App包括光譜數據采集、參數估計、文件管理和頻譜圖繪制四個功能。

圖4 客戶端App功能分類示意圖
①光譜分布數據采集功能包括開啟并連接采集裝置、設置采集積分時間和采集頻譜命令。
②參數估算功能對采集到的數據進行分析處理,計算出頻譜參數,并顯示在ListView中。
③文件管理功能將頻譜分布數據以流的形式保存至SD卡內指定的文件夾中,保存的數據可實時被查看。
④頻譜圖繪制功能包括頻譜圖繪制,以380 nm至780 nm之間的N個離散波長為橫坐標,以對應頻譜分布數據為縱坐標繪制頻譜曲線圖,曲線圖中用不同的RGB顏色填充,填充的顏色為該離散波長下的RGB顏色分量。通過頻譜圖直觀地了解到不同波長下頻譜的變化趨勢。
APP在繪制相關色品圖時,數據計算量過大導致出現界面延遲加載卡頓現象[19],故提出采用雙緩沖機制解決此問題。雙緩沖機是軟件啟動的時候就在緩存中開始進行復雜的數據計算和繪圖過程,并將繪制的圖片以Bitmap形式保存。當軟件運行實現色品圖展示的功能時,直接從緩存中讀取已繪制的圖片,并將其加載到屏幕上,毋須再進行數據計算和繪制的過程。在Android中通過自定義View繼承View,創建父類View中的構造方法,在構造方法中創建一個緩沖區圖片cacheBitmap,該緩沖區圖片大小與Android自定義View的圖片大小相同,然后將緩沖區圖片cacheBitmap設置為畫布cacheCanvas,將需要繪制的色品圖通過cacheCanvas繪制到緩沖區畫布上。然后在自定義View中重寫onDraw()方法,通過drawBitmap()方法繪制cacheBitmap,這樣就可以將緩沖區畫布上的色品圖加載到App的屏幕上。采用雙緩沖機制大大節儉了繪圖時間,加快色品圖展示時間,有效地解決了頁面卡頓現象。
測試是檢驗系統合理性的關鍵步驟,本系統完成光譜定標工作和在光譜定標的基礎上進行系統測試工作。
光譜定標是實際光譜數據測量中一個重要環節,由于CCD感光元件的輸出值并不是真實光譜值,而是AD轉換器的AD值,如果只采用CCD的輸出值進行運算,將會給后續工作帶來較大誤差,因此需要通過光譜定標確定實際待測燈的相對光譜值。

如圖5所示,分別給出的真實的相對光譜值和CCD輸出的相對AD值。其中紅色曲線代表的是由色溫計算得到的真實相對光譜圖,而白色曲線代表的是CCD輸出的相對AD值,由該圖可以看出,如若不進行光譜定標,將會存在很大誤差。

圖5 真實的相對光譜值和CCD輸出的相對AD值對比圖
系統測試是在光譜定標基礎上進行測試,App根據獲取的光譜數據進行光譜繪制和光源色度學參數計算。以下是測試過程:①打開設備端電源開關,給CCD探頭蓋上乳白色的濾光片;②打開手機網絡設置,搜索模塊的SSID,輸入密碼,進行通信連接;③在App主界面,點擊“開始”按鈕,開始進行光譜檢測(此時測量無需在黑暗環境下);④當檢測完成后,坐標系相應位置繪制出相對光譜圖。此時,檢測完成。
如圖6所示,測量了60 W的白熾燈燈管的相對光譜分布圖,其中橫坐標是380 nm~780 nm的波長,縱坐標為相對光譜值,坐標系中的垂直藍線可以進行左右滑動,并顯示出當前的波長和相對光譜值。由此圖可表明與標準燈光譜基本一致,數據可靠。

圖6 白熾燈相對光譜分布圖
如圖7給出了60 W白熾燈的CIE1931色品圖。從圖中可以看出本文提供的系統和算法能較好完成光譜數據的測量和分析工作。
如圖8所示,通過Android下的ListView控件展示了使用60 W的白熾燈的相對光譜值計算得到的光源色度學參數,包括CIE1931(x,y)色品坐標、顯色指數CRI,TM-30-18 Rf和Rg等。

圖7 白熾燈CIE1931坐標圖

圖8 60 W白熾燈的光源色度學參數
所提出的可見光光譜分析系統,結構簡單,使用方便,經過測試后表明系統能夠正確檢測出待測光源光譜特性,分析計算得到色度學參數并繪制相應特征圖。系統各部分穩定協調工作,操作簡單,可以運用于可見光的光譜檢測和分析,提高可見光光源質量。