Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
国民技术_N32G45x
【N32G457】基于RT-Thread和N32G457的高阶魔方
发布于 2022-03-23 14:58:51 浏览:1193
订阅该版
【N32G457】基于RT-Thread和N32G457的高阶魔方 一、应用背景 魔方,又叫鲁比克方块(Rubik's Cube),是匈牙利布达佩斯建筑学院厄尔诺·鲁比克教授发明的机械益智玩具,由若干个积木块组成,积木块之间通过卡榫契合,能做到“组”的相对位置改变,从而构成各种形状的花纹,基本的玩法就是通过旋转,打散各面色块后用最快速度还原。魔方的设计初衷是用来认识空间组成和结构的教具,后来成为风靡全球的玩具,形状从原始的正方体发展出球型、钻石型、粽子型等异形,阶数从最早的三阶扩充到三十阶以上。 ![图片1.png](https://oss-club.rt-thread.org/uploads/20220323/64d0636a102115de298ccf0f30ad65be.png.webp) 图一、形态各异的魔方 魔方竞赛也成为国际比赛项目,通过世界魔方协会比赛的认证成绩甚至可以记载入世界纪录当中。 ![图片2.png](https://oss-club.rt-thread.org/uploads/20220323/504668f66733fd5a03012f12477a62d5.png.webp) 图二、世界魔方协会(WCA) 传统魔方采用物理结构契合,高阶魔方使用时旋转次数多,要求速度快、精度高,很容易磨损导致性能下降无法使用(我自己就有一天玩坏一个高阶魔方的经历)。基于此,试图将魔方功能“电子”化,减少机械磨损。 二、实现功能 本设计分为两个部分:电子魔方和GUI。 电子魔方基于RT-Thread开发,使用N32G457驱动WS2812板,通过点亮WS2812灯珠,实现魔方转动效果。本次开发所用WS2812板为8*8的板卡,共用了5块,搭成正方体形状(留出底面),共计320颗灯珠,用于模拟一个8阶魔方。 ![图片3.png](https://oss-club.rt-thread.org/uploads/20220323/5f8f1be8171d30c31e686edbdf326f2d.png.webp) 图三、机械版8阶魔方和电子版8阶魔方 GUI为纯软件开发,在电脑上运行,可以通过鼠标或键盘操作,实现魔方的转动。为配合电子魔方,设计了界面,8阶魔方共有24个方向可转动(反向可以通过旋转3次实现),设计24个按钮,由于高阶魔方还原难度较高,因此还预留了“一键还原”功能。 ![图片4.png](https://oss-club.rt-thread.org/uploads/20220323/3f9e6cd734f31c25d7f809a37ba6f468.png) 图四、GUI 三、开发板和RT-Thread使用情况概述 使用N32G45XVL-STB开发板,该开发板MCU芯片型号为国民技术的N32G457VEL7,LQFP100管脚封装,板卡把所有GPIO都引出连接到J1,J2和J12插针上,非常便于开发和调试,但在本项目中,仅使用了PA7(SPI0的MOSI接口)。 ![图片5.png](https://oss-club.rt-thread.org/uploads/20220323/3d50b83a9f211da45088b7f275f03af6.png.webp) 图五、N32G45XVL-STB开发板 安装的RT-Thread Studio,版本: 2.1.5(构建ID: 202201191915),其上已经自带了RT-Thread模块,直接从SDK中拖取了Nations的n32g45xvl-stb板,并使能了其SPI功能,所用SPI为SPI0。 用于呈现的WS2812,采用购买的8*8模块成品,自己拼装成立方体,考虑到底面没有人会去看,因此直接空出来。 WS2812的实现原理比较简单,就是通过输入特定长度的高低电平,驱动若干颗灯珠,每个颜色比特传输数据需要1.25us,可以略微超频(甚至有的datasheet中表示可以超频600ns,实测做不到的),在本项目中,采用的是SPI驱动,将其设置为1.2us/颜色比特使用,分别通过SPI传输ffc0、f000作为其0、1码表示。 ![图片6.png](https://oss-club.rt-thread.org/uploads/20220323/b4df3a7f8511665d9aeca5f3f3a6cedd.png.webp) 图六、WS2812的datasheet 四、硬件框架 其硬件结构非常简单,采用5块8*8的WS2812灯板串接作为输出,将其搭建成立体形状,串接各面的板和板之间串接顺序为顶、前、右、后、左,在平面展开图中,每块灯板上的灯珠的顺序为从左到右,从上到下依次递增,共320颗,在最初设计和调试时,使用了外部供电,后省略,直接由板上的5V从USB接口取电。大致框架如下: ![图片7.png](https://oss-club.rt-thread.org/uploads/20220323/d5ef9ef6330ee9c8ef91821a711bb23f.png.webp) 图七、硬件框架示意图 五、软件框架 由于上位机和下位机分别开发,上位机所用语言为python,基于windows环境运行(理论上移植linux也很简单),下位机使用c开发,在N32开发板上运行,其操作/执行流程如下: ![图片8.png](https://oss-club.rt-thread.org/uploads/20220323/c50ec26f0f8036123480530cb27c0510.png.webp) 图八、软件业务流程 六、软件模块说明 1、定义 由于本项目使用pin资源较少,因此没有修改drv_gpio.c文件中的定义 #define N32F10X_PIN_NUMBERS 64 而是直接在代码中定义了所用的pin脚和相关资源 #define SPI1_BUS_NAME "spi1" #define SPI1__DEVICE_NAME "spi10" #define SPI1_NCS_PIN 29 //PA4 如之前所述,魔方最重要的就是色块的变化,各个时期和地方的版本虽然有所区别,但主流采用红、黄、蓝、绿、白、橙六种颜色,目前主要有两种配色:世界版(WCA大赛所用配色)和日版(Rubik教授最初研发时的配色)。 ![图片9.png](https://oss-club.rt-thread.org/uploads/20220323/6b0186c7ffbd472a5074c6dad37bc06e.png) 图九、颜色要求 对于每个面具体的颜色,采用的是原色大辞典中标准色号: ![图片10.png](https://oss-club.rt-thread.org/uploads/20220323/ce66daa900385e018154a0c0b4255912.png) 图十、标准色表 定义为: 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格式储存,每个数只使用其中24位,高8位空闲。 static uint32_t face[384]={0}; 在本项目的硬件结构中,只需要输出320块(没有底)颜色,共计15360,考虑到WS2812信号必须间隔低电平间隔,预留200个0,每次输出的buff: static uint8_t buff[15560]={0}; 2、点灯实现函数 点灯功能实现主要包括: 1)初始化SPI接口函数int rt_hw_spi_config(void),并使用INIT_DEVICE_EXPORT(rt_hw_spi_config);将其加入板卡初始化中。在这个函数中,将SPI0速率初始为13.333MHz。 2)修改单个node的buff函数void reflush_one_node(uint16_t node),该函数的功能就是在旋转时,修改对应的buff值,每次修改48个uint8_t,使其输出与WS2812的单颗灯珠相符合。 3)通过SPI写WS2812灯函数void draw_face2(void),实际上是调用spi.c中的rt_spi_send(spi,buff,sizeof(buff));写入15560个uint8_t。 3、MSH交互功能 加入预留命令 MSH_CMD_EXPORT(init_face, init_face); MSH_CMD_EXPORT(rotate_x_try, rotate_x_try <0-7>); MSH_CMD_EXPORT(rotate_y_try, rotate_y_try <0-7>); MSH_CMD_EXPORT(rotate_z_try, rotate_z_try <0-7>); 分别用于调用初始化方块函数void init_face(void)、旋转x轴函数static void rotate_x_try(int argc, char**argv)、旋转y轴函数static void rotate_y_try(int argc, char**argv)、旋转z轴static void rotate_z_try(int argc, char**argv)。 七、其它 作品图片 ![图片11.png](https://oss-club.rt-thread.org/uploads/20220323/c5775626f8579251abcf6df26686237a.png.webp) ![图片12.png](https://oss-club.rt-thread.org/uploads/20220323/e4d18a484cfb1c443c91e8aee0523073.png.webp) 视频效果 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
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
tobot
这家伙很懒,什么也没写!
文章
1
回答
0
被采纳
0
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
15
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部