4桁の7セグメントLEDを使ってみる

ラズパイピコ

 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つ組み合わさっています。

LEDの配線図
電極の番号

 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はダイオードなので逆電圧では電流が流れず、光りません。
 ラズパイピコとの配線図は次の通りです。

4桁7セグメント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でタイマー表示しています

 4桁7セグメントLEDでタイマー表示ができました。ボタンやセンサーと組み合わせて、色々つくれそうですね。

コメント

タイトルとURLをコピーしました