我希望能够使用 Arduino 控制大约 100 个独立的 LED。问题是 Arduino 没有足够多的引脚可以为此配置。有什么方法可以解决这个问题?是否有一种芯片可以从 Arduino 解复用更复杂的信号,然后可以控制 LED?还是有其他解决方案?
从 Arduino 获取大量(约 100 个)数字输出信号
首先,Arduino 不能直接驱动 100 个 LED,因为设备必须提供或吸收的组合电流将远远超过微控制器和 Arduino 板上的稳压器。不过,具有自己的电源和法规的定制 Arduino Shield可能符合要求。
有几种简单的方法,最简单的方法详述如下:
级联配置中的TLC5940恒流 LED 驱动器:
TLC5940 每个 IC 驱动 16 个 LED,由串行输入通过稍微变体的 SPI 接口控制。最多可以级联 40 个 TLC5940 器件,但其中 7 个足以驱动问题中的 100 个 LED。
建议从 Arduino 发送的时钟频率,以及相应的刷新率:
- 1 MHz GSClk 使用此线程中的代码。
- 330 KHz SCLK(串行数据时钟)
- 因此,LED 数据刷新率 244 Hz
这是基于数据表中的公式:
f(GSCLK) = 4096 * f(update)
f(SCLK) = 193 * f(update) * n
其中:
f(GSCLK):GSCLK 所需的最低频率
f(SCLK):SCLK 和 SIN 所需的最低频率
f( update):整个级联系统的更新率
n:级联的 TLC5940 设备数量
TLC5940 是一个恒定电流吸收器,因此 LED 的阳极将连接到比 LED Vf 大几伏或大约 7 伏(以较低者为准)的电压,独立于 Arduino 的电源引脚供电。该电压源需要能够提供 100 *(无论您以何种电流运行 LED),但可以是未调节的电源。
LED 阴极连接到相应 TLC5940 IC 的驱动线。
TLC5940 本身在数据写入期间每个设备消耗高达 Icc = 60 mA,因此从 Arduino 为其中的 7 个供电将不起作用,它将需要提供独立的 3.3 至 5 伏稳压 Vcc,理想情况下与正在使用的 Arduino 的 Vcc,当然,地线需要连接回 Arduino 的地。在与 Arduino 不同的电压下操作 TLC 部件会导致需要对串行信号进行电平转换,因此最好避免。
几个YouTube 视频演示了如何将 Arduino 与级联 TLC5940 IC 结合使用。
MAX7219 (串行) / MAX7221 (SPI) 8位LED显示驱动器:
虽然这些 IC 设计用于驱动 7 段数字 LED 显示器,但它们提供单独的 LED 控制,因此每个 IC 最多可用于 64 个 LED。其中两个可以级联以驱动所需的 100 个 LED。数据表的第 13 页显示了级联配置。
对于这种设计,LED 必须以最多 8 个 LED 为一组进行电气连接,每个 LED 共享一条阴极线(共阴极)。
MAX7219/7221 是多路复用 LED 驱动器,因此 LED 的最大亮度将低于上一节中静态 LED 驱动器的最大亮度。
这是一个有用的 LED 矩阵库和使用 MAX7219 的指南。
一些相关的 YouTube 视频 ( 1 , 2 ) 可能很有趣。
Charlieplexing: SPI LED 驱动器,MAX6950 / MAX6951
同样,这些 IC 设计用于驱动 7 段数字 LED 显示器,它们提供单独的 LED 控制,因此每个 IC 最多可用于 40 / 64 个 LED。其中两个/三个可以连接到 Arduino SPI 总线上,以驱动所需的 100 个 LED。
设计说明与上一节相同。此外,单个 LED 的最大亮度将低于 MAX7219 的直接多路复用设计。
有一些YouTube 视频可能会引起您的兴趣。
分立元件设计、移位寄存器、IO 扩展器、带有独立控制器的可切割 LED 灯条等等……
这些都是以不同程度的简单和成功使用的方法。它们是比上述 3 种方法更复杂的实现,因此不再详述。如果需要,搜索网络会为这些方法提供有用的指南。
这种设计的一个关键刺激因素是每个 LED 或 LED 串上都需要电流控制电阻器。专门为 LED 驱动设计的设备通常不需要这个。
我对最后一组选项没有个人经验,因此无济于事。
脚注:在回答这个问题后,我发现了一个较旧的问题,该问题的答案详细说明并讨论了我上一节中的几种方法。该线程使有趣的“进一步阅读作为家庭作业”。