雷竞技注册
技术文章

与Arduino驾驶LED阵列

2016年7月11日经过Cezar Chirila

所有您需要了解LED阵列。如果您想了解它们,请使用Arduino驱动一个,或者构建它们,这是一个开始的地方。

了解LED阵列的基础知识以及如何使用微控制器为它们供电。

如果你想了解LED显示屏的工作原理以及如何使用微控制器为其供电,那么你来对地方了。在这篇技术文章中,我将教你什么是LED阵列,LED是如何连接的,以及如何使用微控制器有效地驱动它们。我将使用Arduino作为一个例子。

LED阵列

首先,什么是LED阵列?

基本上,通过每个单独的像素显示它们是发光二极管。这些阵列广泛用于广告牌,交通灯,商店标志和总线目的地,因为它们非常可靠,消耗低量的能量,并且易于管理。

更大的显示器通常由多个模块构建,每个模块都有自己的控制器IC。其中一个最常见的LED阵列是应用程序中使用的七段显示,您只需要显示数字,例如时钟。例如,在项目中“用Atmega8的私人焊接站”,我使用了三个七段LED阵列显示并设置烙铁的温度。

里面是最重要的

为了了解LED阵列是如何工作的,以及如何为它们供电,我们首先需要了解内部的LED是如何连接的。

你可能认为每个LED都有一个共同的阳极或阴极,我们从一个微控制器引脚驱动每个LED。这对于一个简单的个位数7段显示器来说是一个合理的假设,但是随着阵列中led的数量的增加,由于单个led的大量连接,这个方案变得有问题。让我们以一个标准的8x8 LED矩阵为例:如果每个LED都有单独的连接,我们将需要64个输出来控制显示。这绝对不现实。

下面是LED阵列实际建造的示意图:

同一行上的LED使阳极连接在一起,同一列上的LED具有共同的阴极。当然,不同的模块可以具有切换阴极和阳极连接。

我们现在只有16个连接:每个行和列一个。当我们想要点亮像素时,我们将电源应用于其特定的行和列。例如,如果我们想打开LED [1,1],我们为第一列提供了一个接地连接,并将电流驱动到第一行。(在本文中使用的格式是LED [行,列]。)

然而,当我们想要同时点亮更多led时,问题就出现了。

为LED阵列供电

让我们继续使用相同的8x8 LED矩阵。我谈到了我们如何控制每个LED,但是当我们想要点亮多个像素时出现问题,而无需照亮共享相同阳极和阴极连接的其他像素。

在下面的gif动画中,你会明白我的意思。我想打开LED[1,1]和LED[2,2]。不幸的是,LED[1,2]和LED[2,1]也会点亮,形成一个正方形而不是一条线。

我们如何解决这个问题?

简单。我们只是在一个时间里驱动一个像素,我们做得如此之快以至于人眼无法分辨出其中的区别。为了更有效率,我们甚至可以一次驱动一行而没有任何问题。

对于上面的矩阵,例如,我们一次扫描每个行。这意味着我们打开整个第一行,看看需要打开的LED,并将我们想打开像素的列。然后我们去下一个行,然后做同样的事情,直到我们到达最后一行并重新开始。此重复称为“刷新”,并且在秒中发生的次数称为“刷新率”,其在赫兹中测量。

这基本上是大多数显示工作。注意,其中一些更复杂,例如电视和监视器,其中像素保持其照明状态,并且控制器一次驱动多行。

使用Arduino为8x8 LED矩阵供电

我们已经讨论了行扫描,其中一个整行被启用,并且通过接地柱打开LED。您还可以使用列扫描,其中整个列接地,通过向各个行应用电压接地,LED接通。我为本文构建的电路为您提供了一个列扫描的示例。

我们将使用一个8x8 LED矩阵,ATmega328微控制器,一些无源组件,移位寄存器(74HC595D, TPIC6B596),和Arduino IDE。如果需要,可以使用Arduino Uno板或变体。

BOM:

  • ATmega328
  • LED 8x8矩阵(我使用过ld - 1088 b但是你需要检查你的特定矩阵的引脚)
  • 2x22pf电容器(这是一个暂定值;您需要在水晶的数据表中查看,然后计算这些负载电容器的适当值)
  • 16MHz石英晶体
  • 10K,8x200OHM(用于矩阵)电阻器
  • 74HC595D
  • TPIC6B596
  • 100nF, 100uF 16V电容器(用于电源滤波)
  • TimerOne图书馆

只需遵循下面的示意图,或者将LED矩阵驱动电路(示意图的右半部分)分开地,并通过5根(VCC,地,数据,时钟和锁存器)将其连接到Arduino Uno或Variant。如果驱动电路通过电线连接,则在每个集成电路的电源引脚附近包括100NF滤波电容是一个好主意。

小心注意您的特定LED矩阵的引脚。将100NF和100UF电容器放在VCC和地之间的微控制器附近;检查较大电容器的极性 - 外壳应指示哪个铅是负的,并且该负极引线必须连接到地。电阻器R1至R8是全部200欧姆的,但您需要根据以下公式按照LED阵列的规格调整它们的大小:

\ [r = \ frac {5v-v_ {LED}} {I_ {LED}} \]

在V引领是典型的正向电压和I引领是期望的正向电流。

现在让我们分析这个电路如何工作。我们有一个微控制器,两个移位寄存器和LED阵列。两个班次寄存器是菊花链;这意味着它们在另一个之后连接。在74HC595D接收到8位之后,以下推用首先发送到TPIC6B596的比特。

移位寄存器每次从微控制器接收两个字节的串行数据。它们首先表示要打开的列,其次表示要打开的行。串行数据被转换为并行数据,引脚QA到QH,引脚Q0到Q7是连接到LED阵列的输出。

每个数据位表示每个输出引脚的状态:1 = Vcc在TPIC6B596的情况下为74HC595D和1 =接地(这是TPIC6B596的情况,因为每个输出实际上是N沟道的漏极MOSFET和该位命令它的门)。

这里有一个例子。假设我们想要打开LED[2,1]。我们首先发送列字节B00000001,然后发送行字节B00000010,它将第一个字节压入TPIC6B595,使第一列接地,第二字节(B00000010)将VCC应用于第二行,因此LED[2,1]是亮的。(这些二进制数字对应于二进制位在移位寄存器中的结束方式;最低有效位对应74HC595D的QA和TPIC6B596的Q0。)

您可以下载代码。别忘了下载TimerOne图书馆

PoweringLEDarraysV1.1.zip

TimerOne库用于以特定的间隔调用函数。我们用它来精确地控制刷新率。这里我们可以看到它的实际操作:

void setup(){... timer1.initialize(2000);timer1.attachinterrupt(screenupdate);}

在这部分中,我们初始化Timer1,我们指定了时间段微秒。这个时间段是一个列在扫描下一个列之前保持启用状态的时间。每过一次这个周期,我们就调用“screenUpdate”函数。要计算刷新率,总周期要大8倍(因为我们有8列)。在这里您可以看到我设置了2000µs的周期,这对应于62.5Hz的刷新率。

\ [f = \ frac {1} {t} = \ frac {1} {2 \ cdot 10 ^ {-3} s \ cdot 8} = 62.5hz \]

“screenupdate()”功能是将数据发送到移位寄存器的函数。它从第一列开始(B00000001),并读取图案的第一个字节。然后它使用“ShiftOut()”函数,该功能包含在标准的Arduino库中,发送这两个字节。列字节中的“1”移位,然后读取图案的第二个字节等,直到它到达最后一列(B10000000)。在此之后,列字节返回到B00000001,并且该过程重复自身。

要编辑显示模式,只需编辑“Patterns.h”文件,并更改每个模式的时间段,更改“间隔”变量的值。

这是我的快速构建:

结论

我希望这涵盖了LED阵列的基础知识,现在你现在已经了解他们如何工作以及如何使用它们。

说了这么多,你还在等什么?去买一些LED矩阵,或者更好的是,自己构建一个或多个(你有上面的原理图),并开始使用它们。你可以很容易地制作物联网显示器、LED咖啡桌或Daft Punk头盔。

如果你对你的项目需要任何帮助或建议,请在下面留下评论,我会尽我最大的努力回复你。

2评论
  • S.
    sureshqaz 2020年12月30日

    我有一个关于MC9S08QD4的疑问
    这是IC内部复位和IRQ引脚
    如何运作以及我们如何启用它们
    考虑到数据表中的数据,对于电路的GPIO引脚,每个引脚的最大额定电流为25mA
    因此,在使用IC拍摄电压时输入驱动器两种LED,IF any and any any and state(是或否条件)
    仅LED所需的电流应被视为电流消耗或任何其他考虑因素。
    有人能帮我一下吗

    喜欢的。 回复
  • 一种
    Antoine Bourricat 2021年2月22日

    我必须控制几个(在3到7之间)单色彩色LED的数组。我想一次决定每个人的强度,我知道哪个波长对我来说。它必须是自动的。
    你能用微控制器建议安装吗?

    喜欢的。 回复