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