349|2

132

帖子

2

TA的资源

一粒金砂(高级)

【Follow me第二季第2期】+ 基础任务【驱动LED矩阵+DAC正弦波+放大信号+ADC数据采集】 [复制链接]

本帖最后由 御坂10032号 于 2024-9-7 21:19 编辑

前言

 

        在上一个章节中我们学习到了如何使用R4来Blink 和 使用串口输出数据, 那么本章节我们来研究以下如何驱动R4的LED矩阵和使用DAC生成正弦波,然后用OPAMP放大DAC信号。最后用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线。

 


 

一、驱动LED矩阵

 

matrix-closeup.png

 

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, 此时你会更清晰的看到这个爱心。 如下图所示

 

image.png  

 

紧接着我们便可以通过 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() {

}

 

实验现象如下:

 

8177328febae97e0ca717542e58371a.jpg  

 

我们也可以换一种方式来表示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() {

}

 

实验现象如下所示

 

 

96e45cbcc2802799abc629181a50067.jpg  

 

  那么基础的原理理解的话,我们便可以看一下今天写的第一个代码, 通过数据帧的方式打印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)

 

附件代码:

sketch_sep7a.ino (621 Bytes, 下载次数: 8)

最新回复

服气,没有点动手能力还完成不了这个任务  详情 回复 发表于 2024-9-12 14:59

回复
举报

21

帖子

9

TA的资源

一粒金砂(中级)

服气,没有点动手能力还完成不了这个任务

点评

哈哈, 是稍微有一点麻烦  详情 回复 发表于 2024-9-12 21:53

回复

132

帖子

2

TA的资源

一粒金砂(高级)

genvex 发表于 2024-9-12 14:59 服气,没有点动手能力还完成不了这个任务

哈哈, 是稍微有一点麻烦


回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
2003年全国大学生电子设计竞赛索尼杯宽带放大器

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 2003年全国大学生电子设计竞赛索尼杯宽带放大器

单片机使用μC/OS-II的利弊

近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题。本文通过对一种源码公开的嵌入式实时操作系统μC/OS- ...

元件封装图解

详细说明见

单片机编程讨论

1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码 ...

降压DC-DC培训资料.pdf

48555

【羽毛球训练监测器项目】-- 羽毛球训练监测模块之额外功能测试

在【羽毛球训练监测器项目】--主功能实现中,我已经完成了用开发板对LSM6DSOX应用在羽毛球拍挥拍识别的数据采集、训练,实现和测 ...

微型ESP32-S2开发板microS2

microS2是基于ESP32-S2的开发板,大小和乐鑫的ESP32-WROOM相当,并带有psram。 513695 主要规格: ESP32-S2 ...

高速PCB设计技术(中文)

516212

SIMterix-Simplis 合集

~1~ ~3~ ~4~ ~5~ ~6~ ~7~ ~8~

极客版H-20T 高温自动休眠速热恒温烙铁免费申请开始

H-20T恒温电烙铁是基于CL-018GE升级迭代的最新最强版本,完美整合了适应更广泛作业场合的多项关键性能,尤其是增加了极其实用的 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表