一、應用背景
魔方,又叫魯比克方塊(Rubik’s Cube),是匈牙利布達佩斯建筑學院厄爾諾·魯比克教授發(fā)明的機械益智玩具,由若干個積木塊組成,積木塊之間通過卡榫契合,能做到“組”的相對位置改變,從而構(gòu)成各種形狀的花紋,基本的玩法就是通過旋轉(zhuǎn),打散各面色塊后用最快速度還原。魔方的設計初衷是用來認識空間組成和結(jié)構(gòu)的教具,后來成為風靡全球的玩具,形狀從原始的正方體發(fā)展出球型、鉆石型、粽子型等異形,階數(shù)從最早的三階擴充到三十階以上。
魔方競賽也成為國際比賽項目,通過世界魔方協(xié)會比賽的認證成績甚至可以記載入世界紀錄當中。
傳統(tǒng)魔方采用物理結(jié)構(gòu)契合,高階魔方使用時旋轉(zhuǎn)次數(shù)多,要求速度快、精度高,很容易磨損導致性能下降無法使用(我自己就有一天玩壞一個高階魔方的經(jīng)歷)。基于此,試圖將魔方功能“電子”化,減少機械磨損。
二、實現(xiàn)功能
本設計分為兩個部分:電子魔方和GUI。
電子魔方基于RT-Thread開發(fā),使用N32G457驅(qū)動WS2812板,通過點亮WS2812燈珠,實現(xiàn)魔方轉(zhuǎn)動效果。本次開發(fā)所用WS2812板為8*8的板卡,共用了5塊,搭成正方體形狀(留出底面),共計320顆燈珠,用于模擬一個8階魔方。
GUI為純軟件開發(fā),在電腦上運行,可以通過鼠標或鍵盤操作,實現(xiàn)魔方的轉(zhuǎn)動。為配合電子魔方,設計了界面,8階魔方共有24個方向可轉(zhuǎn)動(反向可以通過旋轉(zhuǎn)3次實現(xiàn)),設計24個按鈕,由于高階魔方還原難度較高,因此還預留了“一鍵還原”功能。
圖四 GUI
三、開發(fā)板和RT-Thread使用情況概述
使用N32G45XVL-STB開發(fā)板,該開發(fā)板MCU芯片型號為國民技術(shù)的N32G457VEL7,LQFP100管腳封裝,板卡把所有GPIO都引出連接到J1,J2和J12插針上,非常便于開發(fā)和調(diào)試,但在本項目中,僅使用了PA7(SPI0的MOSI接口)。
圖五 N32G45XVL-STB開發(fā)板
安裝的RT-Thread Studio,版本: 2.1.5(構(gòu)建ID: 202201191915),其上已經(jīng)自帶了RT-Thread模塊,直接從SDK中拖取了Nations的n32g45xvl-stb板,并使能了其SPI功能,所用SPI為SPI0。
用于呈現(xiàn)的WS2812,采用購買的88模塊成品,自己拼裝成立方體,考慮到底面沒有人會去看,因此直接空出來。
WS2812的實現(xiàn)原理比較簡單,就是通過輸入特定長度的高低電平,驅(qū)動若干顆燈珠,每個顏色比特傳輸數(shù)據(jù)需要1.25us,可以略微超頻(甚至有的datasheet中表示可以超頻600ns,實測做不到的),在本項目中,采用的是SPI驅(qū)動,將其設置為1.2us/顏色比特使用,分別通過SPI傳輸ffc0、f000作為其0、1碼表示。
圖六 WS2812的datasheet
四、硬件框架
其硬件結(jié)構(gòu)非常簡單,采用5塊88的WS2812燈板串接作為輸出,將其搭建成立體形狀,串接各面的板和板之間串接順序為頂、前、右、后、左,在平面展開圖中,每塊燈板上的燈珠的順序為從左到右,從上到下依次遞增,共320顆,在最初設計和調(diào)試時,使用了外部供電,后省略,直接由板上的5V從USB接口取電。大致框架如下:
圖七 硬件框架示意圖
五、軟件框架
由于上位機和下位機分別開發(fā),上位機所用語言為python,基于windows環(huán)境運行(理論上移植linux也很簡單),下位機使用c開發(fā),在N32開發(fā)板上運行,其操作/執(zhí)行流程如下:
圖八 軟件業(yè)務流程
六、軟件模塊說明
1、定義
由于本項目使用pin資源較少,因此沒有修改drv_gpio.c文件中的定義
define N32F10X_PIN_NUMBERS 64
而是直接在代碼中定義了所用的pin腳和相關(guān)資源
define SPI1_BUS_NAME “spi1”
define SPI1__DEVICE_NAME “spi10”
define SPI1_NCS_PIN 29 //PA4
如之前所述,魔方最重要的就是色塊的變化,各個時期和地方的版本雖然有所區(qū)別,但主流采用紅、黃、藍、綠、白、橙六種顏色,目前主要有兩種配色:世界版(WCA大賽所用配色)和日版(Rubik教授最初研發(fā)時的配色)。
圖九 顏色要求
對于每個面具體的顏色,采用的是原色大辭典中標準色號:
圖十 標準色表
定義為:
Yellow:#ffff00
Green:#008000
Orange:#ffa500
Blue:#0000ff
Red:#ff0000
White:#ffffff
WS2812點燈采用24位色,與標準RGB不同,為GRB,因此初始六個顏色如下:
const uint32_t rgbclr[]={0xffff00,0x800000,0xa5ff00,0x0000ff,0x00ff00,0xffffff};
對于點燈采用的六個面(底面雖然不用點燈,但仍然需要存儲顏色),共計384塊,使用uint32_t格式儲存,每個數(shù)只使用其中24位,高8位空閑。
static uint32_t face[384]={0};
在本項目的硬件結(jié)構(gòu)中,只需要輸出320塊(沒有底)顏色,共計15360,考慮到WS2812信號必須間隔低電平間隔,預留200個0,每次輸出的buff:
static uint8_t buff[15560]={0};
2、點燈實現(xiàn)函數(shù)
點燈功能實現(xiàn)主要包括:
1)初始化SPI接口函數(shù)int rt_hw_spi_config(void),并使用INIT_DEVICE_EXPORT(rt_hw_spi_config);將其加入板卡初始化中。在這個函數(shù)中,將SPI0速率初始為13.333MHz。
2)修改單個node的buff函數(shù)void reflush_one_node(uint16_t node),該函數(shù)的功能就是在旋轉(zhuǎn)時,修改對應的buff值,每次修改48個uint8_t,使其輸出與WS2812的單顆燈珠相符合。
3)通過SPI寫WS2812燈函數(shù)void draw_face2(void),實際上是調(diào)用spi.c中的rt_spi_send(spi,buff,sizeof(buff));寫入15560個uint8_t。
3、MSH交互功能
加入預留命令
1MSH_CMD_EXPORT(init_face,init_face); 2MSH_CMD_EXPORT(rotate_x_try,rotate_x_try<0-7>); 3MSH_CMD_EXPORT(rotate_y_try,rotate_y_try<0-7>); 4MSH_CMD_EXPORT(rotate_z_try,rotate_z_try<0-7>);
分別用于調(diào)用初始化方塊函數(shù)void init_face(void)、旋轉(zhuǎn)x軸函數(shù)static void rotate_x_try(int argc, charargv)、旋轉(zhuǎn)y軸函數(shù)static void rotate_y_try(int argc, charargv)、旋轉(zhuǎn)z軸static void rotate_z_try(int argc, char**argv)。
七、其它
作品圖片
視頻效果
https://v.youku.com/v_show/id_XNTg1MzE3NDQxMg==.html?spm=a2hcb.profile.app.5~5!2~5~5!3~5!2~5~5~A
代碼地址
https://gitee.com/tobottest/rubiks-cube
原文標題:【N32G457】基于RT-Thread和N32G457的高階魔方
文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
魔方
+關(guān)注
關(guān)注
0文章
4瀏覽量
6038 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1289瀏覽量
40135 -
MCU芯片
+關(guān)注
關(guān)注
3文章
252瀏覽量
11464
發(fā)布評論請先 登錄
相關(guān)推薦
評論