
电子流麻
简介
“流麻”,全名为“流沙麻将”,是一种手工艺品,流麻越来越受到年轻人的青睐。本项目基于LED点阵屏,设计了一套粒子运动算法,来模拟流沙在流麻中的运动。不同颜色的粒子交织在一起能够很好的还原出流麻的美丽。
简介:“流麻”,全名为“流沙麻将”,是一种手工艺品,流麻越来越受到年轻人的青睐。本项目基于LED点阵屏,设计了一套粒子运动算法,来模拟流沙在流麻中的运动。不同颜色的粒子交织在一起能够很好的还原出流麻的美丽。开源协议
:GPL 3.0
描述
1. 简介
我平常就很喜欢做各种各样的手工作品,尤其是流沙麻将,在过去的一年做了好多块。这次我想做一块特殊一点的流麻,我想要把我所喜欢制作的手工作品和我所学的专业知识结合起来,于是就有了这块电子流麻。通过控制LED灯珠的亮灭来模拟真实流麻中流沙的流动,不同颜色的粒子交织在一起有一种赛博朋克的美感。具体的效果请看这个视频我做了一块电子流麻!!!:
2. 硬件部分
本项目是基于立创天空星开发板STM32F407的电子流麻,使用的屏幕是微雪家的2.5mm间距LED点阵屏,分辨率为32×64,采用MPU6050模块来获取电子流麻中粒子的水平和垂直加速度。供电部分的设计参考了@小煜哥哥的IP5306简易18650充电宝方案,采用IP5306芯片为一节18650锂电池充电,并将锂电池升压到5v,为LED屏幕及单片机供电。
本项目的工作原理为:MPU6050模块获取当前x轴与y轴加速度,通过I2C协议将采集的加速度数据传到单片机。单片机根据加速度数据来计算所有粒子的位置,并将结果显示到LED屏幕上。原理图设计方面没有什么好过多介绍的,就是把上述所说的电路连接在一起即可。画好的PCB板如图所示:
这块PCB板的尺寸为8mm*16mm,和LED屏幕的尺寸刚好相同。因此,把PCB板放在下面,屏幕放在下面,两者可以通过螺柱进行连接,螺柱的位置如图中定位孔所示,刚好能和LED屏幕的固定孔对应上。中间靠下方的两个定位孔是用来固定MPU6050模块的,而不是用来固定屏幕的。
2.1 LED屏幕与底板的连接
如图所示,一共需要两根线将底板与屏幕相连,一根是数据线,一根是供电线。卖屏幕的厂家会附赠这两根线,但是附赠的线很长,可能塞不进底板和屏幕之间,因此推荐使用更短一点的线。更短的数据线能够在淘宝直接买到,但是短一点的供电线就需要自己手搓了。数据线有防呆设计的2×8p牛角插座,不会接反。供电线要注意不能把+5V和GND接反,否则会烧坏。
2.2 核心板与底板的连接
在PCB板子上的核心板区域,需要焊两个2×20p的排母,注意核心板往板子上插的时候不要插反了,串口以及下载口的排针要朝外。 顺便再说一句,核心板发货的时候是不焊排针的,需要自行购买两个2×20p的排针,以及一个2×5p的排针来焊接。核心板焊接的时候排针是朝下焊的,要注意不要焊反了,我们实验室之前就有个小憨憨把排针焊反了,被我嘲笑了好久哈哈哈。还有一点不要直接把核心板焊在PCB板上,如果这样核心板就很难重复利用了。用排母和排针相连接的方式会更好一些。
2.3 MPU6050与底板的连接
在PCB板子的MPU6050区域,需要焊接一个1×8p的排母,注意这个排母不要焊歪,一定要正。如果歪了的话会对加速度的准确性有影响。
2.4 锂电池充放电电路
锂电池充放电电路采用的芯片是IP5306。这款芯片的地是连接在芯片肚皮下的引脚,因此焊接有一定的难度,需要使用热风枪来焊接,而不能用电烙铁焊接。PCB底板的其他部分均可使用电烙铁完成焊接。另外,这个电路板的供电是PCB板右边的type-c接口,不能使用核心板上的type-c接口供电。 原因是核心板上的type-c接口带负载能力小,电流应该不超过1A。而LED屏幕满载的时候电流超过2.5A(当然,电子流麻所需电流离满载电流差的很远),屏幕商家提供的资料里说,使用核心板type-c接口供电可能会把核心板烧了。我不清楚后果是不是真的那么严重,但是使用PCB板子上右侧的type-c接口供电一定没问题。还有一点锂电池电池盒是有正负极的注意不要焊反。
2.5 开关
整块PCB板子共有四个按键开关,其中左边三个是暂时没有用到的,可以不焊接。右边锂电池充放电电路区域的开关是必须焊接的,它是电子流麻的开关。短按一次开机,连续短按两次关机。
3. 软件部分
本项目的软件部分使用keil5搭配CubeMX来编程,因此使用的库是HAL库。
3.1 MPU6050模块
这部分的程序我参考了江科大的STM32教程中软件I2C读写MPU6050的源码。使用MPU6050_GetData
函数即可读取当前六轴陀螺仪和加速度计的值。实际上,本项目只用到其中两个,即水平加速度和垂直加速度。同时注意I2C使用的SDA和SCL引脚都要在程序中设置为开漏输出而不是推挽输出。。。不要像我一样这个问题找了两天才发现。
3.2 定义结构体并初始化
typedef struct{
float Acce_x;
float Speed_x;//当前粒子x轴速度
float Displacement_x;//当前粒子x轴位移
uint16_t Position_x;//当前粒子x轴位置
float Acce_y;
float Speed_y;//当前粒子y轴速度
float Displacement_y;//当前粒子y轴位移
uint16_t Position_y;//当前粒子y轴位置
uint16_t Color;
uint16_t Index;
float Random_Acce;
}easy_pixel;
这部分代码定义了单个粒子的一些信息,比如加速度,速度,位移,位置,颜色等。对粒子进行初始化就是给粒子的以上信息赋值。比如视频的一开始像素块排列的整整齐齐,给它们上色的过程就是初始化。
3.3 依次更新单个粒子的加速度、速度、位移
我们在高中物理学过,加速度在时间上的累计就是速度,速度在时间上的累计就是位移。或者换成更严谨一点的描述,加速度对时间的积分为速度,速度对时间的积分为位移。在程序中,可以很方便的实现积分的功能。只需要定义一个最小时间单位,将每次循环得到的加速度乘以这个最小的时间单位,再累加起来就可以得到速度。同理,累加速度可以得到位移。当位移超过1时,就代表粒子应该移动一格。
void Update_State(easy_pixel* p, float AX, float AY)
{
Update_Acce(p, AX, AY);
Update_Speed(p);
Update_Displacement(p);
}
3.4 更新所有粒子的信息
本项目总共有512个粒子,也就是说,将3.3的步骤重复512次,就可以完成一次更新全部粒子。3.4的函数写在while(1)循环中,这使得程序可以不断更新所有粒子的状态,流沙就可以在LED屏幕上流动起来了。
void Update_Group_State(easy_pixel* p, float AX, float AY)
{
for(uint16_t i = 0;i < Init_Height * Init_Width;i++){
Update_State(p, AX, AY);
p += 1;
}
}
3.5 总结
程序框图如下:
graph TD
Start --> 初始化 -->MPU6050读取加速度数据
MPU6050读取加速度数据 -->更新单个粒子加速度 --> 更新单个粒子速度-->更新单个粒子位移-->所有粒子都更新完了吗
所有粒子都更新完了吗 --Y-->MPU6050读取加速度数据
所有粒子都更新完了吗 --N-->更新单个粒子加速度
在循环中我没有加延时,因为实测MPU6050读取数据就用了比较多的时间,因此不需要延时。
4. 元件清单
这里我列举出了一些要在淘宝购买的元件。
以下是必须购买的:
- LED屏幕2.5mm间距 32×64分辨率 微雪 点阵显示屏 RGB全彩LED 亮度可调 HUB75接口 DIY屏幕可级联
- MPU6050模块,选直针往下焊MPU6050模块三维角度传感器6DOF三六轴加速度计电子陀螺仪
- 18650锂电池一节,任意容量均可
- 铜柱系列要买的有些多
- 这个是用来连接LED屏幕和底板的,我测量了焊接好的底板最高的部分在25mm左右,因此理论选择28-35mm长的铜柱都可以。我这里选择35mm是因为我想把手指头伸进缝隙按核心板上的复位键M3*35+6 单头螺柱
- 这个是用来连接底板和MPU6050模块的M3*11mm 双通铜柱
- 这个螺丝是用来固定铜柱的,注意这个平头的螺丝头有点大,因此MPU6050在固定的时候只能拧上一个螺丝。或许使用圆头螺丝会好一些M3*4mm 平头螺丝
- stlink下载器一个,用于下载程序。
以下可选购买(买了的话最后展示效果会好一些): - 这根数据线用于连接底板与LED屏幕5cm长度 2×8p 2.54mm 灰排线LED屏连接JTAG下载线
- LED屏幕的供电线稍微麻烦一点,需要用以下两根线焊接在一起。
100mm单头线VH3.96mm间距彩色电子连接端子线 胶壳4P
红色黑色各一根17AWG 1m航模耐高温超软硅胶线 - LED均光板,只要买尺寸大于8cm×16cm即可,厚度可以选择0.5mm。我自己买的可能有点贵,就不放链接了。
其他元件在嘉立创上都可以买到,要注意一定要看清元件再下单!!一定要看清元件再下单!!一定要看清元件再下单!! 别买错了浪费钱。
设计图

BOM


评论