raspberry piと7セグメントLEDで時計を作る

S__13213700
今年も早いもので、一年が終わろうとしています。年末休暇の時間を使って勉強しようと、7セグメントLEDを秋月電子で買ってきました。
raspberrypiとosl40391-IBというLEDを使って時計を作ります。BTTFに出てくるイメージ強いですね。
電子工作は未経験なので試行錯誤しながらでしたが、何とか完成しました。配線はraspberry pi 3と7セグメントLEDで時計を作るや、aitendo 4桁7セグとRTCでデジタル時計をつくってみた。を参考に勉強しました。
pythonも未経験でして、、、コードはHow to drive a 7 segment display directly on Raspberry Pi in Pythonを参考にしました。


# code modified, tweaked and tailored from code by bertwert
# on RPi forum thread topic 91796
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# GPIO ports for the 7seg pins
segments =  (26, 19, 13, 6 ,5, 11, 7)
# 7seg_segment_pins (11,7,4,2,1,10,5,3) +  100R inline
for segment in segments:
GPIO.setup(segment, GPIO.OUT)
GPIO.output(segment, 0)
# GPIO ports for the digit 0-3 pins
digits = (20, 16, 8, 25)
# 7seg_digit_pins (12,9,8,6) digits 0-3 respectively
for digit in digits:
GPIO.setup(digit, GPIO.OUT)
GPIO.output(digit, 1)
num = {' ':(1,1,1,1,1,1,1),
'0':(0,0,0,0,0,0,1),
'1':(1,0,0,1,1,1,1),
'2':(0,0,1,0,0,1,0),
'3':(0,0,0,0,1,1,0),
'4':(1,0,0,1,1,0,0),
'5':(0,1,0,0,1,0,0),
'6':(0,1,0,0,0,0,0),
'7':(0,0,0,1,1,1,1),
'8':(0,0,0,0,0,0,0),
'9':(0,0,0,0,1,0,0)}
try:
while True:
n = time.ctime()[11:13]+time.ctime()[14:16]
s = str(n).rjust(4)
for digit in range(4):
for loop in range(0,7):
GPIO.output(segments[loop], num[s[digit]][loop])
#    if (int(time.ctime()[18:19])%2 == 0) and (digit == 1):
#        GPIO.output(25, 1)
#    else:
#        GPIO.output(25, 0)
GPIO.output(digits[digit], 1)
#time.sleep(0.0001)
time.sleep(0.0004)
GPIO.output(digits[digit], 0)
finally:
GPIO.cleanup()


tryの中で一秒ごとに任意のLEDを点滅させる機能があるのですが、コメントアウトして無効にしています。今回は4桁の数字だけ見えれば良いので、不要でした。
ここまで作って動いたらあとはいつも通り、/etc/systemd/system/ledclock.service を以下のように新規作成してサービスとして追加します。


[Unit]
Description = LED Clock
[Service]
ExecStart = /usr/bin/python3 /usr/local/src/ledclock.py
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target


これでsystemctl start ledclock.serviceで時計が起動するようになりました。systemctl enable ledclock.serviceしておけばraspberry piが起動するタイミングで勝手に時計も起動しますね。
最後に、ブレッドボードごとPCのモニタに貼っつけて完成です。
youtubeを全画面で見ていて遅刻しそうになる...なんて事態が防げますね!
負荷の話。
raspberry piに負荷がかかると若干LEDがちらつきますが、気にならないレベルです。pythonの書き方次第かなと思います(ループ処理内でifを使うと処理が遅く、ちらつきが発生しました)
ちなみに・・・これの応用として、別サーバ(raspberry piと同一セグメント)のDBに登録されている気温のデータを引っこ抜いてLEDで表示する、というのも試したのですが、DBアクセスが重いせいか、ちらつきが発生して実用的ではありませんでした。
DBから取得した値を一旦保持して、頻繁なDBアクセスを控えるなどの処理を入れればいける気がしてますが、未検証です。