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

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

本节将以绚丽、有趣的流水灯功能为基础,来说明如何通过 GPIO 来玩转 SAKS 扩展板。
SAKS 扩展板配备了8个 LED,由一片74HC595芯片驱动,该芯片的使用方法查看这里。我们已经将该驱动封装在SAKS SDK中,要在SAKS上实现原文中的流水灯效果变得异常简易。而下面我们将介绍在不使用SDK的情况下如何驱动LED组以便大家能对LED组的操作原理有深入理解。

功能

BOARD
编码

BCM
编码

wiringPi
编码

LED排灯
74HC595
DS 31 6 22
SHCP 35 19 24
STCP 33 13 23

完整代码如下:

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
 
DS = 6
SHCP = 19
STCP = 13
 
def init():
    GPIO.setup(DS, GPIO.OUT)
    GPIO.setup(SHCP, GPIO.OUT)
    GPIO.setup(STCP, GPIO.OUT)
 
    GPIO.output(DS, GPIO.LOW)
    GPIO.output(SHCP, GPIO.LOW)
    GPIO.output(STCP, GPIO.LOW)
 
def writeBit(data):
    GPIO.output(DS, data)
 
    GPIO.output(SHCP, GPIO.LOW)
    GPIO.output(SHCP, GPIO.HIGH)
 
#写入8位LED的状态
def writeByte(data):
    for i in range (0, 8):
        writeBit((data >> i) & 0x01)
    #状态刷新信号
    GPIO.output(STCP, GPIO.LOW)
    GPIO.output(STCP, GPIO.HIGH)
 
try:
    init()
    while True:
        #以下一组8个编码由一组二进制转换而成:
        #00000001,00000010,00000100,00001000,00010000,00100000,01000000,10000000
        #分别对应8个LED点亮状态
        for i in [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80]:
            writeByte(i)
            time.sleep(0.1)
        #LED组全开
        #writeByte(0xff)
        #time.sleep(0.1)
 
except KeyboardInterrupt:
    print "except"
    #LED组全关
    writeByte(0x00)
    GPIO.cleanup()

在终端运行下载本教程的源码库并进入到对应的源码目录,执行运行脚本的指令可看到效果:

sudo git clone https://github.com/spoonysonny/SAKS-tutorials.git
cd SAKS-tutorials/water-lights
sudo python waterlights.py

到这里,你已经发现只需要简单的几行代码,就能玩转 SAKS 的 LED 了!在黑夜里,流水灯效果是不是很赞?!

我们后面将介绍更多基于 SAKS 扩展板的有趣的内容,欢迎持续关注!

本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:http://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials