《树莓派项目实战》第四节 用LED点阵显示爱心

Posted ren_meng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《树莓派项目实战》第四节 用LED点阵显示爱心相关的知识,希望对你有一定的参考价值。

第四节 用led点阵显示爱心

4.1 8*8LED点阵简介

4.2 确定点阵引脚编号及引脚所在行列

4.3 将LED点阵连接到树莓派

4.4 编写代码显示爱心


在本节,我们将学习如何用树莓派点亮led阵列显示出一个爱心。该项目涉及到的材料有:

  1. 树莓派 * 1
  2. 8*8 LED阵列 * 1
  3. 杜邦线若干

4.1 8*8LED点阵简介

LED点阵由LED灯(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画或视频。8*8LED点阵共由64个LED灯(发光二极管)组成,且每个LED灯放置在行线和列线的交叉点上。如果阵列每行的阳极连在一起,则该阵列为共阳;反之则为共阴。比如下方左图为共阴点阵,右图为共阳。

若点阵为共阳,将LED灯所在的行给高电平,而所在的列给低电平时,就可以点亮该LED灯;反之若点阵为共阴,将LED灯所在的行给低电平,而所在的列给高电平时,就可以点亮。

假如下图中的LED点阵为共阳,那么要点亮红点所在的LED灯的话,只需给第2行高电平,给第5列低电平即可。

这里有必要一提的是,在实际产品中引脚不会像上图那样规则排列,具体请看下一小节。

4.2 确定点阵引脚编号及引脚所在行列

当拿到一个没有规格说明的点阵时,我们就需要自己来确定引脚编号及其所控制的行列。

首先将侧面带有字那面朝上,引脚那面朝向自己。

上面一排引脚我们编号1-8,下面一排A-H。读者可以发现笔者的点阵上面一排有9个引脚,最左侧那一个其实是多余的,所以上排编号时忽略最左侧那一个。

除了通过以上方式确定引脚编号之外,还有另外一个方法。我们其实可以看到点阵背面的某个引脚旁边有个数字1,代表该引脚是这排的第一个引脚。那么另外一排则编号A-H,与引脚1处于同一列的引脚编号为A。

 注:上面两种方法所确定的引脚编号是相同的。

确定好引脚编号后,我们亮出万用表。用红笔触碰引脚1,然后用黑笔滑过下面一排的各个引脚。此时就会发现某列或某行上的一些LED灯亮了,那么我们就可以知道引脚1是阳极,而且知道它控制哪一行。如果当红笔触碰某一引脚,黑笔滑过另一排引脚时没有任何LED灯亮起,那么红笔触碰的引脚为阴极。那为了确定该引脚所控制的列,就用黑笔触碰该引脚,红笔滑过另一排即可。

测试之后,笔者的各引脚功能如下:

引脚编号阴极阳极控制行列
1阳极第4行
2阳极第2行
3阴极第2列
4阴极第3列
5阳极第1行
6阴极第5列
7阳极第3行
8阳极第6行
A阴极第8列
B阴极第7列
C阳极第7行
D阴极第1列
E阳极第5行
F阴极第6列
G阴极第4列
H阳极第8行

可以发现,控制行的都是阳极,也就是说笔者这个点阵是共阳的。

接下来列出点亮各个LED灯所需要的引脚编号:

第1列第2列第3列第4列第5列第6列第7列第8列
第1行(5, D)(5, 3)(5, 4)(5, G)(5, 6)(5, F)(5, B)(5, A)
第2行(2, D)(2, 3)(2, 4)(2, G)(2, 6)(2, F)(2, B)(2, A)
第3行(7, D)(7, 3)(7, 4)(7, G)(7, 6)(7, F)(7, B)(7, A)
第4行(1, D)(1, 3)(1, 4)(1, G)(1, 6)(1, F)(1, B)(1, A)
第5行(E, D)(E, 3)(E, 4)(E, G)(E, 6)(E, F)(E, B)(E, A)
第6行(8, D)(8,  3)(8, 4)(8, G)(8, 6)(8, F)(8, B)(8, A)
第7行(C, D)(C, 3)(C, 4)(C, G)(C, 6)(C, F)(C, B)(C,  A) 
第8行(H, D)(H, 3)(H, 4)(H, G)(H, 6)(H, F)(H, B)(H, A)

现在如果要点亮第2行第5列的LED灯,我们只需给引脚2高电平,引脚F低电平即可。

4.3 将LED点阵连接到树莓派

笔者这里将1-8引脚分别连到了19、21、23、29、31、33、35和37 GPIO引脚上,将A-H引脚分别连到了18、22、24、26、32、36、38和40 GPIO引脚上。

注:笔者这里为了演示方便,没有添加限流电阻,这样做不推荐。

4.4 编写代码显示爱心

这是一个8*8LED点阵的简化图:

从上面的图可以知道,要点亮一个爱心的话我们需要点亮以下LED灯:

第1列第2列第3列第4列第5列第6列第7列第8列
第1行(5, D)(5, 3)(5, 4)(5, G)(5, 6)(5, F)(5, B)(5, A)
第2行(2, D)(2, 3)(2, 4)(2, G)(2, 6)(2, F)(2, B)(2, A)
第3行(7, D)(7, 3)(7, 4)(7, G)(7, 6)(7, F)(7, B)(7, A)
第4行(1, D)(1, 3)(1, 4)(1, G)(1, 6)(1, F)(1, B)(1, A)
第5行(E, D)(E, 3)(E, 4)(E, G)(E, 6)(E, F)(E, B)(E, A)
第6行(8, D)(8,  3)(8, 4)(8, G)(8, 6)(8, F)(8, B)(8, A)
第7行(C, D)(C, 3)(C, 4)(C, G)(C, 6)(C, F)(C, B)(C,  A) 
第8行(H, D)(H, 3)(H, 4)(H, G)(H, 6)(H, F)(H, B)(H, A)

现在开始编写代码:

import RPi.GPIO as GPIO
 
# 设置编码方式
GPIO.setmode(GPIO.BOARD)
 
# 设置引脚
num1, num2, num3, num4, num5, num6, num7, num8 = 19, 21, 23, 29, 31, 33, 35, 37
numA, numB, numC, numD, numE, numF, numG, numH = 18, 22, 24, 26, 32, 36, 38, 40
pins = [num1, num2, num3, num4, num5, num6, num7, num8,
        numA, numB, numC, numD, numE, numF, numG, numH]
 
# 设置点亮爱心所需要的LED灯
heart = [(num7, numD), (num2, num3), (num2, num4), (num7, numG), (num7, num6), (num2, numF), (num2, numB), (num7, numA), 
        (num1, numA), (numE, numB), (num8, numF), (numC, num6), (numC, numG), (num8, num4), (numE, num3), (num1, numD)]
 
try:
    # 将引脚设置为输出模式
    for pin in pins:
        GPIO.setup(pin, GPIO.OUT)

    while True:
        for led in heart:
            # 点亮指定位置的LED灯
            GPIO.output(led[0], GPIO.HIGH)
            GPIO.output(led[1], GPIO.LOW)
            
            # 给相关引脚设置相反的电平,相当于灭灯
            GPIO.output(led[0], GPIO.LOW)
            GPIO.output(led[1], GPIO.HIGH)
except KeyboardInterrupt:
    # 释放引脚
    GPIO.cleanup()

1. 设置好1-8和A-H的GPIO引脚。

2. 将点亮爱心所需要的LED灯添加到列表中。

3. 循环列表给第一个元素(行)设置高电平,给第二个元素(列)设置低电平。点亮之后,给相反的电平,相当于重置引脚。当然我们通过GPIO.cleanup(led)也能做到相应效果,不过释放引脚的的话,程序性能会更低。

4. 程序可以通过KeyboardInterrupt即Ctrl+C来停止。

运行视频如下:

树莓派用8*8LED点阵显示爱心

以上是关于《树莓派项目实战》第四节 用LED点阵显示爱心的主要内容,如果未能解决你的问题,请参考以下文章

《树莓派项目实战》

树莓派系列三(max7219 led点阵)

Arduino实现8*8LED点阵显示爱心显示和Proteus仿真

香菇大棚温湿度监测项目---及CPE架设监控安装等

《树莓派项目实战》第五节 使用Nokia 5110液晶屏显示Hello World

《树莓派项目实战》第五节 使用Nokia 5110液晶屏显示Hello World