新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 有闲置屏幕?别丢!做个电子流麻,美汁汁!

有闲置屏幕?别丢!做个电子流麻,美汁汁!

作者: 时间:2024-12-12 来源:嘉立创 收藏

家里有闲置的屏幕?别丢!

本文引用地址:https://www.eepw.com.cn/article/202412/465455.htm

可以用来做一个!原理很简单,也很有趣

不但好玩解压!还能学一学粒子运动算法!

一、功能/亮点

  • 基于F407天空星开发板设计

  • 采用粒子运动算法,通过控制LED灯珠的亮灭,模拟流麻运动。

  • 采用LED点阵屏,2.5mm间距;分辨率32×64

  • PCB板尺寸8mm*16mm,支持免费打样

那么,想实现真实的流麻效果,怎么设计软硬件?原理是啥?怎么准备DIY物料?

下面逐个分享

二、硬件设计

原理图1

原理图2

PCB图1

*参考设计部分:供电部分的设计参考了@小煜哥哥的IP5306简易18650充电宝方案

1.硬件工作原理

采用MPU6050模块来获取中,粒子的水平和垂直加速度,通过I2C协议将采集的加速度数据传到单片机

单片机根据加速度数据来计算所有粒子的位置,并将结果显示上。

2.设计说明

①关于供电

采用IP5306芯片为一节18650锂电池充电,并将锂电池升压到5v,为及单片机供电

②为啥板子上有四个按键开关?

其中左边三个是暂时没有用到的,可以不焊接。

已知,硬件设计,是为了“装下”流麻。

软件设计,就是为了“实现”流麻。

具体怎么做?

三、软件设计教程

使用keil5搭配CubeMX来编程,使用的库是HAL库

*MPU6050的程序我参考了@江科大的教程中软件I2C读写MPU6050的源码。

1.MPU6050模块

使用MPU6050_GetData函数即可读取当前水平加速度垂直加速度的值

注意I2C使用的SDA和SCL引脚,都要在程序中设置为开漏输出而不是推挽输出。别问我怎么知道的

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.依次更新

void Update_State(easy_pixel* p, float AX, float AY){
 Update_Acce(p, AX, AY);
 Update_Speed(p);
 Update_Displacement(p);
}

那怎么依次更新粒子的加速度、速度、位移?

我们在高中物理学过,加速度在时间上的累计就是速度,速度在时间上的累计就是位移。

或者换成更严谨一点的描述。

加速度对时间的积分为速度,速度对时间的积分为位移。

在程序中,可以很方便的实现积分的功能。

只需要定义一个最小时间单位,将每次循环得到的加速度乘以这个最小的时间单位,再累加起来就可以得到速度。

同理,累加速度可以得到位移。

当位移超过1时,就代表粒子应该移动一格。

4.更新所有粒子的信息

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;
 }
}

本项目总共有512个粒子。也就是说,将上一小节的步骤重复512次,就可以完成一次更新全部粒子。

本小节的函数写在while(1)循环中,这使得程序可以不断更新所有粒子的状态,流沙就可以在上流动起来了。

DIY物料有哪些?

1.基础物料清单表

2.补充清单

参考资料:

[1]https://oshwhub.com/lemon11111/electronic-liuma



评论


相关推荐

技术专区

关闭