LEDバーグラフ
LEDバーグラフの例はこちらで示したが、点滅させるLEDの数だけGPIOポートを使った。シフトレジスターを使えば、データに関してはシリアル信号1本だけで済む。以下はシフトレジスター74HC595を使った回路例。
各LEDの点滅の制御は以下の流れ。
- LEDの個数分以下を処理
- SERに点灯ならHIGH、消灯ならLOWを入力
- SRCLKにHIGHを入力してシフト後、LOWに
- RCLKをHIGHにして、QA~QHの出力をLEDに流す
- 全消灯するときはSRCLKをLOWにしてからHIGHに戻す
以下はこの回路をRuspberry PiのMicro Pythonで制御するコード例。
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import RPi.GPIO as GPIO import time # Constants of GPIO port numbers in BCM SER = 17 RCLK = 27 SRCLK = 10 SRCLR = 9 # LED light patterns patterns = [0b10000000, 0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001, ] def destroy(): # Clear all FlipFlops and registers GPIO.setup(SRCLR, GPIO.OUT, initial=GPIO.LOW) time.sleep(0.001) GPIO.setup(SRCLR, GPIO.OUT, initial=GPIO.HIGH) GPIO.cleanup() # Initializing block GPIO.setmode(GPIO.BCM) GPIO.setup(SER, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(SRCLK, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(SRCLR, GPIO.OUT, initial=GPIO.HIGH) GPIO.setup(RCLK, GPIO.OUT, initial=GPIO.LOW) # Clear all GPIO.output(SRCLR, GPIO.LOW) time.sleep(0.01) GPIO.output(SRCLR, GPIO.HIGH) try: while True: # Read each lighting pattern for pattern in patterns: # Set a pattern to shift register and light LEDs for n in range(8): # Set each bit to shift register LSB to MSB # Thus, lighting pattern is set right to left bit = (pattern >> n) & 1 GPIO.output(SER, GPIO.HIGH if bit else GPIO.LOW) GPIO.output(SRCLK, GPIO.HIGH) #time.sleep(0.001) GPIO.output(SRCLK, GPIO.LOW) # Write FlipFlops to storage register to parallel output GPIO.output(RCLK, GPIO.HIGH) #time.sleep(0.001) GPIO.output(RCLK, GPIO.LOW) time.sleep(0.1) except KeyboardInterrupt: destroy() |
SRCLK/RCLKでHIGH/LOWに変化させた後、それぞれLOW/HIGH戻すまでに0.001秒待たせているが、これがなくても動作はする。