読者です 読者をやめる 読者になる 読者になる
Raspberry Piによる電子工作と断酒の日記 野球関連の日記、読書感想文とか

シフトレジスタでLチカ

こっちが本番

シフトレジスタを使って6つのLEDをチカらせてみた。

まずは配線。

細かいレジスタの話 f:id:hal90000:20170219223330p:plain


SERにHIGH/LOWの信号を突っ込んでSRCLKのポジティブエッジでレジスタに記憶
最大8bit分できる。
そのあと、RCLKにポジティブエッジを出すとQa~QhにSERで突っ込んだHIGH/LOWが飛んでいく。

SERが値
SRCLKがビット演算の>>
RCLKがなんとも言えないがGoサインみたいなもんか。



言葉ではわかりにくいので以下ソースを添付  

import RPi.GPIO as GPIO
from time import sleep

def sendLEDdata(data, ser, rclk, srclk):
    n = len(data)

    GPIO.output(rclk, GPIO.LOW)
    GPIO.output(srclk,GPIO.LOW)

    for i in range(n):
        if data[i] == 1:
            GPIO.output(ser, GPIO.HIGH)
        else:
            GPIO.output(ser, GPIO.LOW)

        GPIO.output(srclk, GPIO.HIGH)
        GPIO.output(srclk, GPIO.LOW)

    GPIO.output(rclk, GPIO.HIGH)
    GPIO.output(rclk, GPIO.LOW)
 
SER = 25
RCLK = 24
SRCLK = 23

GPIO.setmode(GPIO.BCM)
GPIO.setup(SER, GPIO.OUT)
GPIO.setup(RCLK, GPIO.OUT)
GPIO.setup(SRCLK, GPIO.OUT)

LEDdata1 = [0,0,0,0,0,1]
LEDdata2 = [0,0,0,0,1,0]
LEDdata3 = [0,0,0,1,0,0]
LEDdata4 = [0,0,1,0,0,0]
LEDdata5 = [0,1,0,0,0,0]
LEDdata6 = [1,0,0,0,0,0]
LEDdata7 = [1,1,0,0,0,0]
LEDdata8 = [1,1,1,0,0,0]
LEDdata9 = [1,1,1,1,0,0]
LEDdata10 = [1,1,1,1,1,0]
LEDdata11 = [1,1,1,1,1,1]
LEDdata12 = [0,0,0,0,0,0]
try:
    while True:
        sendLEDdata(LEDdata1, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata2, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata3, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata4, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata5, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata6, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata7, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata8, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata9, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata10, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata11, SER, RCLK, SRCLK)
        sleep(0.5)
        sendLEDdata(LEDdata12, SER, RCLK, SRCLK)
        sleep(0.5)
except KeyboardInterrupt:
    pass

sendLEDdata(LEDdata4, SER, RCLK, SRCLK)

GPIO.cleanup()


  解説

SERを25、RCLKを24、SRCLKを23のGPIOに設定

dataの配列の数だけ、dataが1なら1bit(GPIO.HIGH)、以外なら
0bit(GPIO.LOW)をSERに設定。

SRCLKをLOWからHIGHに切り替えて、ポジティブエッジを出して、 SERの値をシフトレジスタに覚えさせる。
でもう一回SRCLKをLOWに切り替える。

これを繰り返す事によりデータを[0] [1,0] [0,1,0] [0,0,1,0][1,0,0,1,0]・・・
みたいに最大8ビットまで覚えさせる事ができる。

設定が終わったらRCLKをHIGHに切り替えてポジティブエッジをだしてストレージレジスタに ビット情報を覚えさせる。
このタイミングでLEDがピカーっと光る。



結果こうなった。




少ない配線でここまで簡単にLEDがチカチカできるのは爽快。
今度は3色LED2台を試してみよう。
んで、色Map作ってLEDも数を増やして簡単な絵とか。
絵心ないんで無理っす(笑)