基于RT-Thread开发电子魔方实现功能

一、应用背景
魔方,又叫鲁比克方块(rubik’s cube),是匈牙利布达佩斯建筑学院厄尔诺·鲁比克教授发明的机械益智玩具,由若干个积木块组成,积木块之间通过卡榫契合,能做到“组”的相对位置改变,从而构成各种形状的花纹,基本的玩法就是通过旋转,打散各面色块后用最快速度还原。魔方的设计初衷是用来认识空间组成和结构的教具,后来成为风靡全球的玩具,形状从原始的正方体发展出球型、钻石型、粽子型等异形,阶数从最早的三阶扩充到三十阶以上。
魔方竞赛也成为国际比赛项目,通过世界魔方协会比赛的认证成绩甚至可以记载入世界纪录当中。
传统魔方采用物理结构契合,高阶魔方使用时旋转次数多,要求速度快、精度高,很容易磨损导致性能下降无法使用(我自己就有一天玩坏一个高阶魔方的经历)。基于此,试图将魔方功能“电子”化,减少机械磨损。
二、实现功能
本设计分为两个部分:电子魔方和gui。
电子魔方基于rt-thread开发,使用n32g457驱动ws2812板,通过点亮ws2812灯珠,实现魔方转动效果。本次开发所用ws2812板为8*8的板卡,共用了5块,搭成正方体形状(留出底面),共计320颗灯珠,用于模拟一个8阶魔方。
gui为纯软件开发,在电脑上运行,可以通过鼠标或键盘操作,实现魔方的转动。为配合电子魔方,设计了界面,8阶魔方共有24个方向可转动(反向可以通过旋转3次实现),设计24个按钮,由于高阶魔方还原难度较高,因此还预留了“一键还原”功能。
图四 gui
三、开发板和rt-thread使用情况概述
使用n32g45xvl-stb开发板,该开发板mcu芯片型号为国民技术的n32g457vel7,lqfp100管脚封装,板卡把所有gpio都引出连接到j1,j2和j12插针上,非常便于开发和调试,但在本项目中,仅使用了pa7(spi0的mosi接口)。
图五 n32g45xvl-stb开发板
安装的rt-thread studio,版本: 2.1.5(构建id: 202201191915),其上已经自带了rt-thread模块,直接从sdk中拖取了nations的n32g45xvl-stb板,并使能了其spi功能,所用spi为spi0。
用于呈现的ws2812,采用购买的88模块成品,自己拼装成立方体,考虑到底面没有人会去看,因此直接空出来。
ws2812的实现原理比较简单,就是通过输入特定长度的高低电平,驱动若干颗灯珠,每个颜色比特传输数据需要1.25us,可以略微超频(甚至有的datasheet中表示可以超频600ns,实测做不到的),在本项目中,采用的是spi驱动,将其设置为1.2us/颜色比特使用,分别通过spi传输ffc0、f000作为其0、1码表示。
图六  ws2812的datasheet
四、硬件框架
其硬件结构非常简单,采用5块88的ws2812灯板串接作为输出,将其搭建成立体形状,串接各面的板和板之间串接顺序为顶、前、右、后、左,在平面展开图中,每块灯板上的灯珠的顺序为从左到右,从上到下依次递增,共320颗,在最初设计和调试时,使用了外部供电,后省略,直接由板上的5v从usb接口取电。大致框架如下:
图七 硬件框架示意图
五、软件框架
由于上位机和下位机分别开发,上位机所用语言为python,基于windows环境运行(理论上移植linux也很简单),下位机使用c开发,在n32开发板上运行,其操作/执行流程如下:
图八 软件业务流程
六、软件模块说明
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教授最初研发时的配色)。
图九 颜色要求
对于每个面具体的颜色,采用的是原色大辞典中标准色号:
图十 标准色表
定义为:
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交互功能
加入预留命令
1msh_cmd_export(init_face, init_face);2msh_cmd_export(rotate_x_try, rotate_x_try );3msh_cmd_export(rotate_y_try, rotate_y_try );4msh_cmd_export(rotate_z_try, rotate_z_try );  
分别用于调用初始化方块函数void init_face(void)、旋转x轴函数static void rotate_x_try(int argc, charargv)、旋转y轴函数static void rotate_y_try(int argc, charargv)、旋转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物联网操作系统】欢迎添加关注!文章转载请注明出处。


UWB消费级市场深度分析,它更像蓝牙还是NFC?
中国及亚太地区市场呈现强劲增长 成为推动全球连接器增长的主要动力
VoWLAN的安全性问题的解决方案研究
低速电动车行业再度被推向风口浪尖!低速电动车渴望“转正”
矿物绝缘电缆产品特性-clan
基于RT-Thread开发电子魔方实现功能
24v继电器工作原理
汽车电动化将使汽车价格大幅上涨 未来低收入人群或将买不起电动汽车
自动发电控制软硬件系统设计(部分)
泰克公司新增完善的高速串行协议测试平台
5G+无人驾驶:无人驾驶“闯入”极寒区 完成露天矿无人运输作业系统
3G手机新格局的剖析
十年后可以实现无人驾驶普遍化吗?
关于GD32E103系列Cortex®-M4 MCU的性能分析和应用介绍
国星光电净利营收2.2亿元,同比增长46%
检测各类环境中氰化氢浓度的传感器
“汽车科技大玩家”:预测汽车未来前景,共同探讨汽车发展的更多可能性
现场总线控制系统优点
Fluke 1742、1746和1748在线可移动式电能质量记录仪的性能及应用
中国无人机为什么不对俄罗斯出口?原因是什么?