风筝
发表于: 2019-8-7 10:24:19 | 显示全部楼层

Charlieplexing(查理复用算法)是一种使用少量I / O引脚控制许多LED的技术。 Charlieplexing与多路复用相同,但它使用三态逻辑(高、低输入)来显着减少引脚数并提高多路复用效率。 Charlieplexing技术以其发明者Charlie Allen命名,他于1995年发明了该技术。


Charlieplexing允许您控制N *(N  -  1)个LED,其中N是引脚的编号。例如,您可以使用4个Arduino引脚4 *(4-1)= 12来控制12个LED。 LED是二极管,而在二极管中,电流仅在一个方向上流动。因此,在Charlieplexing中,我们将两个LED彼此并联连接,但极性相反,因此一次只能打开一个LED。对于Arduino或其他微控制器板,您没有足够的输入/输出引脚。如果您正在开发一个需要连接LCD显示器、一堆LED和一些传感器的项目,那么您已经没有引脚了。在这种情况下,您可以Charlieplex LED以减少引脚数量。


在本篇文章中,我们将使用Charlieplexing技术使用4个Arduino引脚控制12个LED。


需要的组件

●    Arduino UNO开发板

●    12个LED指示灯

●    4个电阻(330欧姆)

●    跳线

●    面包板


电路原理图

Circuit-Diagram-for-Charlieplexing-Arduino-Controlling-12-LED-with-4-GPIO-Pins.png

在该电路图中,12个LED通过电阻与4个Arduino引脚连接。 Arduino的每个引脚都连接三个LED。有六组LED,每组中连接2个LED,两个LED彼此平行但极性相反,因此一次只能打开一个LED。因此根据电路图,点亮LED1时,需要在引脚A上有一个HIGH信号,在引脚B上需要一个LOW信号,并且需要断开引脚C和D。其他LED将遵循相同的步骤。下面给出了每个LED的引脚设置的完整表格:

LED编号
引脚8
引脚9
引脚10
引脚11
1
HIGH
LOW
INPUT
INPUT
2
LOW
HIGH
INPUT
INPUT
3
INPUT
HIGH
LOW
INPUT
4
INPUT
LOW
HIGH
INPUT
5
INPUT
INPUT
HIGH
LOW
6
INPUT
INPUT
LOW
HIGH
7
HIGH
INPUT
LOW
INPUT
8
LOW
INPUT
HIGH
INPUT
9
INPUT
HIGH
INPUT
LOW
10
INPUT
LOW
INPUT
HIGH
11
HIGH
INPUT
INPUT
LOW
12
LOW
INPUT
INPUT
HIGH

连接后,硬件如下图所示。从图像中可以看出,有六组LED,每组中有两个LED彼此相对连接。 Arduino UNO模块由USB端口供电。

Circuit-Hardware-for-Charlieplexing-Arduino-Controlling-12-LED-with-4-GPIO-Pins.jpg


代码说明

本篇文章结尾处给出了完整代码,这里我们将解释完整的程序,以了解项目的工作情况。


在Arduino代码的开始部分中,先定义LED连接的所有引脚。之后,定义LED总数和LED状态。

  1. #define A 8
  2. #define B 9
  3. #define C 10
  4. #define D 11
  5. #define PIN_CONFIG 0
  6. #define PIN_STATE 1
  7. #define LED_Num 12
复制代码

现在创建一个用于按顺序打开和关闭LED的数组,您可以通过更改引脚状态和引脚配置来更改序列。根据这个矩阵,首先打开LED1然后再打开LED2,依此类推。

  1. int matrix[LED_No.][2][4] = {
  2.   //           PIN_CONFIG                  PIN_STATE
  3.   //            A             B              C          D                    A        B        C        D
  4.   { { OUTPUT, OUTPUT, INPUT, INPUT }, { HIGH, LOW, LOW, LOW } },
  5.   { { OUTPUT, OUTPUT, INPUT, INPUT }, { LOW, HIGH, LOW, LOW } },
  6.   { { INPUT, OUTPUT, OUTPUT, INPUT }, { LOW, HIGH, LOW, LOW } },
  7.   …………………………….
  8. ……………………………..
复制代码

void loop函数内,程序将执行LED_COUNT矩阵以按给定顺序打开和关闭LED。

  1. void loop() {
  2.   for( int l = 0; l < LED_Num; l++ ) {
  3.     lightOn( l );
  4.     delay( 1000 / LED_Num );
  5.   }
复制代码

现在将Arduino连接到笔记本电脑并正确选择开发板和端口,然后单击上传按钮。上传代码后,LED应开始闪烁。

Testing-Charlieplexing-Arduino-Controlling-12-LED-with-4-GPIO-Pins.jpg


以上就是Charlieplexing技术如何用于使用更少的Arduino引脚来控制许多LED。您可以使用此方法来控制更多LED。例如,如果要控制20个LED,只需编辑数组并添加剩余的LED。


代码

本文使用的完整代码如下所示: main.rar (479 Bytes, 下载次数: 60)

跳转到指定楼层
feihe12
发表于: 2020-7-30 14:27:26 | 显示全部楼层

楼主你这个主程序的头文件有吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-20 21:49 , Processed in 0.150722 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表