聚豐項(xiàng)目 > 【作品模板】基于RT-Thread的時(shí)光空間立方
基于麻雀一號(hào)核心板 RW052,即博通的 WIFI 藍(lán)牙一體的芯片 BK7252,我制作了一款桌面小工具:時(shí)光空間立方。 它可以實(shí)現(xiàn): 1、微信小程序可以通過藍(lán)牙配置小立方的參數(shù); 2、晃動(dòng)立方可以觸發(fā)亮屏、亮燈; 3、立方可以通過藍(lán)牙配網(wǎng),連接 WIFI; 4、屏幕上可以顯示:日期時(shí)間、實(shí)時(shí)天氣、名言警句,或者是模仿?lián)u 骰子產(chǎn)生隨機(jī)點(diǎn)數(shù); 5、立方內(nèi)部有呼吸燈和彩虹燈的效果。作為一款桌面小工具,它既可以提示必要的信息,如時(shí)間、天氣,又可 以趣味互動(dòng),如搖骰子、隨機(jī)顯示名言警句,集信息提示與娛樂一體。 外觀則是完美的正方體,每個(gè)面在未啟動(dòng)時(shí)就像一面鏡子,啟動(dòng)后則可 以看到一個(gè)無(wú)限五彩斑斕的內(nèi)部空間。放置于辦公桌面,既是一款優(yōu)雅的裝飾品,又是一款具有實(shí)用價(jià)值的小巧工具。
從前有座_山
分享從前有座_山
團(tuán)隊(duì)成員
從前有座_山 服務(wù)小達(dá)人
RT-Thread使用情況概述:
整個(gè)方案涉及的技術(shù)棧有:硬件選型,PCB 設(shè)計(jì),RT-Thread 程序, 3D 建模打印,服務(wù)器端程序,API 接口對(duì)接,微信小程序編寫等等。通過這個(gè)作品,鍛煉了我實(shí)現(xiàn)產(chǎn)品的能力,讓我對(duì)產(chǎn)品設(shè)計(jì)的不同方面 都加深了理解。
內(nèi)核部分:使用了線程、信號(hào)量、互斥量、定時(shí)器
組件部分:使用了虛擬文件系統(tǒng)、FinSH、netdev 網(wǎng)卡
軟件包:
fal/EasyFlash/littlefs/netutils/cJSON/mbedtls/rt_ota 等
設(shè)備驅(qū)動(dòng):
GPIO/SPI/RTC/WLAN/BLE 等
核心模塊RW052是官方的一個(gè)基于 BK7252 芯片的WIFI 藍(lán)牙一體的 模組,引出了非常多的引腳,使用起來(lái)非常方便,可以直接通過 USB 供電。驅(qū)動(dòng)屏幕使用了模擬 SPI,LCD 是使用了麻雀一號(hào)上屏幕廠家的同系列不 同尺寸的屏幕。WS2812 則是使用了硬件 SPI,通過 MOSI 按照時(shí)序進(jìn)行輸出規(guī)定協(xié) 議的波形,從而驅(qū)動(dòng) WS2812。
軟件框架:
軟件方案自我感覺比較簡(jiǎn)單,中間使用了部分信號(hào)量和互斥量保證線程 同步,整體是按照不同功能模塊進(jìn)行了文件拆分,方便功能劃分和解耦合。
程序運(yùn)行邏輯圖:
我這個(gè)作品里軟件模塊劃分的比較清晰,各個(gè)模塊均獨(dú)立為一個(gè)單獨(dú)文 件,比較好理解。屏幕、藍(lán)牙、網(wǎng)絡(luò)、GPIO 基本上都是遵循原有的代碼邏 輯進(jìn)行編寫,邏輯比較清晰。所以這里我重點(diǎn)講一下之前驅(qū)動(dòng) WS2812 失 敗的原因與解決方案。
之前沒有正確驅(qū)動(dòng) WS2812 的原因,比較多樣化,比如自以為是的斷 定通過 GPIO+延時(shí)函數(shù)可以實(shí)現(xiàn) WS2812 的驅(qū)動(dòng)邏輯,后來(lái)經(jīng)過示波器 證明時(shí)序完全不在一個(gè)量級(jí)上;后來(lái)使用了 I2C,發(fā)現(xiàn)時(shí)序非常不好控制, 也作罷;最后使用了 SPI,但是也是經(jīng)歷了由模擬 SPI 到硬件 SPI 的過程。軟件 SPI 理論上跟模擬 GPIO 沒區(qū)別,達(dá)不到效果,使用了硬件 SPI 后發(fā) 現(xiàn)時(shí)序有時(shí)候會(huì)亂掉。最終使用硬件 SPI+DMA 方式,才得到了最終效果。
至于為什么使用 SPI,是從 WS2812 驅(qū)動(dòng)時(shí)序來(lái)反推的。
WS2812 的時(shí)序?qū)儆趩慰偩€式的時(shí)序,每一個(gè) bit 都是由一個(gè)高電平+ 低電平實(shí)現(xiàn),一個(gè)周期要在 1.25 微秒左右。當(dāng)高電平在 400 納秒,低電 平在 800 納秒左右,則該 bit 為 0,反之為 1。
當(dāng) SPI 時(shí)鐘設(shè)置在一個(gè)比較合適的頻率時(shí),一個(gè)字節(jié)周期剛剛好可以在 1.25 微秒左右,比如 6-8MHz。這樣,只需要用一個(gè)字節(jié)表示 WS2812 一個(gè) bit 即可。
當(dāng)然,一切都是可以變通的,我最開始的程序是采用了一個(gè)字節(jié)表示一 個(gè) bit 的方式,后來(lái)發(fā)現(xiàn)這種方式不是很穩(wěn)定,則改成了一個(gè)字節(jié)表示 2bit。這樣既節(jié)省了內(nèi)存開支,也比之前的時(shí)序穩(wěn)定性略好。經(jīng)過實(shí)際測(cè)試,雖然 仍有瑕疵,但較之前版本效果更好一些,所以最后我選擇了這個(gè)方案。
具體的實(shí)現(xiàn)代碼在 ws2812.c 文件中。
演示視頻:
代碼地址:
GitHubhttps://github.com/illusionlee/lightcube
代碼使用了 MIT 協(xié)議,相對(duì)較為開放。因?yàn)槲业囊恍┐a仍然會(huì)有一些 BUG,所以非常期待更多人可以參與進(jìn)來(lái),issue、pr,開源精神亦在于此 吧!共同完善,爭(zhēng)取每個(gè)人都可以擁有屬于自己的時(shí)光空間立方,工作閑暇 之余,拿起來(lái)晃一晃,能夠體驗(yàn)到一點(diǎn)點(diǎn)樂趣。
(13.70 MB)下載