標(biāo)題: 教你使用一個單片機(jī)IO口控制RGB彩燈,單總線LED燈使用教程 [打印本頁]

作者: lzy1999    時間: 2019-5-22 16:57
標(biāo)題: 教你使用一個單片機(jī)IO口控制RGB彩燈,單總線LED燈使用教程
相信大家學(xué)習(xí)單片機(jī)的第一課就是點亮第一盞LED燈了吧,初次點亮LED的時候的心情肯定是很激動的,可以操控眼前這個小小的芯片完成自己編寫的指令,頓時感覺到很奇妙。初次了解之后便會激發(fā)我們的探索精神,當(dāng)學(xué)習(xí)了PWM之后,控制RGB彩燈隨意調(diào)出千變?nèi)f化的顏色肯定不再是難事,用在各種項目上,RGB燈會讓作品更加鮮艷動人。在這美麗的背后,其實隱藏了很多的科學(xué)道理,RGB燈的顏色能千變?nèi)f化的原因是因為其內(nèi)部集成了3個獨立的3原色燈珠,然后使用PWM波控制每個燈珠處在不同的亮度,便可以得到不同的色彩。但是一個RGB燈可能會占用多個端口,想控制很多個RGB燈便是有些難度,好在隨著集成工藝的發(fā)展,這一切不再是問題,如今的工藝促使了一種新型燈珠的出現(xiàn),那就是單總線LED。
簡單點來說就是這種類型的燈珠內(nèi)置了一個驅(qū)動電路,它控制著燈珠發(fā)出的顏色,并且有一個數(shù)據(jù)輸入口,意味著我們可以往在這個燈珠里面輸入數(shù)據(jù),然后燈珠內(nèi)部的電路就會驅(qū)動的燈珠發(fā)出我們想要的顏色。這個電路呢還有一個數(shù)據(jù)的輸出口,也就是說它可以將接受到的數(shù)據(jù)再次發(fā)送出去,送給下一個燈珠的輸入,所以這使得所有的燈珠都可以連在一起,只需要使用一個IO口控制,這就相比傳統(tǒng)的RGB燈節(jié)省了很多的端口。
這種類型的燈珠主要的核心就在它里面集成的那樣一個驅(qū)動電路,這種類型的驅(qū)動電路有很多種,例如常見的WS2811,2812,SK6812等等,所以用其制作完成的燈珠一般都使用驅(qū)動電路的名字來命名。對于燈珠的大小型號呢,則有很多種類,例如5050,3535以及2020等封裝,大家搜索的時候,搜索驅(qū)動電路的型號加上封裝型號就可以找到想要的單總線LED了。下面是WS2812采用5050封裝的圖片。

本文會就WS2812這款最常用的驅(qū)動芯片來講解其的控制方法以及在最后我會寫一些控制這類單總線LED的方法。



由于是單總線通訊,自然沒有時鐘信號線,所以通訊的時序變得非常重要,我找到一份WS2812的數(shù)據(jù)手冊,查看到了其中提到的輸入數(shù)據(jù)時序圖。


可以看到,2812芯片對著時序有著較為嚴(yán)格的需要,所以對于0碼和1碼,我們需要嚴(yán)格控制單片機(jī)延時的時間。并且這款芯片的時序大概都在納秒級的延時,所以對于單片機(jī)的要求還是比較高的,我采用的是增強(qiáng)型的51單片機(jī),速度上足夠完成納秒級的延時。


下面看到的數(shù)據(jù)的輸入方法,可以看到每個數(shù)據(jù)包都是24bit長,也就是3個字節(jié),發(fā)送完第一個24bit數(shù)據(jù)包之后就是接著發(fā)送第二個,可以看到在D2線上,第一個24bit數(shù)據(jù)包自動被忽略了,這是由于WS2812的轉(zhuǎn)發(fā)機(jī)制,在其接受到第一個完整的24bit數(shù)據(jù)包之后,再接受到的數(shù)據(jù)包他會自動將其發(fā)送給下一個燈珠,這就是為什么可以一根線控制所有LED燈的秘密。并且WS2812芯片還有鎖存的功能,也就是說送一次數(shù)據(jù)后,在下一回改變顏色之前都不需要再送數(shù)據(jù)了,內(nèi)部的鎖存電路會自動記住當(dāng)前的顏色值,并控制燈珠一直保持著色彩。


對于每一個24bit數(shù)據(jù)包,其格式如下:每一個字節(jié)都表示著顏色的亮度,從高位到低位分別是綠色(G),紅色(R),藍(lán)色(B),控制這三個顏色的亮度,我們就可以得到千變?nèi)f化的色彩。



了解到了數(shù)據(jù)包的格式,數(shù)據(jù)手冊里面還給了一張應(yīng)用電路的圖片,很好的說明了這種單總線LED的連接方法。


看完了數(shù)據(jù)手冊,下面就是對單片機(jī)編程,使其可以輸出對應(yīng)的波形了!



首先是對發(fā)送0碼和1碼的程序編寫,由于需要用到納秒級的延時,我使用空語句來進(jìn)行軟件延時,下面是發(fā)送0碼和1碼的代碼截圖。我這里是使用的STC15系列單片機(jī),使用內(nèi)部時鐘11.0592MHZ,如果有使用相同單片機(jī)的朋友請直接參考我的代碼,如果你的單片機(jī)類型不一樣或者時鐘頻率不一樣,最好使用示波器或者邏輯分析儀來得到精確的延時。


完成了發(fā)送0碼和1碼之后,接著就是發(fā)送一個字節(jié)了,核心思路就是每次判斷字節(jié)高位的值來決定發(fā)送0還是1


經(jīng)過簡單的編程,所有代碼就完成了,簡單的寫了一個程序,讓前三個燈亮起,呈紅色:


其實WS2812的編程較為容易,下面就來說一些我的改進(jìn)地方。
我編寫了一個使用串口控制RGB燈的程序,就是我可以在串口上發(fā)送數(shù)據(jù),實時的控制每個LED燈的顏色,這樣會方便后期一些動畫效果的控制。我定義了一個數(shù)據(jù)格式,一個數(shù)據(jù)包含有5個字節(jié),分別是幀頭,LED燈的編號,紅色(R)亮度值,綠色(G)亮度值以及藍(lán)色(B)亮度值。例如我想要控制第五個燈變成最亮的白色,我就發(fā)送
FFH 05H FFH FFH FFH 就可以了,下面是使用這個程序調(diào)出來的顏色:


其思路就是當(dāng)串口收到幀頭之后,就開始讀取燈的編號以及各個顏色的亮度值,然后再發(fā)送給LED燈珠即可。

這些就是單總線LED燈珠的使用方法了,其實編寫程序較為簡單,主要難點就是大家的時序一定要準(zhǔn)確,這樣才可以確保燈珠正常的點亮。




作者: KingTheWorld    時間: 2019-9-15 15:50
多謝樓主,學(xué)習(xí)了
作者: 一寸灰    時間: 2019-9-24 20:42
很有用
作者: shenyuqiu    時間: 2019-9-25 09:00
非常實用,請問有后面控制多個燈的原代碼嗎?
作者: a8619300    時間: 2019-11-11 19:56
樓主,有資料程序可以下載嗎
作者: 紫色的云    時間: 2019-11-12 09:19
謝謝樓主的講解,學(xué)習(xí)了
作者: szzxl10    時間: 2019-11-12 18:30
謝謝樓主的講解
作者: Ty78619120    時間: 2020-4-1 16:40
51黑,有你更精彩
作者: 一個人破    時間: 2020-5-12 10:19
很方便,感謝樓主
作者: acne    時間: 2020-5-12 22:49
很有用
作者: jjwangxu2008    時間: 2020-9-22 16:21

謝謝樓主的講解,學(xué)習(xí)了
作者: zyb572168    時間: 2022-12-14 15:46
剛好要用到這種單總線的燈,學(xué)習(xí)了
作者: 354724834    時間: 2024-2-23 20:10
厲害
作者: wkman    時間: 2024-3-8 08:42
初學(xué)詳解系列   d^_^b




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1