Raspberry Pi Picoを使って、4桁の7セグメントLEDを使う方法について説明します。1桁の7セグメントLEDについて別途解説してあるので、良かったらそちらも見てみてください。
4桁7セグメントLED
1桁の7セグメントLEDでは、アノードまたはカソードを共通電極としてA~GとDPのLEDを光らせることで0~9の数字と.を表示させました。その際、ラズパイピコの8箇所のGPIOピンとGNDを使っていました。単純に4桁にしようとするとその4倍のピンを使うことになり、ラズパイピコのGPIOピンが足りません。その為、4桁の7セグメントLEDでは「ダイナミック点灯方式」という方法を使います。
今回は、OSL40562-IGというアノードコモン型の4桁7セグメントLEDをダイナミック点灯方式で使ってみたいと思います。
ダイナミック点灯方式とは
ダイナミック点灯方式はいくつかのLEDを高速に交互に光らせることで、擬似的に全部が同時に点灯しているように見せる点灯方式です。4桁7セグメントLEDでは各桁ごとに高速・交互に光らせることで4桁同時に数字を見せることができます。

4桁7セグメントLEDとラズパイピコを配線
それでは早速配線します。今回使う4桁7セグメントLEDのOSL40562-IGはアノードコモン型です。別の記事で説明したカソードコモン型の1桁7セグメントLEDとは、LEDの向きが逆になっており、それが4つ組み合わさっています。


12番、9番、8番、6番の電極がアノードで、各桁につながっています。また11番、7番、4番、2番、1番、10番、5番、3番が、各桁のA〜G、DPにつながっています。
アノードコモン型のダイナミック点灯方式では、表示させたい桁のアノードだけを正電圧にして、残りのアノードをGNDにし、A〜G、DPの光らせたいところをGND、光らせないところは正電圧にします。
ちなみにカソードコモン型の4桁7セグメントLEDを使うなら、表示させたい桁のカソードだけをGNDにして、残りのカソードを正電圧にし、A〜G、DPの光らせたいところを正電圧、光らせないところはGNDにします。
光らせない桁では、LEDに逆電圧がかかることになりますが、LEDはダイオードなので逆電圧では電流が流れず、光りません。
ラズパイピコとの配線図は次の通りです。

青色の配線がA〜G、DPにつながっているカソード電極、黄色の配線が各桁につながっている共通アノード電極です。
マイクロパイソンでコーディング
それではコーディングします。ソースコードは下記の通りです。カソードコモン型のLEDとは光らせる電圧が逆であることに注意してください。
from machine import Pin
import time
#カソードのGPIOを設定
led_Cathodes = [
Pin(5, Pin.OUT), #A
Pin(9, Pin.OUT), #B
Pin(12, Pin.OUT), #C
Pin(14, Pin.OUT), #D
Pin(15, Pin.OUT), #E
Pin(6, Pin.OUT), #F
Pin(11, Pin.OUT), #G
Pin(13, Pin.OUT)] #DP
#アノードのGPIOを設定
led_Anodes = [
Pin(4, Pin.OUT), #DIG1
Pin(7, Pin.OUT), #DIG2
Pin(8, Pin.OUT), #DIG3
Pin(10, Pin.OUT)] #DIG4
#7セグメントLEDで表示する数字
seg7num = [
[0,0,0,0,0,0,1,1], #0
[1,0,0,1,1,1,1,1], #1
[0,0,1,0,0,1,0,1], #2
[0,0,0,0,1,1,0,1], #3
[1,0,0,1,1,0,0,1], #4
[0,1,0,0,1,0,0,1], #5
[0,1,0,0,0,0,0,1], #6
[0,0,0,1,1,0,1,1], #7
[0,0,0,0,0,0,0,1], #8
[0,0,0,1,1,0,0,1]] #9
#指定の桁の7セグメントLEDに任意の数字を表示する
def on_seg7num(num, dig, dot=False):
ns = seg7num[num]
for i,n in enumerate(ns):
led_Cathodes[i].value(n)
v = 0 if dot else 1
led_Cathodes[7].value(v)
if dig==0:
led_Anodes[0].value(1)
led_Anodes[1].value(0)
led_Anodes[2].value(0)
led_Anodes[3].value(0)
elif dig==1:
led_Anodes[0].value(0)
led_Anodes[1].value(1)
led_Anodes[2].value(0)
led_Anodes[3].value(0)
elif dig==2:
led_Anodes[0].value(0)
led_Anodes[1].value(0)
led_Anodes[2].value(1)
led_Anodes[3].value(0)
elif dig==3:
led_Anodes[0].value(0)
led_Anodes[1].value(0)
led_Anodes[2].value(0)
led_Anodes[3].value(1)
else:
led_Anodes[0].value(0)
led_Anodes[1].value(0)
led_Anodes[2].value(0)
led_Anodes[3].value(0)
#4桁7セグメントLEDを消灯する
def clear_seg7num():
for led in led_Cathodes:
led.value(1)
for led in led_Anodes:
led.value(0)
#4桁7セグメントLEDを制御して数字を表示させる
def show_seg7num(num):
num=int(num*100)
#千の位、百の位、十の位、一の位の数字を取り出す
nm = [(num//1000)%10, (num//100)%10, (num//10)%10, num%10]
#1msごとに表示する桁を切り替える
for i in range(4):
if i==1:
on_seg7num(nm[i],i,dot=True)
else:
on_seg7num(nm[i],i,dot=False)
time.sleep(0.001)
clear_seg7num()
#4桁7セグメントLEDの使用例
#while loopで時間を表示する
sig_start = time.ticks_ms()
while True:
sig_end = time.ticks_ms()
duration = (sig_end - sig_start) / 1000
show_seg7num(duration)
表示の様子(動画)
4桁7セグメントLEDでタイマー表示ができました。ボタンやセンサーと組み合わせて、色々つくれそうですね。
コメント