411|0

17

帖子

1

TA的资源

一粒金砂(中级)

【Follow me第二期】入门任务 - 开发环境配置+LED点亮+串口打印+LED点阵驱动 [复制链接]

        我们非常有幸参加本期的Follow me活动,能够亲自体验Arduino这一享誉盛名的开源硬件平台。Arduino以其易用性和灵活性,成为全球电子爱好者和教育者的首选工具,期待本次活动有所收获。

1. 开箱

        9月6日,我们收到了DigiKey提供的包裹,内含Arduino UNO R4 WiFi开发板一套,以及SHT40温湿度传感器和LTR-329光照传感器的扩展板各一块。此外,还包括了一条用于连接的数据线。在开箱过程中,我们注意到两个传感器扩展板均附带了排针,这表明用户可以通过焊接操作,将传感器直接连接至开发板的排母上,从而实现快速部署。

Image0-1.png
Image0-2.png

        我们对所收到的产品进行了仔细检查,确认所有配件均齐全且完好无损。开发板的制造工艺精良,细节处理得当,体现了制造商的高标准和对品质的严格要求。值得一提的是,开发板还附带了一个亚克力底座,这一设计不仅提升了产品的美观度,更重要的是,它能够有效防止开发板背面的管脚在操作过程中发生误触,确保了操作的安全性。

2. 入门任务(必做):搭建环境

        在进行Arduino开发之前,搭建一个稳定且高效的开发环境是至关重要的。鉴于之前没有使用过Arduino,我们首先查阅了其数据手册【ABX00087-datasheet.pdf (digikey.com)】。该手册不仅详尽地列出了板卡的技术参数、管脚功能及其布局,还提供了基本的使用指南,为我们的后续开发工作奠定了基础。

Image1.png

        Arduino提供了两种主要的开发工具:本地IDE和在线编辑器。用户可以通过访问Arduino的官方网站【Arduino - Home】,在顶部菜单中找到对应开发板的使用说明,并下载所需的编辑器。此外,左侧菜单中的Learn Arduino部分提供了不同编辑器的初步教程,为初学者提供了详尽的指导。

Image2-1.png

        本地编辑器的下载地址可以在Software模块找到【Software | Arduino】,不过作为初步尝试,我们选择先Arduino的在线编辑器开发一些短平快的小demo。用户可以通过Software模块顶部的Go To Cloud Editor选项进入在线编辑器,同时,相关的使用教程也在【Using the Arduino Cloud Editor | Arduino Documentation】中提供。

Image2-2.png

        在使用在线编辑器之前,需要注册一个Arduino账户,并安装Arduino Create Agent插件。安装并激活插件后,其图标将显示在电脑右下角的工具栏中。

Image2-3.png

        至此,Arduino在线编辑器的环境配置已基本完成。与我们之前使用的一些单片机开发环境相比,Arduino的配置过程显得尤为简单直观。

Image2-4.png

        完成环境配置后,将Arduino开发板通过USB线连接至电脑,即可开始编写代码并进行烧录。这一过程的便捷性,再次体现了Arduino平台的易用性。

3. 入门任务(必做):LED点亮以及串口打印

        LED点亮和串口打印功能这两项基础功能是电子项目开发中不可或缺的部分,对于初学者而言,掌握它们是进入更高级应用的前提。

        在Arduino的在线编辑器中,通过点击左侧菜单的Sketches选项,我们可以创建一个新的工程。对于我们这样初次接触Arduino编程的用户,可能会感到无从下手。此时,可以利用编辑器左侧的Examples菜单,其中包含了丰富的示例代码,为我们提供了宝贵的参考。

Image3.png

        我们以“Blink”例程为例,该例程展示了如何控制LED的点亮与熄灭。Arduino程序主要由两个函数组成:setup()loop()setup()函数负责初始化设置,如配置管脚模式和初始化外设,它仅在程序开始时执行一次。随后,程序将进入loop()函数,这是程序的主循环,所有持续执行的任务都在这里进行。

Image4.png

        在“Blink”例程中,我们首先将LED对应的管脚设置为输出模式。这样,我们就可以通过改变该管脚的电平状态(高电平或低电平),来控制LED的点亮与熄灭。在loop()函数中,我们通过编写代码,使LED以一定的频率闪烁。

        将上述代码复制到我们的工程中,并烧录到Arduino开发板上。烧录过程中,开发板上的两盏LED指示灯会短暂点亮,以指示烧录过程正在进行。烧录完成后,只有我们指定的LED会按照预设的频率反复点亮和熄灭,实现闪烁效果。

Image5-1.png
Image5-2.png

        串口打印功能的实现与LED点亮类似。在setup()函数中,我们需要初始化串口通信,并设置适当的波特率。在loop()函数中,我们编写代码,使开发板能够周期性地通过串口发送字符串信息。

        我们将LED点亮和串口打印的代码合并到一个工程中,进行烧录,具体代码如下:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Serial.println("Hello EEWorld!");
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

        烧录完成后,开发板上的LED将按照预设频率闪烁,同时,通过打开编辑器的串口监视器,我们可以观察到开发板发送的字符信息。

Image5-3.png

4. 基础任务(必做):驱动12x8点阵LED

        接下来尝试驱动一下LED的点阵。与单个LED的控制相似,点阵LED的控制原理也是通过设置对应位置的管脚电平来控制LED的点亮或熄灭。然而,由于涉及的LED数量较多,我们无法对每个LED进行单独配置,因此需要采用一种编码规则来实现有效的控制。

        我们首先需要引入Arduino_LED_Matrix.h这个头文件,它包含了控制矩阵LED所需的函数。这个库可以通过Arduino IDE的Libraries菜单搜索并添加到项目中。

Image6.png

        查看教程中有关LED Matrix的部分【Using the Arduino UNO R4 WiFi LED Matrix | Arduino Documentation】,我们学习了如何使用这个库来控制LED点阵。相关的例程也可以在LED Matrix库中找到。大致学习了一下教程和例程,对点阵进行编码的方式可以总结为如下两种。

        第一种是直接构建一个8x12的数组,每个元素代表一个LED的状态,0代表熄灭,1代表点亮。这种方法直观且易于理解。例如,我们参考了“DisplaySingleFrame”例程,设计了一个笑脸图案,如下:

Image7-1.png

        在循环主体中,我们使用matrix.renderBitmap()函数来驱动LED矩阵,将数组中的0和1映射到对应的LED位置,实现图案的显示。这个Bitmap非常生动形象的概括了点亮LED的过程,即将各1位的0或1比特映射到对应的LED矩阵位置。

        第二种方法是对整个矩阵进行简化表达,使用三个32位的uint32_t变量来表示整个矩阵。我们将上述数组按照4位一组转换成16进制数,从而简化了代码的复杂性,如下:

Image7-2.png

        在主体循环中,我们使用matrix.loadFrame()函数来驱动LED矩阵,这种方法使得代码更加简洁和优雅。Frame表示已经把整个图像框起来打包好了,是一个整体。

        在浏览例程时,我们注意到“GameOfLife”例程提供了动态效果的实现。受此启发,我们制作了一个动态点亮笑脸图案的小动画。该动画的原理是随机选择矩阵中的行和列进行点亮或熄灭,然后不断刷新新的Bitmap以展示动态效果。

        为了避免因随机性导致的长时间卡顿,我们引入了一个矩阵来记录已经随机过的位置。这样,下一次遇到重复位置时,我们可以跳过,从而避免了循环中的卡顿。通过统计与目标图案点亮位置相同的个数,一旦匹配完成,即结束随机点亮过程,不必再等待所有位置都被随机遍历一遍了。

        即便如此,有时候最后几个位置还是比较慢才会随机到。主要是C语言很久没使用了,平时写Python和Matlab习惯了,一下子遇到C语言不太会写了,写的非常笨重,循环套循环的,希望大家批评指正。具体代码如下:

#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;

#define ROWS 8
#define COLUMNS 12
#define BITNUM 24

uint8_t Figure[8][12] = {
  { 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, 
  { 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0 },
  { 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1 },
  { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
  { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
  { 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1 },
  { 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0 },
  { 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 }
};

void setup() {
  Serial.begin(115200);
  matrix.begin();

  uint8_t initFigure[ROWS][COLUMNS] = {0};
  uint8_t currentFrame[ROWS][COLUMNS] = {0};
  int count = 0;

  for (int i = 0; i < ROWS*COLUMNS; i++) {
    bool placed = false;
    while (!placed) {
      int row = random(ROWS);
      int col = random(COLUMNS);
      if (initFigure[row][col] == 0) {
        initFigure[row][col] = 1;
        if (Figure[row][col] == 1) {
          currentFrame[row][col] = 1;
          count++;
        }
        placed = true;
      }
      if (count == 30){
        break;
      }
    }
    matrix.renderBitmap(currentFrame, ROWS, COLUMNS);
  }
}

        下图是其随机生成过程中以及快要画完时候的LED矩阵。

Image8-1.png
Image8-2.png

        除了动态图案,我们还尝试了使用LED矩阵显示字符。这主要借助于ArduinoGraphics.h库。在“TextWithArduinoGraphics”例程中,我们学习了如何使用matrix.beginDraw()matrix.endDraw()构建显示框架,并设置了字体大小和内容。通过matrix.textScrollSpeed()函数,我们可以控制字符的滚动速度和方向。具体代码如下:

void loop() {
  matrix.beginDraw();
  matrix.stroke(0xFFFFFFFF);
  matrix.textScrollSpeed(200);
  const char text[] = "    Hello EEWorld!    ";
  matrix.textFont(Font_5x7);
  matrix.beginText(0, 1, 0xFFFFFF);
  matrix.println(text);
  matrix.endText(SCROLL_LEFT);
  matrix.endDraw();
  delay(500);
}

        显示的结果如下:

Image9.png

        综上所述,我们实现了LED矩阵的多种驱动方式和功能。我们将随机生成笑脸图案的代码放在setup()函数中,作为一次性的开屏动画。动画结束后,开发板将循环播放字符串滚动效果。

        具体的实验过程和效果,可参考随附的视频演示。

        

LED点亮+LED点阵驱动

个人签名

就是个臭打游戏


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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