本文所介绍的内容基于树莓派瑞士军刀扩展板(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 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials