文淵 汪玉坤 張保平
摘 要:現(xiàn)如今各個(gè)領(lǐng)域都開(kāi)始用燈光吸引著別人的眼球。帶有燈光渲染的產(chǎn)品更容易吸引客戶的目光,自適應(yīng)主題氛圍燈可以結(jié)合屏幕上的主色調(diào)來(lái)調(diào)整氛圍燈的顏色,該氛圍燈的設(shè)計(jì)是C#上位機(jī)實(shí)時(shí)采集屏幕內(nèi)所有像素點(diǎn)的RGB值,經(jīng)過(guò)主色調(diào)提取算法得到主色調(diào)的數(shù)值,通過(guò)串口與RGB燈的STM32微處理器進(jìn)行數(shù)據(jù)傳輸,控制RGB燈的顏色變化,達(dá)到自適應(yīng)主題的氛圍燈效果。
關(guān)鍵詞:氛圍燈;主色調(diào);串口通信
中圖分類號(hào):U463.65 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):2095-2945(2018)11-0033-03
Abstract: Now all fields are beginning to attract the attention of others with lights. Products with lighting rendering are more likely to attract customers' attention. The adaptive themed atmosphere lamp can be combined with the main tone on the screen to adjust the color of the atmosphere lamp, which is designed by capturing the RGB value of all pixels on the screen in real time by the C# host computer, getting the value of the main tone through the main tone extraction algorithm, through the serial port and the STM32 microprocessor of the RGB lamp for data transmission, so as to control the color change of the RGB lamp and achieve the effect of adaptive theme atmosphere lamp.
Keywords: atmosphere lamp; main tone; serial communication
1 概述
隨著LED技術(shù)的不斷發(fā)展,燈光的渲染已被各個(gè)電子廠商加入到自己的產(chǎn)品中,但是真正結(jié)合顯示器色調(diào)的氛圍燈幾乎處于空白,所以氛圍燈的設(shè)計(jì)方法具有一定的應(yīng)運(yùn)前景,無(wú)論是商業(yè)使用的大型led廣告牌還是家中的電視、投影、顯示器都可以通過(guò)自適應(yīng)屏幕主題氛圍燈的設(shè)計(jì)增強(qiáng)商業(yè)廣告和家庭顯示器的顯示效果,并且為了提供給用戶更好視覺(jué)體驗(yàn)在設(shè)計(jì)中提出了一套醒目主色調(diào)的提取算法。最后本文從上位機(jī)的顏色提取,對(duì)RGB三色燈驅(qū)動(dòng)和控制,以及上位機(jī)與STM32微處理器的串口通信幾大方面做論述。
2 總設(shè)計(jì)方案
該方案由取色上位機(jī)的設(shè)計(jì)和RGB燈的控制系統(tǒng)兩部分組成。取色上位機(jī)是基于C#語(yǔ)言在Vidual Studio 2016做開(kāi)發(fā)。RGB燈的控制系統(tǒng)包括WS2118驅(qū)動(dòng)芯片和STM32f103c8t6微處理器。
總設(shè)計(jì)流程是PC端上位機(jī)進(jìn)行顏色提取與主色調(diào)分析,STM32做下位機(jī)通過(guò)串口通信的方式接收數(shù)據(jù)并對(duì)RGB三色燈帶進(jìn)行控制。
3 各個(gè)功能模塊的設(shè)計(jì)與實(shí)現(xiàn)
3.1 上位機(jī)的設(shè)計(jì)
該上位機(jī)是在visual studio 2016的開(kāi)發(fā)環(huán)境下進(jìn)行設(shè)計(jì)。visual studio 2016是微軟公司2016年發(fā)布的一款全新的集成環(huán)境包軟件,適用于多種語(yǔ)言。其中NETFramework.的 WindowsForms模塊可以用更有效的開(kāi)發(fā)桌面應(yīng)用。visual studio 2016可以在編寫(xiě)代碼時(shí)提供實(shí)時(shí)指導(dǎo)隨著鍵入描述API,并使用自動(dòng)完成功能以提高速度和精確度。燈泡圖標(biāo)有助于發(fā)現(xiàn)并修復(fù)常見(jiàn)編碼問(wèn)題,在許多情況下,可以一邊鍵入代碼,一邊“實(shí)時(shí)”地獲取幫助,并在編輯器內(nèi)直接快速執(zhí)行代碼操作。
3.1.1 控件設(shè)計(jì)
控件ComboBox1
ComboBox是編輯框(Edit)和列表框(List)的組合。它提供了多種輸入方式,可根據(jù)具體需要選擇使用純列表選擇方式、純文本編輯輸入方式或者編輯輸入和列表選擇混合方式。
在此設(shè)計(jì)中用于串口和波特率選擇的下拉框設(shè)計(jì),在上位機(jī)于下位機(jī)連接時(shí)點(diǎn)擊串口框和波特率框都會(huì)彈出下拉菜單選擇當(dāng)前串口和波特率。其中Items屬性用于添加下拉列表里的元素。Text屬性用于顯示初始狀態(tài)下該控件框的文本。
控件PictureBox
PictureBox控件是用來(lái)呈現(xiàn)圖像,圖像資源可以來(lái)自文件,也可以是存在內(nèi)存中的位圖對(duì)象??梢燥@示本地圖像文件或來(lái)自網(wǎng)絡(luò)的圖片,也可以來(lái)自項(xiàng)目文件中的圖像。
在此設(shè)計(jì)中用于顯示經(jīng)過(guò)主色調(diào)提取算法后的顏色,BackColor屬性用于獲取或設(shè)置該控件背景顏色,因此將最終的RGB值賦予該屬性就能實(shí)現(xiàn)其功能。
控件SerialPort
SerialPort控件用于控制串行端口文件資源。此類提供同步I/O和事件驅(qū)動(dòng)的I/O、對(duì)管腳和中斷狀態(tài)的訪問(wèn)以及對(duì)串行驅(qū)動(dòng)程序?qū)傩缘脑L問(wèn)。另外,此類的功能可以包裝在內(nèi)部Stream對(duì)象中,可通過(guò)BaseStream屬性訪問(wèn),并且可以傳遞給包裝或使用流的類。在此設(shè)計(jì)中用于上位機(jī)和STM32單片機(jī)的串口通訊。BaudRate屬性用來(lái)設(shè)置串行波特率,BytesToWrite屬性用于設(shè)置發(fā)送緩沖區(qū)的字節(jié)數(shù),RtseEnable屬性設(shè)置為False則在通信過(guò)程中不會(huì)請(qǐng)求發(fā)送(RTS)行。
3.1.2 屏幕圖像的捕獲
(1)首先要?jiǎng)?chuàng)建一個(gè)和當(dāng)前屏幕大小相同的Bitmap對(duì)象, 要實(shí)現(xiàn)此操作,首先就要現(xiàn)獲得當(dāng)前顯示器的DC,然后根據(jù)此DC來(lái)創(chuàng)建Graphic對(duì)象,再由此Graphic對(duì)象產(chǎn)生此位圖對(duì)象。(2)根據(jù)此位圖創(chuàng)建一個(gè)和其一樣的Graphic對(duì)象。(3)捕獲當(dāng)前屏幕: 我們是通過(guò)當(dāng)前屏幕保存到創(chuàng)建的位圖對(duì)象中來(lái)實(shí)現(xiàn)的,具體的實(shí)現(xiàn)過(guò)程是通過(guò)Windows的一個(gè)API函數(shù)——Bitblt。
3.1.3 RGB值獲取方法
C#數(shù)字圖像處理有3種典型方法:提取像素法、內(nèi)存法、指針?lè)?。指針?lè)ㄖ苯討?yīng)用指針來(lái)對(duì)圖像進(jìn)行處理,速度最快。故在此軟件設(shè)計(jì)中采用指針?lè)ǐ@取圖像中的RGB值。默認(rèn)情況下,C# 不支持指針運(yùn)算。不過(guò),通過(guò)使用 unsafe 關(guān)鍵字,可以定義可使用指針的不安全上下文。
//創(chuàng)建圖像
Bitmap image = new Bitmap( "c://images//image.gif" );
//獲取圖像的BitmapData對(duì)像
BitmapData data = image.LockBits( new Recta4ngle( 0 , 0 , image.Width , image.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb );
//循環(huán)處理
unsafe
{ byte* ptr = ( byte* )( data.Scan0 );
for( int i = 0 ; i < data.Height ; i ++ )
{ for( int j = 0 ; j < data.Width ; j ++ )
{ ptr += 3; }
ptr += data.Stride - data.Width * 3;
} }
3.2 主色調(diào)提取算法
找出一張圖片中的主色調(diào),這里的主色調(diào)并不是指顏色最多的,而是指最一幅圖像中最“醒目”的顏色。(1)計(jì)算整個(gè)圖片的色調(diào)的平均值 (avg_hue)。(2)遍歷每個(gè)像素,計(jì)算該像素的色調(diào)值與avg_hue 的色差(即將二者相減后取絕對(duì)值),如果該色差大于一個(gè)閾值,則將該像素加入到“醒目像素”的數(shù)組。(3)計(jì)算整個(gè)“醒目像素列表”的顏色均值,得到的結(jié)果即為該圖片的主色調(diào)。
//色差大于閾值的顏色值
var rgbs = new List
for (int h = 0; h < bitmap.Height; h++)
{ for (int w = 0; w < bitmap.Width; w++)
{ var color = bitmap.GetPixel(w, h);
var hue = color.GetHue();
//如果色差大于閾值,則加入列表
if (Math.Abs(hue - avg_hue) > threshold)
{ rgbs.Add(color);
} } }
if (rgbs.Count == 0)
return Color.Black;
//計(jì)算列表中的顏色均值,結(jié)果即為該圖片的主色調(diào)
int sum_r = 0, sum_g = 0, sum_b = 0;
foreach (var rgb in rgbs)
{ sum_r += rgb.R;
sum_g += rgb.G;
sum_b += rgb.B;
} return Color.FromArgb(sum_r / rgbs.Count,
sum_g / rgbs.Count,
sum_b / rgbs.Count)
}
3.3 RGB燈帶驅(qū)動(dòng)控制
WS2811芯片是三通道LED驅(qū)動(dòng)控制專用電路,芯片內(nèi)部包含了智能數(shù)字接口數(shù)據(jù)鎖存信號(hào)整形放大驅(qū)動(dòng)電路,還包含有高精度的內(nèi)部振蕩器和15V高壓可編程定電流輸出驅(qū)動(dòng)器。
芯片在上電復(fù)位以后,DIN端接受從控制器傳輸過(guò)來(lái)的數(shù)據(jù),首先送過(guò)來(lái)的24bit數(shù)據(jù)被第一個(gè)芯片提取后,送到芯片數(shù)據(jù)鎖存器,剩余數(shù)據(jù)經(jīng)過(guò)內(nèi)部整形處理電路整形放大后通過(guò)DO端口開(kāi)始轉(zhuǎn)發(fā)輸出給下一個(gè)級(jí)聯(lián)的芯片,每經(jīng)過(guò)一個(gè)芯片的傳輸,信號(hào)減少24bit。
3.4 串口通信設(shè)計(jì)
該氛圍燈設(shè)計(jì)中,采用串口通信實(shí)現(xiàn)對(duì)RBB燈的控制,PC端軟件作為上位機(jī)、單片機(jī)作為下位機(jī)組成的數(shù)據(jù)通信系統(tǒng)。
在上位機(jī)軟件設(shè)計(jì)中使用System.IO.Port.SerialPort類實(shí)現(xiàn)串口通信System.IO.Port.SerialPort是.NET Framework提供的操作串行端口的類,里面提供了一些方法、屬性和和事件供開(kāi)發(fā)者調(diào)用操作串口。設(shè)計(jì)過(guò)程中首先接調(diào)用SerialPort的靜態(tài)方法GetPortNames()獲取當(dāng)前計(jì)算機(jī)的串行端口名稱數(shù)組再根據(jù)串口名稱,初始化SerialPort對(duì)象,設(shè)置參數(shù),調(diào)用Open()方法打開(kāi)串口,調(diào)用Write()方法發(fā)送數(shù)據(jù)。最后注冊(cè)接收數(shù)據(jù)的監(jiān)聽(tīng),獲取數(shù)據(jù)(或者另起線程循環(huán)讀取接收數(shù)據(jù))。
在硬件搭建設(shè)計(jì)中采用USB轉(zhuǎn)TTL串口通訊模塊,電腦用的一般是RS232串口,電子設(shè)備一般用TTL串口。兩者只是高低電平的電壓不同。TTL表示電壓變化范圍為0-5v。所以運(yùn)用此模塊將上位機(jī)的控制數(shù)據(jù)發(fā)送給單片機(jī)下位機(jī)達(dá)到對(duì)氛圍燈的實(shí)時(shí)調(diào)色控制。
4 結(jié)束語(yǔ)
本設(shè)計(jì)中上位機(jī)采用的指針?lè)ǐ@取圖像中顏色,經(jīng)過(guò)測(cè)試速度達(dá)到要求,可實(shí)現(xiàn)實(shí)時(shí)取色的效果,主色調(diào)提取算法也提取最醒目的顏色并能通過(guò)RGB燈顯示。該設(shè)計(jì)緊跟人們未來(lái)的需求趨勢(shì),在一件產(chǎn)品功能完善的同時(shí)追求更高的使用體驗(yàn),具有一定應(yīng)用意義。
參考文獻(xiàn):
[1]曹陽(yáng).基于觸摸按鍵和PWM驅(qū)動(dòng)配色的汽車氛圍燈[J].電子技術(shù),2015(12):1-3.
[2]王敏,李斌橋,徐江濤.基于色溫估計(jì)的自動(dòng)白平衡算法研究[J].光電子·激光,2011(12):1872-1875.
[3]周航慈.單片機(jī)程序設(shè)計(jì)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,2003.
[4]陳小龍,孫遜之,董偉,等.一種多模式的氛圍燈控制模塊[J].汽車零部件,2017(02):15-19.
[5]王向陽(yáng).胡峰麗,楊紅穎.一種基于區(qū)域絳合特征的彩色I(xiàn)圭I像檢索方法[J].小型微型計(jì)算機(jī)系統(tǒng),2007,28(2):351-355.
[6]劉軍,張洋,嚴(yán)漢宇.原子教你玩STM32(庫(kù)函數(shù)版)[M].北京:北京航空航天大學(xué)出版社,2013.