- M5StickC Plus SDK,通过Github或Arduino下载库
- Arduino或VSCode
- 两块LED灯板、杜邦线若干
👉 本工程基于VSCode与Arduino开发,在此环境下,工程可直接编译通过。在Arduino IDE下,可能存在头文件路径的问题,未验证。
├─ demo,独立的电子沙漏倒计时工程
│ ├─ build,编译时的构建文件
│ │ └─ ……
│ ├─ include,工程头文件
│ │ ├─ bsp_timer.h,硬件定时器相关
│ │ ├─ ledmatrix.h,控制LED灯板的方法
│ │ ├─ matrixsand.h,矩阵沙粒的动态计算方法
│ │ ├─ matrixsand.py
│ │ ├─ nonblock_delay.h,非阻塞延迟函数
│ │ ├─ sandglass.h,顶层电子沙漏与倒计时逻辑的方法
│ │ ├─ softspi.h,软SPI底层
│ │ └─ user.h,用户逻辑相关
│ ├─ src,工程源文件
│ │ ├─ bsp_timer.cpp
│ │ ├─ ledmatrix.cpp
│ │ ├─ nonblock_delay.cpp
│ │ ├─ sandglass.cpp
│ │ └─ user.cpp
│ └─ demo.ino
├─ imu_sandglass,独立的重力电子沙漏工程(仅沙漏,无倒计时部分逻辑)
│ ├─ include
│ │ └─ ……
│ ├─ src
│ │ └─ ……
│ └─ imu_sandglass.ino
└─ StickC_Plus_20200616.pdf,M5StickC Plus 电路原理图
两块LED矩阵上有两片74595,可以使用软SPI方式驱动灯板。限于M5引出的IO口有限(且下方的IO口用杜邦线引出十分不牢固),两路SPI总线(data、clock、latch)可以共用数据与Latch线,而不共用时钟线,通过面包板连接。
左下角LED灯板为沙漏⌛的上方,其沙粒从右下角流至第二块灯板的左上角。
LED灯板与M5的具体连接关系:
引脚 | 含义 | 引脚编号 |
---|---|---|
G26 | 数据信号 | 26 |
G25 | 时钟信号1 | 25 |
G33 | 时钟信号2 | 33 |
G0 | Latch信号 | 0 |
G36 | 复用IO,需要设置浮空输入 | 36 |
#define MUTEX_PIN GPIO_NUM_36
gpio_pulldown_dis(MUTEX_PIN);
gpio_pullup_dis(MUTEX_PIN);
软件工程组成:软SPI驱动、LED矩阵驱动、矩阵沙的动态效果计算、电子沙漏顶层类、定时器(与中断服务)及非阻塞延时的功能函数。软件主要的工作流程如图所示:
工程代码讲解及效果参见:
- M5StickC API
- 软SPI:bxparks/AceSPI
- LED矩阵:adafruit/Adafruit_CircuitPython_HT16K33,用C++实现
- 矩阵沙粒随重力动态效果计算:adafruit/Adafruit_Learning_System_Guides,用C++实现
- 重力电子沙漏:LED Matrix Hourglass Created by Ruiz Brothers,用C++实现