首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

树莓派 SAKS 扩展板上手把玩 之 绚丽的流水灯

树莓派 SAKS 扩展板上手把玩 之 绚丽的流水灯


本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。
本节将以绚丽、有趣的流水灯功能为基础,来说明如何通过 GPIO 来玩转 SAKS 扩展板。
SAKS 扩展板配备了8个 LED,这8个 LED 实际上被精心设计为两组,每组4个,一组是与数码管共享GPIO 引脚的透明蓝光 LED。要启用这一组 LED,请先确保 LED 的跳线被置为“ON”。另一组是独享GPIO 引脚的绿、黄、红色 LED。


功能

注释

BOARD
编码

BCM
编码

wiringPi
编码

LED排灯LED-D2第1个LED(蓝)29521
LED-D5第2个LED(蓝)31622
LED-D3第3个LED(蓝)331323
LED-D4第4个LED(蓝)351924
LED-D6第5个LED(绿)27030
LED-D7第6个LED(绿)28131
LED-D8第7个LED(黄)26711
LED-D9第8个LED(红)24810
先试着点亮所有的 LED。要注意,给 SAKS 扩展板上 LED 低电平才能点亮它们,而高电平将会关闭它们。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
#引脚采用BCM编码
GPIO.setmode(GPIO.BCM)
#配置一个数组,依次对应8个灯的引脚BCM编码
pins = [5, 6, 13, 19, 0, 1, 7, 8] #GPIO ports
#定义一个便捷地设置引脚的方法
def setp(n, status='off'):
    if status == 'on':
        GPIO.output(n, GPIO.LOW)
    else:
        GPIO.output(n, GPIO.HIGH)
#遍历数组,将数组中8个LED引脚初始化
for i in pins:
    GPIO.setup(i, GPIO.OUT)
    setp(i, 'off')

try:
    #遍历数组,将数组中8个LED引脚置为ON同时点亮LED
    for i in pins:
        setp(i, 'on')
except:
    print "except"
    GPIO.cleanup()



是不是发现 LED 是被点亮了,本无需点亮的数码管也有一部分被点亮了?这是因为蓝色 LED 和数码管共用了 GPIO 引脚的关系(因为我们在设计 SAKS 时希望尽可能对 GPIO 实现高利用率)。要关掉数码管,只需要将数码管的位选关掉。至于为什么关掉位选就可以,这是数码管的特性。在后面的例程中,我们介绍到数码管时会详细介绍。
加入关掉数码管位选的逻辑之后,程序代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
#引脚采用BCM编码
GPIO.setmode(GPIO.BCM)
#配置一个数组,依次对应8个灯的引脚BCM编码
pins = [5, 6, 13, 19, 0, 1, 7, 8] #GPIO ports
#由于SAKS的蓝色LED和数码管共享引脚,此处将数码管位选关闭,只让信号作用于LED
GPIO.setup(17, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(27, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(22, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(10, GPIO.OUT, initial=GPIO.HIGH)
#定义一个便捷地设置引脚的方法
def setp(n, status='off'):
    if status == 'on':
        GPIO.output(n, GPIO.LOW)
    else:
        GPIO.output(n, GPIO.HIGH)
#遍历数组,将数组中8个LED引脚初始化
for i in pins:
    GPIO.setup(i, GPIO.OUT)
    setp(i, 'off')

try:
    #遍历数组,将数组中8个LED引脚置为ON同时点亮LED
    for i in pins:
        setp(i, 'on')
except:
    print "except"
    GPIO.cleanup()




那么如何让 LED 轮流点亮呢?只需要按照 SAKS 扩展板上 LED 的顺序,依次控制每个 LED 点亮并且同时关闭其它 LED。并通过加入循环,让流水灯周而复始流转。有了上面的基础,稍加思考后开始改进程序代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time
#引脚采用BCM编码
GPIO.setmode(GPIO.BCM)
#配置一个数组,依次对应8个灯的引脚BCM编码
pins = [5, 6, 13, 19, 0, 1, 7, 8] #GPIO ports
#由于SAKS的蓝色LED和数码管共享引脚,此处将数码管位选关闭,只让信号作用于LED
GPIO.setup(17, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(27, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(22, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(10, GPIO.OUT, initial=GPIO.HIGH)
#定义一个便捷地设置引脚的方法
def setp(n, status='off'):
    if status == 'on':
        GPIO.output(n, GPIO.LOW)
    else:
        GPIO.output(n, GPIO.HIGH)
#遍历数组,将数组中8个LED引脚初始化
for i in pins:
    GPIO.setup(i, GPIO.OUT)
    setp(i, 'off')

try:
    #当前即将点亮的LED在数组中的位置
    i = 0
    while True:
        #点亮数组中第i个LED
        setp(pins, 'on')
        #延时0.1秒
        time.sleep(0.1)
        #熄灭数组中第i个LED
        setp(pins, 'off')
        #改变i,使之对应到下一个LED,如果已经是最后一个LED,则对应到第1个LED
        i += 1
        if i == len(pins):
            i = 0
except:
    print "except"
    GPIO.cleanup()



到这里,你已经发现只需要简单的几行代码,就能玩转 SAKS 的 LED 了!在黑夜里,流水灯效果是不是很赞?!
我们后面将介绍更多基于 SAKS 扩展板的有趣的内容,欢迎持续关注!
返回列表