MicroPython的午睡(92) STM32版、74HC595で7SEG LED2桁駆動

Joseph Halfmoon

少し前に購入した7SEG LEDのDIP化ボードの組み立て後の動作確認をMicroPythonにて実施。何度となく74HC595を使った回路をやっているような気がしていたのですが、今回のSPIでインタフェース、スタティック駆動、MicroPythonという条件は無かったですな。まあ網羅できるわけもないのでありますが。

※「MicroPython的午睡」投稿順 Indexはこちら

※ST Microelectronics社製Nucleo-F401REボード上で使用しているSTM32版MicroPythonについてはこちら

7セグLED、DIP化ボード

今回組み立てたのは、例によって秋月電子通商殿の以下の小ボードです。7セグLEDを基板に搭載、裏面には定番のシリアル・シフトレジスタ74HC595が取り付けられており、電流制限抵抗その他も全部のせの一品です。製品は1桁ずつ1基板ですが、複数桁を数珠繋ぎに接続できるので必要な桁数表示が可能。各桁に595が張り付いているのでスタティック点灯できます。これがあれば、点灯パターンのデータを送り込んだらホストマイコンは点灯作業を忘れていられます。

赤色7セグメントLEDシリアルドライバキット(DIP化キット)

以前にも7セグLED4桁を点灯させている記事があったですが、そのときはタイマ使って「ありがちな」ダイナミック駆動でした。595と各LED間の配線が何気に大変。

MicroPython的午睡(14) ラズパイPico、7セグ4桁、とりあえずタイマ駆動

他にもいろいろあったのですが、ラズパイPicoのPIO(プログラマブルIO)を使ったような駆動などで、イマイチ参考にならず。まあ、上記からダウンロードした秋月殿の資料あるからいいか。

DIP化ボードの組み立て

上記のDIP化キットには基板とLEDと細ピンソケットが入ってます。以下の写真は2セット分です。AE_7SEG_DIP

7セグLEDは基板の上に載っているので、てっきりはんだ付け済と思ったら、ただ刺してあるだけでした。自分で基板にはんだ付けした後、長いピンを短くせよと。そして今度は逆方向にピンヘッダをハンダ付けと。まあ、これくらいならはんだ付け不得意の老眼の年寄でもできまする。

Nucleo-F406REとの接続

必要な部品はみな基板側に載っているので、Nucleo-F406REから以下の端子を引き出して接続するだけです。

    1. シリアルシフトクロック(SCK)
    2. シリアルデータ(LED側からみるとSDI)
    3. シフトレジスタから出力ラッチへのロードクロック(LATCH)
    4. VDD
    5. GND

今回は赤色LEDでVDD=3.3Vで駆動可能でした。Nucleo-F406REのIO電圧は3.3VなのでOK。

なお、シリアル入力は下位桁から行っているので、わすれずに下位桁のSDO出力を上位桁のSDI入力に接続しないとなりません。そして1桁8ビットということで、必要な桁数分だけシフトする必要があります。STM32_74HC595_LED_DUT_schematic

上記の小ボードをブレッドボード上に配置した場合、うまい具合にボード下を配線が通るようにできるので楽です。といいながら、最初1か所ズレた端子を接続してしまい動作せずに焦りました。基板を取り除かないと下の配線がチェックできないのです。当たり前か。

テストに使用したMicroPythonスクリプト

SPI接続のSRAM用につかったスクリプトを流用して作成しました。7セグの点灯パターンは、秋月殿のサイトから「Arduino」向けのスケッチがダウンロードでき、それに0から9までの点灯パターンが記されていたのでそれをパクらせてもらいました。しかしバチがあたりましたな。当方のSPI接続と秋月殿のArduinoのSPI接続のビット順が逆で、最初妙なパターンでした。ビットパターンのLSB、MSBをヒックリ返してようやくOKとな。

#STM32: SPI1 74HC595 x 2 Write test
#SPI1_SCLK	PA_5	D13
#SPI1_MOSI	PA_7	D11
#LATCH RCLK	PB_6	D10
import time
from machine import Pin, SPI

spi1 = SPI(1, 100_000)
rclk = Pin(machine.Pin.board.D10, Pin.OUT)
rclk.value(0)

dispPAT = [
  0b00111111,
  0b00000110,
  0b01011011,
  0b01001111,
  0b01100110,
  0b01101101,
  0b01111101,
  0b00000111,
  0b01111111,
  0b01101111,
  0b00000000,
  ]

def writeSEQ(datH, datL):
    work = bytes([datH, datL])
    spi1.write(work)
    rclk.value(1)
    time.sleep_ms(1)
    rclk.value(0)

def main():
    print("STM32F401RE SPI1 74HC595 x 2 Write Test.")
    idx = 0
    while True:
        writeSEQ(dispPAT[idx], dispPAT[idx+1])
        idx += 1
        if idx > 9:
            idx = 0
        time.sleep(2)

if __name__ == "__main__":
    main()

ともあれ、上記のパターンを送り込めば、何桁であろうとスタティック点灯なのでソフトはお楽。まあ、LED点灯桁数と電流の計算はちゃんとしないとならないケド。

MicroPython的午睡(91) STM32F401RE、UART(USART)の続き へ戻る

MicroPython的午睡(93) STM32版、7SEG2桁でAHT21Bの温度表示 へ進む