怎样用LED矩阵作为扫描仪

电子说

1.3w人已加入

描述

步骤1:此版本中使用的部件

LED矩阵

LED矩阵

对于这个项目,我使用了以下组件:

带面包板的Arduino Uno

32x32 RGB LED矩阵(来自AdaFruit或Tindie)

5V 4A电源适配器(来自AdaFruit)

母DC电源适配器2.1mm插孔至螺丝接线端子(来自AdaFruit)

透明的3mm TIL78光电晶体管

跳线

AdaFruit还销售Arduino屏蔽,可用于代替跳线。

和我一样有一些Tindie学分,我从Tindie得到了我的矩阵,但是AdaFruit的矩阵看起来是相同的,所以任何一个都应该有用。

光电晶体管来自我几十年前的零件系列。它是一个明显的3mm部分标记为TIL78。据我所知,该部件适用于红外线,可以是一个透明的外壳或一个阻挡可见光的黑暗外壳。由于RGB LED矩阵发出可见光,因此必须使用透明版本。

此TIL78似乎已经停产,但我想这个项目可以使用现代光电晶体管制作。如果你发现有用的东西,请告诉我,我会更新这个Instructable!

第2步:连接和测试光电晶体管

LED矩阵

通常,你需要一个与光电晶体管串联的电阻,但是我知道Arduino能够在任何引脚上启用内部上拉电阻。我怀疑我可以利用它将光电晶体管连接到Arduino,而无需任何额外的组件。事实证明我的预感是正确的!

我用电线将光电晶体管连接到Arduino上的GND和A5引脚。然后我创建了一个草图,将A5引脚设置为INPUT_PULLUP。这通常用于开关,但在这种情况下它为光电晶体管供电!

#define SENSOR A5

void setup() {

Serial.begin(9600);

pinMode(SENSOR, INPUT_PULLUP);

}

void loop() {

// Read analog value continuously and print it

Serial.println(analogRead(SENSOR));

}

此草图将值打印到与环境亮度对应的串行端口。通过使用Arduino IDE“工具”菜单中的便捷“串行绘图仪”,我可以获得环境光的移动图!当我用手盖住并打开光电晶体管时,图表会上下移动。很好!

这个草图是检查光电晶体管是否以正确极性接线的好方法:光电晶体管在一个方向与另一个方向连接时会更敏感。

步骤3:将矩阵带状电缆连接到Arduino

LED矩阵

要将矩阵连接到Arduino,我浏览了Adafruit的这本方便指南。为方便起见,我将图表和引脚分布粘贴到文档中并打印了一个快速参考页面,以便在连接所有内容时使用。

注意确保连接器上的选项卡与图中的选项卡匹配。

或者,对于更清洁的电路,您可以使用AdaFruit为这些面板销售的RGB矩阵屏蔽。如果使用屏蔽,则需要焊接光电晶体管的插头或电线。

步骤4:连接矩阵

LED矩阵

LED矩阵

LED矩阵

我将矩阵电源线上的叉形端子拧到插孔适配器上,确保极性正确。由于部分端子暴露在外,为了安全起见,我用电工胶带将整个部件包起来。

然后,我插上电源连接器和带状电缆,注意不要打扰电源线中的跳线。过程

步骤5:安装AdaFruit矩阵库并测试矩阵

LED矩阵

您需要安装“RGB矩阵面板”和AdaFruit“ Adafruit GFX Library“在您的Arduino IDE中。如果你需要帮助,这个教程是最好的方法。

我建议你运行一些例子,以确保你的RGB面板在继续之前工作。我建议使用“plasma_32x32”示例,因为它非常棒!

重要提示:我发现如果在插入5V电源到矩阵之前我给Arduino上电,矩阵会朦胧地亮起来。似乎矩阵试图从Arduino中获取力量,这绝对不利于它!因此,为了避免Arduino过载,请在启动Arduino之前启动矩阵!

步骤6:加载Matrix扫描码

LED矩阵

现在,加载Arduino草图以扫描矩阵。我提供了Arduino源代码。加载后,您应该会看到每隔几秒闪烁一次光的闪光。

如果您将光电晶体管靠近矩阵,您应该会看到光电传感器附近的LED亮起。

尝试进一步移动光电晶体管,使其更接近矩阵,看看它的行为就像手电筒一样。如果你将一个物体放在矩阵上并将光电晶体管放在它上面,你应该能够捕捉到物体的“阴影”!

你可以在代码中找到一些参数:

static constexpr uint8_t READINGS_PER_PIXELS = 1;

static constexpr uint8_t THRESHOLD = 15;

static constexpr bool INVERT = false;

static constexpr bool CLEAR = true;

如果检测效果不佳,您可以尝试增加READING_PER_PIXEL和THRESHOLD。将CLEAR设置为false以获得类似画笔的效果,其中每个新扫描会向画布添加更多“绘画”。对于负效应,将INVERT设置为true,其中矩阵通常点亮,但光电晶体管会使其“看到”变暗。

步骤7:代码如何工作:检测可见对比一个模糊的LED

经过一些实验,我发现从传感器检测像素是否可见的最佳方法是从传感器获取成对的模拟读数:当LED是一个读数时当LED亮起时关闭和另一个读数。如果传感器看不到LED,则读数几乎相同;如果传感器可以看到LED,则读数会有所不同。

为了提高灵敏度,我在使用OE(输出使能)线打开和关闭LED时读取多个读数。我使用两个累加器来总结LED关闭时的读数与LED打开时的读数。然后我将这两个总和之间的差异与阈值进行比较,以确定该值是否超过某个阈值,从而让我决定LED是否在传感器的视线范围内。

步骤8 :代码如何工作:扫描矩阵

为了扫描矩阵,我直接操作数据线,因为这比使用AdaFruit库绘制像素更有效。要禁用AdaFruit库,我会在开始扫描之前关闭中断。由于AdaFruit库通过使用中断工作,这使我可以暂时控制矩阵。

矩阵有六个移位寄存器,对应于整行像素的R,G和B颜色。矩阵的上半部分和下半部分。还有一个锁存控制线(LAT),它将移位寄存器中的值复制到LED驱动器。四条地址线(A,B,C和D)选择上半部分和下半部分的哪些行有效,OE(输出使能)用于打开和关闭LED驱动器。

在正常操作中,当新的替换行移入移位寄存器时,锁存器保持用先前值照亮的行。加载完整行后,将锁定新值,并为下一行重复该过程。这种更新方式需要写入整行,即使只需要写入一个像素。

对于扫描,我选择利用移位寄存器,但不选择锁存功能。我将锁存控制线(LAT)设置为高电平,使得移位寄存器的内容立即在每个CLK脉冲上加载到LED驱动器中。一旦我照亮了第一个像素,时钟线(CLK)上的每个脉冲都会使点亮的像素沿着行向下推到下一个像素。在这样做时,我可以将照亮的像素向下按行以扫描整行。

对于行中的每个位置,我使用OE(输出使能)线来打开和关闭像素。从光传感器获取读数。一旦我有足够的读数来确定该像素是否可见,我就会向AdaFruit库的帧缓冲区写一个颜色(扫描时,我仍然可以将像素值写入库的帧缓冲区,即使库暂时暂停) 。

扫描完所有行后。我重新启用中断,这会导致AdaFruit库使用缓冲区中的数据刷新矩阵,直到我准备好进行下一次扫描。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分