少し前に購入した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セット分です。
7セグLEDは基板の上に載っているので、てっきりはんだ付け済と思ったら、ただ刺してあるだけでした。自分で基板にはんだ付けした後、長いピンを短くせよと。そして今度は逆方向にピンヘッダをハンダ付けと。まあ、これくらいならはんだ付け不得意の老眼の年寄でもできまする。
Nucleo-F406REとの接続
必要な部品はみな基板側に載っているので、Nucleo-F406REから以下の端子を引き出して接続するだけです。
-
- シリアルシフトクロック(SCK)
- シリアルデータ(LED側からみるとSDI)
- シフトレジスタから出力ラッチへのロードクロック(LATCH)
- VDD
- GND
今回は赤色LEDでVDD=3.3Vで駆動可能でした。Nucleo-F406REのIO電圧は3.3VなのでOK。
なお、シリアル入力は下位桁から行っているので、わすれずに下位桁のSDO出力を上位桁のSDI入力に接続しないとなりません。そして1桁8ビットということで、必要な桁数分だけシフトする必要があります。
上記の小ボードをブレッドボード上に配置した場合、うまい具合にボード下を配線が通るようにできるので楽です。といいながら、最初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点灯桁数と電流の計算はちゃんとしないとならないケド。