格物致知、诚意正心
迟早,Arduino发烧友总是会遇到点矩阵显示。它是二维图案化的LED阵列,用于表示字符,符号和图像。几乎所有现代户外LED显示器都使用点矩阵。
而且,没有什么比MAX7219 IC更好的选择了。这是控制单个矩阵的简单且有点便宜的方式。此外,它们可以链接在一起,以控制较大项目中的两个或多个点矩阵。
总体而言,它们很有趣,也非常有用,所以让我们开始吧。
MAX7219分支板有几种,其中两种更为流行-一种是通用模块,另一种是FC-16模块。
典型的MAX7219模块包含一个8×8点矩阵显示器和一个MAX7219 LED显示驱动器。让我们一一了解他们。
典型的单色8×8点矩阵单元具有16个引脚,每行8个针脚,每列8个针脚。所有行和列都连接在一起的原因是为了减少所需的引脚数。如果不是这种情况,那么一个8×8点矩阵单元将需要65个引脚,每个LED一个,一个公共阳极或阴极连接器。通过将行和列连接在一起,仅需要16个引脚。这种用较少的引脚控制大量LED的技术称为多路复用(Multiplexing)。
在这种技术中,每一列都在很短的时间内被激活,并且同时通过寻址相应的行来点亮该列上的LED。列的切换速度非常快(每秒几百或数千次),以至于人眼的余辉感知到显示屏已完全点亮。因此,一次最多只能点亮八个LED。
关于多路复用的烦人的事情是,您需要使用8个功率晶体管,并且必须不断刷新显示以保持图像稳定。
输入功能强大的MAX7219芯片,它可以为您完成所有控制和刷新工作。您所要做的就是通过4引脚SPI接口发送串行命令,它将自动处理其余的工作。
它可以完全控制64个单独的LED,包括保持相同的亮度,并允许您使用硬件或软件(或两者)来调整LED的亮度。一旦显示由微控制器更新,MAX7219便负责以800 Hz刷新显示的所有工作。从而消除了微控制器的开销,而这可能会做其他重要的事情。
您甚至可以在节电模式下关闭显示屏,并且在显示屏关闭时仍可以发送数据。另一个好处是,开机时,它会保持LED熄灭,因此在操作的最初几秒钟内不会出现古怪的显示。
MAX7219芯片通过SPI接口进行通信,因此只需3个数据引脚即可连接至微控制器,此外,我们可以使用相同的3根线将多个模块菊花链在一起,以进行更大的显示。
MAX7219芯片允许您使用硬件或软件(或两者)来调节显示器的亮度。为了在硬件水平上调节亮度,MAX7219转接板带有一个电阻(RSet)。
该电阻器负责设置流入LED的电流的上限,从而设置显示器的整体亮度。
下表显示了根据LED矩阵的电压和正向电流应使用的电阻器值。例如,如果您有一个2V 20 mA LED,则您的电阻值将为28kΩ(该值以kΩ为单位)。
本教程后面将介绍通过软件调整亮度。
无论选择哪种模块版本,该模块上都会有两个连接器。
模块一端的中断引脚用于与微控制器通信。
VCC连接到5V。由于显示器的高电流消耗(如果亮度一直升高,最高可达1A),建议直接从外部电源运行,而不是从Arduino的5V电源运行。否则,请确保将亮度保持在50%以下,以使Arduino的稳压器不会过热。
地线 连接到共同点。
DIN标准是数据输入。将其连接到微控制器的任何数字引脚。
CS /负载是片选(有时标记为LOAD)。将其连接到微控制器的任何数字引脚。
时钟是时钟引脚。将其连接到微控制器的任何数字引脚。
当您想以菊花链方式连接显示器时,可以使用模块另一端的分断销。
VCC 连接到下一个模块上的5V。
地线 连接到下一个模块的GND。
DOUT 是数据输出,并连接到下一个模块的DIN引脚。
CS /负载 连接到下一个模块上的CS / LOAD。
时钟 连接到下一个模块上的CLK。
既然我们了解了有关模块的所有知识,就可以开始将其连接到Arduino了!
首先,为模块供电。因为显示屏消耗大量电流,所以我们将通过外部电源而不是Arduino板的5V电源运行模块。如果要使用单个MAX7219模块,则可以直接从Arduino给模块供电,但是如果可以的话,请避免使用它。
现在,我们只剩下用于SPI通信的引脚了。由于MAX7219模块需要大量数据传输,因此当连接至微控制器上的硬件SPI引脚时,它将提供最佳性能。硬件SPI引脚比软件SPI快得多。
请注意,每个Arduino开发板都有不同的SPI引脚,应相应连接。对于诸如UNO / Nano V3.0之类的Arduino板,这些引脚为数字13(SCK),12(MISO),11(MOSI)和10(SS)。
如果您使用其他Arduino板,建议在继续之前检查有关“ SPI引脚位置”的官方文档。
以下是通用MAX7219模块的实验连接:
以下是FC-16 MAX7219模块的连接:
如果要以菊花链方式连接多个显示器以创建更大的显示器,请将第一个显示器的DOUT连接到下一个显示器的DIN。VCC,GND,CLK和CS将在显示器之间共享。
一旦您的模块连接到Arduino,就该编写一些代码了!
控制MAX7219模块需要大量工作。幸运的是,编写了MD_Parola库来隐藏MAX7219的复杂性,以便我们可以发出简单的命令来控制显示。
要安装库,请导航至“草图”>“包含库”>“管理库…”,等待库管理器下载库索引并更新已安装库的列表。
输入“ max72xx ”过滤搜索。应该有几个条目。寻找MajicDesigns的MD_MAX72XX。单击该条目,然后选择“安装”。
该MD_MAX72XX库是特定于硬件的库,用于处理较低级别的功能。它需要与MD_Parola库配对才能创建许多不同的文本动画,例如滚动和精灵文本效果。也安装此库。
对于我们的第一个实验,我们将在显示器上打印一个没有任何动画的简单文本。
但是在继续上载草图之前,您需要进行一些更改以使其适合您。您必须修改以下两个变量。
第一个变量HARDWARE_TYPE告诉arduino您正在使用哪个版本的模块。
HARDWARE_TYPE
GENERIC_HW
FC16_HW
使用第二个变量,MAX_DEVICES设置要使用的8×8点矩阵显示的数量。8×8矩阵计为1个设备,因此,如果要控制8×32模块,必须将其设置MAX_DEVICES为4(8×32显示屏包含4个MAX7219 IC)。
MAX_DEVICES
完成后,继续尝试草图,然后我们将对其进行详细剖析。
// Including the required Arduino libraries #include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 3 // Create a new instance of the MD_Parola class with hardware SPI connection MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { // Intialize the object myDisplay.begin(); // Set the intensity (brightness) of the display (0-15) myDisplay.setIntensity(0); // Clear the display myDisplay.displayClear(); } void loop() { myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("Left"); delay(2000); myDisplay.setTextAlignment(PA_CENTER); myDisplay.print("Center"); delay(2000); myDisplay.setTextAlignment(PA_RIGHT); myDisplay.print("Right"); delay(2000); myDisplay.setTextAlignment(PA_CENTER); myDisplay.setInvert(true); myDisplay.print("Invert"); delay(2000); myDisplay.setInvert(false); myDisplay.print(1234); delay(2000); }
上载草图后,必须正确调整显示的方向才能看到输出。如果您使用的是通用模块,请调整其方向,使MAX7219 IC位于顶部。如果您使用的是FC-16模块,请调整其方向,以使DIN侧保持在右侧。
如果一切顺利,您将看到以下输出。
第一步是包括所有必需的Arduino库。如前所述,MD_MAX72XX库实现LED矩阵的硬件特定功能,而MD_Parola库实现文本效果。您还必须包括SPI库,该库已预先安装在Arduino IDE中。该库用于通过SPI在显示器和Arduino之间进行通信。
#include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h>
接下来,我们需要指定正在使用的硬件。由于我们在实验中使用的是FC-16模块,因此HARDWARE_TYPE将设置为FC16_HW。我们使用的MAX7219 IC数量为4,因此MAX_DEVICES设置为4。最后,定义了显示器的CS引脚所连接的引脚。
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW #define MAX_DEVICES 4 #define CS_PIN 3
接下来,使用函数创建MD_Parola类的新实例MD_Parola()。此功能需要三个参数,第一个是硬件类型,第二个是CS引脚,第三个是最大连接设备数。
MD_Parola()
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
在代码的设置部分,我们首先使用函数初始化对象begin()。显示屏的亮度可以通过功能进行设置setIntensity()。您可以输入介于0(最小亮度)和15(最大亮度)之间的值。该功能displayClear()清除显示。
begin()
setIntensity()
displayClear()
void setup() { myDisplay.begin(); myDisplay.setIntensity(0); myDisplay.displayClear(); }
在代码的循环部分中,我们首先使用函数设置要打印的文本的对齐方式setTextAlignment()。您可以左,中,右对齐文本用PA_LEFT,PA_CENTER和PA_RIGHT分别。
setTextAlignment()
PA_LEFT
PA_CENTER
PA_RIGHT
接下来,字符串’Left’印有myDisplay.print("Left")。请注意," "由于我们正在打印文本字符串,因此需要在文本周围加上引号。当您要打印数字时,不需要引号。举个例子myDisplay.print(1234)。您也可以使用功能反转显示setInvert()。
myDisplay.print("Left")
" "
myDisplay.print(1234)
setInvert()
void loop() { myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("Left"); delay(2000); myDisplay.setTextAlignment(PA_CENTER); myDisplay.print("Center"); delay(2000); myDisplay.setTextAlignment(PA_RIGHT); myDisplay.print("Right"); delay(2000); myDisplay.setTextAlignment(PA_CENTER); myDisplay.setInvert(true); myDisplay.print("Invert"); delay(2000); myDisplay.setInvert(false); myDisplay.print(1234); delay(2000); }
当您想在点矩阵显示器上打印消息时,通常会发现该显示器太小而无法容纳整个消息。解决方案是使用滚动文本效果。以下示例显示了如何滚动消息。
// Including the required Arduino libraries #include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> // Uncomment according to your hardware type #define HARDWARE_TYPE MD_MAX72XX::FC16_HW //#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // Defining size, and output pins #define MAX_DEVICES 4 #define CS_PIN 3 // Create a new instance of the MD_Parola class with hardware SPI connection MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); void setup() { // Intialize the object myDisplay.begin(); // Set the intensity (brightness) of the display (0-15) myDisplay.setIntensity(0); // Clear the display myDisplay.displayClear(); myDisplay.displayScroll("Hello", PA_CENTER, PA_SCROLL_LEFT, 100); } void loop() { if (myDisplay.displayAnimate()) { myDisplay.displayReset(); } }
如果一切正常,您将看到以下输出。
您会注意到,设置部分末尾的代码的第一部分与前面的示例完全相同。在设置部分的末尾,将displayScroll()使用该功能。
displayScroll()
myDisplay.displayScroll("Hello", PA_CENTER, PA_SCROLL_LEFT, 100);
如您所见,此函数采用四个参数:displayScroll(pText,align,textEffect,speed)
pText
align
textEffect
speed
除此之外,在循环部分中,仅使用两个函数来创建滚动文本。首先,我们displayAnimate()在if语句中使用该函数。此函数滚动文本,并在滚动完成后返回true。滚动完成后,我们使用功能重置显示displayReset(),以便我们连续滚动。
displayAnimate()
if
displayReset()
void loop() { if (myDisplay.displayAnimate()) { myDisplay.displayReset(); } }
有关其他文本效果,请访问github上的MD_Parola库参考。
rreference:
Interfacing MAX7219 LED Dot Matrix Display with Arduino
您的电子邮箱地址不会被公开。 必填项已用 * 标注
评论 *
显示名称 *
电子邮箱地址 *
网站
在此浏览器中保存我的显示名称、邮箱地址和网站地址,以便下次评论时使用。