【Follow me第二季第2期】+ 基础任务【驱动LED矩阵+DAC正弦波+放大信号+ADC数据采集】
[复制链接]
本帖最后由 御坂10032号 于 2024-9-7 21:19 编辑
前言
在上一个章节中我们学习到了如何使用R4来Blink 和 使用串口输出数据, 那么本章节我们来研究以下如何驱动R4的LED矩阵和使用DAC生成正弦波,然后用OPAMP放大DAC信号。最后用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线。
一、驱动LED矩阵
R4上有一个LED矩阵,根据官方的文档得知, 如果我们想使用LED矩阵主要为以下几步。
1- 引入头文件
#include "Arduino_LED_Matrix.h"
2-定义matrix对象
ArduinoLEDMatrix matrix;
3-在setup中调用matrix的start函数
matrix.begin();
代码如下所示
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
void setup() {
Serial.begin(115200);
matrix.begin();
}
那么上述的起始工作我们已经完成了,但是具体怎么来驱动矩阵呢? 由于这个LED矩阵是一个8*12的, 所以每一个LED灯都占用了一个bit用来存储led的状态。 如下代码所示
byte frame[8][12] = {
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
上面的矩阵是一个爱心的形状, 如果想让这个形状更加清晰的话, 可以使用ctrl + f 然后搜索1, 此时你会更清晰的看到这个爱心。 如下图所示
紧接着我们便可以通过 matrix.renderBitmap(frame, 8, 12); 加载这个矩阵数组。 如下代码所示
// To use ArduinoGraphics APIs, please include BEFORE Arduino_LED_Matrix
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
byte frame[8][12] = {
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
void setup() {
Serial.begin(115200);
matrix.begin();
matrix.renderBitmap(frame, 8, 12);
}
void loop() {
}
实验现象如下:
我们也可以换一种方式来表示LED的状态, 比如说使用16进制
unsigned long frame[] = {
0x3184a444,
0x42081100,
0xa0040000
};
为什么它可以表示LED的状态呢? 首先我们需要把他转换成2进制便得到如下数据
110001100001001010010001000100
1000010000010000001000100000000
10100000000001000000000000000000
然后32位对齐(高位补0保持原本数据不变)
00110001100001001010010001000100
01000010000010000001000100000000
10100000000001000000000000000000
之后呢, 再将其分成8*12的原始矩阵,便得到了如下数据
001100011000
010010100100
010001000100
001000001000
000100010000
000010100000
000001000000
000000000000
它还是上面我们定义的爱心矩阵。之后我们便可以通过matrix.loadFrame() 函数来加载这个定义的矩阵, 代码如下所示
// To use ArduinoGraphics APIs, please include BEFORE Arduino_LED_Matrix
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
const uint32_t heart[] = {
0x3184a444,
0x44042081,
0x100a0040
};
void setup() {
Serial.begin(115200);
matrix.begin();
matrix.loadFrame(heart);
}
void loop() {
}
实验现象如下所示
那么基础的原理理解的话,我们便可以看一下今天写的第一个代码, 通过数据帧的方式打印Hello EEworld and Digikey
1 - 首先定义一个头文件eeworld.h 用来存储每一个字母的状态
const uint32_t animation[][4] = {
{
0x8808,
0x880f80,
0x88088088,
},
{
0xf808,
0x800f80,
0x800800f8,
},
{
0x8008,
0x800800,
0x800800f8,
},
{
0x8008,
0x800800,
0x800800f8,
},
{
0x6009,
0x900900,
0x90090060,
},
{
0xf808,
0x800f80,
0x800800f8,
},
{
0xf808,
0x800f80,
0x800800f8,
},
{
0xf808,
0x800f80,
0x800800f8,
},
{
0x40,
0x12221540,
0x88000000,
},
{
0x6009,
0x900900,
0x90060000,
},
{
0xf009,
0x900f00,
0xc00a0090,
},
{
0x8008,
0x800800,
0x800f8000,
},
{
0xc00a,
0x900900,
0xa00c0000,
},
{
0x00,
0x00,
0x00,
},
{
0x400a,
0xa00e00,
0xa00a0000,
},
{
0xe00a,
0xa00a00,
0xa00a0000,
},
{
0xc00a,
0x900900,
0xa00c0000,
},
{
0x00,
0x00,
0x00,
},
{
0xc00a,
0x900900,
0xa00c0000,
},
{
0xe004,
0x400400,
0x400e0000,
},
{
0x1e012,
0x1201601,
0x101f0000,
},
{
0xe004,
0x400400,
0x400e0000,
},
{
0x900a,
0xc00a00,
0x90000000,
},
{
0xf008,
0x800f00,
0x800800f0,
},
{
0x1100a,
0x400400,
0x40040000,
},
{
0x00,
0x00,
0x00,
},
{
0x00,
0x00,
0x00,
}
};
2- 在主程序中引入头文件
#include "eeworld.h"
3- 完整代码如下所示
#include "eeworld.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
const int frameCount = sizeof(animation) / sizeof(animation[0]); // 获取总帧数
int currentFrame = 0; // 当前帧计数器
void setup() {
Serial.begin(115200);
matrix.begin();
}
void loop() {
matrix.loadFrame(animation[currentFrame]); // 加载并显示当前帧
delay(500); // 延迟 500 毫秒
// 更新帧计数器以显示下一个帧
currentFrame++;
if (currentFrame >= frameCount) {
currentFrame = 0; // 如果达到最后一帧,则返回到第一帧
}
}
实验现象如下所示:
9月7日 (1)
附件代码:
|