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