# 基于RP2040的电子沙漏
<img src="docs/image/电子沙漏封面.jpg" alt="电子沙漏封面" style="zoom: 25%;" />
## 0 文件介绍
- docs文件夹存放了项目使用到的一些模块的原理图;
- sandy-clock文件夹存放了源代码,可直接使用pycharm打开,具体配置可见下文5.1节;
- sandy-clock文件夹中,main为主文件;
- main_pc为在电脑上运行的算法验证文件,与单片机硬件无关,可在python命令行中运行,每帧均可输入-180~180度的重力方向值,观察沙粒运动情况;
- 其他文件均为main.py的库文件,均与硬件相关,在单片机上运行时需要一同上传上去。
## 1 项目需求
目标:实现一个可以定时调节速度的电子沙漏
具体要求:
1. 自行设计一个电子沙漏的物理结构,将提供的两个LED灯板和RP2040 Game Kit固定
2. 通过RP2040 Game Kit上的按键和LCD屏幕设定沙漏一个周期的时间,实现如上图中LED的效果
3. 通过RP2040 Game Kit上的姿态传感器来感知沙漏的方向变化,并开始新的沙漏操作
## 2 硬件介绍
项目使用的开发板为搭载RP2040芯片的游戏机开发板。
RP2040 Game Kit是基于树莓派RP2040的嵌入式系统学习平台,通过USB Type-C连接器供电,采用RP2040作为主控,具有双核Arm Cortex M0+内核和264KB内存,可通过MicroPython或C/C++编程,性能强大。板上四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制,并有240*240分辨率的彩色LCD屏显示,片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps。可玩性极高,可移植多款复古游戏,还可作为电赛的控制、显示接口平台,搭配传感器、模拟电路外还可以完成更多创意项目。
<img src="docs/image/image-20220829162033830.png" alt="image-20220829162033830" style="zoom:80%;" />
硬件框图如下:
![image-20220829204057021](docs/image/image-20220829204057021.png)
本项目使用了全彩LCD、按键与姿态传感器模块,并使用spi扩展接口控制LED灯板
## 3 完成的功能
3.1 电子沙漏中沙粒随重力方向下落
![image-20220829162033818](docs/image/image-20220829162033818.png)
3.2 可调节电子沙漏计时时间
![image-20220829163654770](docs/image/image-20220829163654770.png)
3.3 设计折叠屏机械结构,装配美观
<img src="docs/image/image-20220829163017739.png" alt="image-20220829163017739" style="zoom:67%;" />
## 4 实现思路
- RP2040采用micropython框架进行开发,使用micropython的面向对象特性。
- RP2040获取板载姿态传感器数据,推算出重力方向,并据此计算沙漏中沙粒的下落情况。
- 通过调节相邻沙粒在缝隙间穿梭的间隔帧数,调节时间,并在lcd屏幕上显示。
- 使用solidworks绘制折叠屏的3D模型,完成打印并组装。
## 5 实现过程
本项目的软件框架图如下:
<img src="docs/image/image-20220829203637829.png" alt="image-20220829203637829" style="zoom: 80%;" />
### 5.1 环境配置
由于pycharm优秀的代码提示特性,且pycharm支持RP2040的micropython开发,项目初期使用pycharm开发沙粒受重力作用运动的算法。随后,使用Thonny将代码上载到RP2040开发板中。
使用pycharm开发micropython需要在Settings>>Plugins>>搜索安装micropython插件:
<img src="docs/image/image-20220829170019352.png" alt="image-20220829170019352" style="zoom: 67%;" />
然后进入Settings>>Languages&Frameworks>>MicroPython 界面,将选项设置成下图的形式:
<img src="docs/image/image-20220829165950900.png" alt="image-20220829165950900" style="zoom: 67%;" />
随后,pycharm即可识别出`import machine` 等 MicroPython 相关包,并正确进行`Pin()` 、`Timer()` 等模块的代码提示。
### 5.2 重力算法开发
代码方面,首先,定义Sandy类,表示每个沙粒,每个沙粒占据一个1*1的位置,其成员变量包括x,y轴坐标与一个标志位,这个标志位用来标志现在沙粒是在上面这个块还是下面这个块。其代码如下:
```python
class Sandy:
def __init__(self, block, x, y):
self.block = block # 0->up,1->low
self.x = x
self.y = y
```
定义SandyClock类,该类为电子沙漏的顶层类,其成员变量报告:首先是两个8*8数组分别表示上下两个块每个像素的状态;一个沙粒的list,用于存放并索引到电子沙漏里存放的沙粒,还有一个三维向量用于标记重力方向。另外,为了实现调速等扩展功能,还需要添加时间相关变量。最后,SandyClock类构造函数如下:
```python
class SandyClock:
# 板子是上面的还是下面的
LOW_BLOCK = 0
UP_BLOCK = 1
# 这个位置是否有沙砾
NO_SANDY = 0
HAS_SANDY = 1
# 是否在底边上
IN_BOTTOM = 0
NOT_IN_BOTTOM = 1
IN_X_SLOPE = 2
IN_Y_SLOPE = 3
current_time = 0
# 构造函数
def __init__(self, sandy_list=None, size=None):
# 棋盘大小,如果用的不是8*8矩阵,可以在这里改
if size is None:
size = [8, 8, 8, 8]
self.up_block_x = size[0]
self.up_block_y = size[1]
self.low_block_x = size[2]
self.low_block_y = size[3]
# 沙砾集合
if sandy_list is None:
sandy_list = []
for i in range(self.low_block_x):
sandy_list.append(Sandy(SandyClock.LOW_BLOCK, 0, i))
for i in range(self.low_block_x):
sandy_list.append(Sandy(SandyClock.LOW_BLOCK, 2, i))
for i in range(self.low_block_x):
sandy_list.append(Sandy(SandyClock.LOW_BLOCK, 4, i))
for i in range(self.low_block_x):
sandy_list.append(Sandy(SandyClock.LOW_BLOCK, 6, i))
# for i in range(self.up_block_x):
# sandy_list.append(Sandy(SandyClock.UP_BLOCK, 0, i))
self.sandy_list = sandy_list
# 生成棋盘
self.up_block = [[SandyClock.NO_SANDY] * self.up_block_x for _ in range(self.up_block_y)]
self.low_block = [[SandyClock.NO_SANDY] * self.low_block_x for _ in range(self.low_block_y)]
# 把有沙子的地方赋值为1
for index, sandy in enumerate(sandy_list):
if sandy.block == SandyClock.LOW_BLOCK:
self.low_block[sandy.x][sandy.y] = SandyClock.HAS_SANDY
elif sandy.block == SandyClock.UP_BLOCK:
self.up_block[sandy.x][sandy.y] = SandyClock.HAS_SANDY
else:
print("傻逼")
# 重力方向
self.gravity = [1, 1, 0]
# 调速累加值
self.keyframe_acc = 0
self.keyframe_target = 5
self.cross_crack_flag = False
```
每运行一轮,代码会有如下流程:
1. 检测用户按键,修改相应变量;
2. 获取重力的方向;
3. 对存放沙粒的list做随机排序
4. 对沙粒list中的沙粒逐个判定移位
代码如下:
```python
# 运行一轮
def process(self):
self.check_button()
self.update_keyframe()
# 获得重力
self.gravity = self.update_gravity()
# print(self.gravity, end="")
# TODO:加上如果y与之前的y乘积是负数,说明翻过来了,清零
# 根据沙砾的高度排序,算内积
# 从下往上排序
# self.sandy_list.sort(key=lambda sandy:( sandy.x * self.gravity[0] + sandy.y * self.gravity[1] ),reverse=True )
# 从上往下排序
# self.sandy_list.sort(key=lambda sandy:( sandy.x * self.gravity[0] + sandy.y * self.gravity[1] ))
# 猴排,micropyth
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【作品名称】:基于RP2040的电子沙漏,使用RP2040游戏机开发板,灯板是74HC595驱动的8*8LED矩阵 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: - docs文件夹存放了项目使用到的一些模块的原理图; - sandy-clock文件夹存放了源代码,可直接使用pycharm打开,具体配置可见下文5.1节; - sandy-clock文件夹中,main为主文件; - main_pc为在电脑上运行的算法验证文件,与单片机硬件无关,可在python命令行中运行,每帧均可输入-180~180度的重力方向值,观察沙粒运动情况; - 其他文件均为main.py的库文件,均与硬件相关,在单片机上运行时需要一同上传上去。
资源推荐
资源详情
资源评论
收起资源包目录
sandy-clock-code.zip (23个子文件)
sandy-clock-code
.DS_Store 6KB
docs
.DS_Store 6KB
image
image-20220829162033830.png 237KB
image-20220829165950900.png 59KB
image-20220829170019352.png 113KB
image-20220829204057021.png 45KB
image-20220829162033818.png 313KB
image-20220829163017739.png 1.82MB
image-20220829163654770.png 632KB
image-20220829203637829.png 32KB
电子沙漏封面.jpg 2.41MB
NKJ~INCBT{4V`XJ(~~`I0K6.png 927KB
74HC59_datasheet.pdf 361KB
game2040-V3-20211228.pdf 111KB
sandy-clock
main.py 24KB
sr_74hc595_spi.py 2KB
main_pc.py 14KB
st7789.py 31KB
mma7660.py 8KB
fonts
my_16x16.py 25KB
vga2_8x8.py 9KB
vga1_16x32.py 25KB
README.md 24KB
共 23 条
- 1
资源评论
MarcoPage
- 粉丝: 2986
- 资源: 3043
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功