Raspberry Piで、3桁の7セグメントLEDをダイナミック点灯させるテストをしました。
7セグメントLEDを点灯させる方法は、前の記事と同じですが、3桁ですので、1桁ずつ点灯させます。
GPIO4~6を使い、GPIOが、HIGHの時にLEDのカソードに接続したトランジスタ2SC1815をドライブしてLEDを点灯します。LEDのすべてのセグメントが点灯した場合、約28mAの電流が流れますので、GPIOに直接接続することはできません。
回路図です。
1秒ごとに数字をカウントアップするスクリプトを作り、実験しました。
1桁の点灯時間は、0.005秒(5ms)としました。ちらつきは、ほとんど気になりません。
スクリプトです。
datetimeモジュールをimportして、秒の値が変わった時にcountをインクリメントし、1秒ごとに0~999までカウントアップします。
1sごとに割り込みで処理すれば良いのですが、分からないので、こんな方法をとりました。また、Pythonでは、インクリメントに++が使えないので、count +=1でカウントアップしています。
"""
7segment LED test
2017.5.11
JH7UBC Keiji Hata
"""
# -*- coding : utf-8 -*-
7segment LED test
2017.5.11
JH7UBC Keiji Hata
"""
# -*- coding : utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
import datetime
GPIO.setmode(GPIO.BCM)
from time import sleep
import datetime
GPIO.setmode(GPIO.BCM)
for i in range(4,7):
GPIO.setup(i,GPIO.OUT)
GPIO.setup(i,GPIO.OUT)
for i in range(20,28):
GPIO.setup(i,GPIO.OUT)
GPIO.setup(i,GPIO.OUT)
seg_data = [63,6,91,79,102,109,125,39,127,111]
disp_data = 0
num100 = 0
num10 = 0
num1 = 0
count = 0
bef_second = 0
disp_data = 0
num100 = 0
num10 = 0
num1 = 0
count = 0
bef_second = 0
for i in range(4,7):
GPIO.output(i,GPIO.LOW)
GPIO.output(i,GPIO.LOW)
def print_7seg(n):
disp_data = seg_data[n]
for i in range(20,28):
GPIO.output(i,disp_data & 1)
disp_data >>= 1
disp_data = seg_data[n]
for i in range(20,28):
GPIO.output(i,disp_data & 1)
disp_data >>= 1
def num3(num):
global num100
global num10
global num1
num100 = num // 100
num10 = (num % 100) // 10
num1 = num % 10
global num100
global num10
global num1
num100 = num // 100
num10 = (num % 100) // 10
num1 = num % 10
try:
while True:
nowtime = datetime.datetime.today()
now_second = nowtime.second
if now_second != bef_second:
count += 1
if count > 999:
count = 0
num3(count)
bef_second = now_second
print_7seg(num100)
GPIO.output(4,GPIO.HIGH)
sleep(0.005)
GPIO.output(4,GPIO.LOW)
print_7seg(num10)
GPIO.output(5,GPIO.HIGH)
sleep(0.005)
GPIO.output(5,GPIO.LOW)
print_7seg(num1)
GPIO.output(6,GPIO.HIGH)
sleep(0.005)
GPIO.output(6,GPIO.LOW)
except KeyboardInterrupt:
pass
while True:
nowtime = datetime.datetime.today()
now_second = nowtime.second
if now_second != bef_second:
count += 1
if count > 999:
count = 0
num3(count)
bef_second = now_second
print_7seg(num100)
GPIO.output(4,GPIO.HIGH)
sleep(0.005)
GPIO.output(4,GPIO.LOW)
print_7seg(num10)
GPIO.output(5,GPIO.HIGH)
sleep(0.005)
GPIO.output(5,GPIO.LOW)
print_7seg(num1)
GPIO.output(6,GPIO.HIGH)
sleep(0.005)
GPIO.output(6,GPIO.LOW)
except KeyboardInterrupt:
pass
GPIO.cleanup()
--------------------------------------------------
PICやArduinoでこのようなプログラムを作ると、シングルタスクマシンですので、これだけしかできません。
しかし、ラズベリーパイは、基本的にマルチタスクマシンですので、LED表示をさせながら、画面で他のタスクを実行することができます。
LEDを4桁にすれば、時計を表示させることができます。また、温度計など様々な応用ができると思います。