时光空间立方

一款基于BK7252芯片,RT-Thread物联网操作系统的桌面小工具。

平头idea

喜欢

342
浏览
2
喜欢

> 更多图片

项目状态:已完成
开放度:公开
所属分类:电子
发布时间:2021-07-23
最近更新:2021-07-23

标签

描述

外观是完美的正方体,每个面在未启动时就像一面镜子,启动后则可以看到一个无限五彩斑斓的内部空间。放置于办公桌面,既是一款优雅的装饰品,又是一款具有实用价值的小巧工具。
可以晃动触发显示时间/天气/一言/骰子。


详细说明

https://www.bilibili.com/video/BV1N54y1v79T (下方视频如无法显示请点此链接查看)


概述

基于麻雀一号核心板 RW052,即博通的 WIFI 蓝牙一体的芯片 BK7252,我制作了一款桌面小工具:时光空间立方。

它可以实现:

1、微信小程序可以通过蓝牙配置小立方的参数;

2、晃动立方可以触发亮屏、亮灯;

3、立方可以通过蓝牙配网,连接 WIFI;

4、屏幕上可以显示:日期时间、实时天气、名言警句,或者是模仿摇骰子产生随机点数;

5、立方内部有呼吸灯和彩虹灯的效果。

作为一款桌面小工具,它既可以提示必要的信息,如时间、天气,又可以趣味互动,如摇骰子、随机显示名言警句,集信息提示与娱乐一体。

外观则是完美的正方体,每个面在未启动时就像一面镜子,启动后则可以看到一个无限五彩斑斓的内部空间。放置于办公桌面,既是一款优雅的装饰品,又是一款具有实用价值的小巧工具。

整个方案涉及的技术栈有:硬件选型,PCB 设计,RT-Thread 程序,3D 建模打印,服务器端程序,API 接口对接,微信小程序编写等等。

链接表


教程

RT-Thread 使用情况概述
内核部分:使用了线程、信号量、互斥量、定时器
组件部分:使用了虚拟文件系统、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 文件中。

演示效果

未上电时的外观,与二阶魔方的对比

上电后的侧面效果

从外向内看的效果

显示天气时的屏幕特写

嵌入立方中的 PCB

以上图片均为实拍直出,未经 P 图或滤镜。

演示视频

B 站: https://www.bilibili.com/video/BV1za4y1Y7Fg/ (下方视频如无法显示请点此链接查看)
(视频中为了方便拍摄,没有选择来回摇晃,而是直接往桌子上磕一下,并且设置了默认亮灯亮屏为 15 秒)视频中展示了整个控制流程,从上电,到用自己写的微信小程序连接蓝牙,再到不同指令的发送。网络通信是直接连接到我自己的一台互联网服务器上,通过 http 接口获取数据,服务器程序使用 Python 编写。配网功能很简单没有展示,配置成功一次后,上电自动就能联网了。

代码地址

Github: https://github.com/illusionlee/lightcube

代码使用了 MIT 协议,相对较为开放。因为我的一些代码仍然会有一些BUG,所以非常期待更多人可以参与进来,issue、pr,开源精神亦在于此吧!共同完善,争取每个人都可以拥有属于自己的时光空间立方,工作闲暇之余,拿起来晃一晃,能够体验到一点点乐趣。