💡
Raspberry Piと74HC595でLEDを複数制御する
電子工作してみたいなあと思い下記の入門キットを購入しました。
セットの中に74HC595が入っていたので今回はそれで8個のLEDを制御してみます。74HC595とは
74HC595とはシフトレジスタと呼ばれるICです。LED1個を点灯させるためには入力が1つ必要になります。8個点灯させるためには8個入力が必要になりますがシフトレジスタを利用することで少ない入力でより多くのLEDを操作することができるようになります。
このICの入出力や原理はこちらのサイトが非常に参考になりました。
RaspberryPiとの接続
今回作成した回路です。このICを使った他の記事だとSRCLRは電源に接続することが多いですが、手元の環境だと動作がかなり不安定になってしまったので初回にLOW→HIGHTで入力していきます。
抵抗は330Ωのものを利用しています。また、ラズパイからの電源供給だと動作が不安定になってしまったため、購入したキットに入っていたHW-131という電源モジュールを別途利用しています。
74HC595とラズパイは以下のように接続していきます。
74HC595 | ラズパイ |
---|---|
SER | GPIO26 |
RCLK | GPIO19 |
SRCLK | GPIO13 |
SRCLR | GPIO6 |
Lチカしてみる
今回は2進数でカウントアップをしていくように光らせていきます。
各入力の制御は上記のサイトの図11を参考にしています。
main.py
import RPi.GPIO as GPIO
import time
SER = 26
RCLK = 19
SRCLK = 13
SRCLR = 6
GPIO.setmode(GPIO.BCM)
GPIO.setup(SER, GPIO.OUT)
GPIO.setup(SRCLK, GPIO.OUT)
GPIO.setup(RCLK, GPIO.OUT)
GPIO.setup(SRCLR, GPIO.OUT)
# 8ビットデータを送る関数
def shiftOut(value):
for i in range(0, 8):
bit = (value >> i) & 0x01
GPIO.output(SER, bit)
GPIO.output(SRCLK, GPIO.HIGH)
GPIO.output(SRCLK, GPIO.LOW)
# シフトレジスタを更新する関数
def updateShiftRegister(value):
GPIO.output(RCLK, GPIO.HIGH)
GPIO.output(RCLK, GPIO.LOW)
shiftOut(value)
try:
GPIO.output(SRCLR, GPIO.HIGH)
GPIO.output(SRCLR, GPIO.LOW)
GPIO.output(SRCLR, GPIO.HIGH)
while True:
for i in range(0,256):
updateShiftRegister(i)
time.sleep(0.1)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
参考
Discussion