はじめに
RaspberryPi PicoでSPIを使って「シリアル接続7セグメント4桁LED(青)」を操作する方法を解説します。言語はMicroPythonを使います。
~ この記事の内容 / Contents ~
- 初めてSPI通信を使う。
- MicroPythonでサクッとSPI通信をしてみたい。
- 7セグLEDを簡単に使いたい。
環境
この記事の内容は、以下の環境で作成しています。
環境 | バージョンなど | 備考 |
開発用PCのOS | Windows11 | Windows10でもOKです |
言語 | MicroPython | |
開発環境 Thonny | 3.3.13 | |
ボード | RaspberryPi Pico |
シリアル接続7セグメント4桁LED(青)
SparkFunから発売されている、SPI・I2C・シリアル接続が可能な4桁の7セグメントLEDです。
通常、7セグLEDを使おうとすると、表示される「線1本1本」に配線・プログラムが必要なのですが、この基板は制御用のマイコン(ATMega328P)のおかげで、「1234」などの数値を送るだけで表示ができます。配線も電源系と通信系の計5本だけなので超簡単。
「LEDに表示すること」ではなく、表示する内容や、他のプログラムの作成に注力することができます。
私はスイッチサイエンスさんで購入しました。使用するにはピンヘッダの半田付けが10ピン分必要で、本体に付属していないので、ピンヘッダは別途準備する必要があります。
- SPI・I2C・シリアル接続に対応
- 省配線・省コード
- 簡単に7セグLEDが使える
Picoとシリアル接続7セグメント4桁LED(青)の接続
下記のようにPicoと7セグLEDをつなぎます。
7セグLED付近の拡大画像です。
ピン番号 | Pico側 | 7セグ側 |
38 | GND | GND |
36 | 3V3(OUT) | VCC |
25 | SPI0 Tx | SDI |
24 | SPI0 SCK | SCK |
22 | GP17 | SS |
Picoピンアサイン(Pin-Out)
※ Pico公式サイトより引用
使用する部品
今回使用する部品は以下の通りです。
ブレッドボード
国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、海外製と違ってピン穴の番号がすべて印刷されており、品質も高いのでおすすめです。
7セグメント4桁LED
Amazonでも購入することができます。
こちらはレッド版です。
ピンヘッダ
7セグLEDに使うためのピンヘッダです。特別なものは必要ないので、お手持ちの物があればそれで構いません。
プログラム概要
今回のプログラムの概要は以下の通りです。
- SPIを設定をする
- 「1234」を表示する
- 少数点を表示する
実行結果
後述するプログラムを実行すると、以下のように7セグLEDに数値と少数点が表示されます。
全体コード
全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。
from machine import SPI, Pin
import time
#
# SPIの設定
#
spi = SPI( 0,
baudrate = 100000,
sck = machine.Pin(18),
mosi = machine.Pin(19) )
#
# チップセレクト(スレーブセレクト)用の出力ピンを設定。
#
cs = machine.Pin(17, mode=Pin.OUT)
cs.value(1)
#
# クリアコマンド(0x76)でLEDを全て消す
#
cs.value(0)
spi.write(b"\x76")
cs.value(1)
time.sleep(0.5)
#
# 左から順に数値の表示
#
cs.value(0)
spi.write(b'\x01')
spi.write(b'\x02')
spi.write(b'\x03')
spi.write(b'\x04')
cs.value(1)
time.sleep(1)
#
# 小数点設定コマンド
#
cs.value(0)
spi.write(b"\x77")
spi.write(b"\x01")
cs.value(1)
print("done")
コードのポイント
コードのポイントは以下の通りです。
SPIの設定
SPI通信のクロック、通信に使うピンの設定をします。
MicroPythonの公式リファレンスでは、バス番号のみを指定していますが、それだと動作せずにちょっとハマりました。今回のピン(GP18,19)を使用する場合は、下記のようにピンを指定してください。
#
# SPIの設定
#
spi = SPI( 0,
baudrate = 100000,
sck = machine.Pin(18),
mosi = machine.Pin(19) )
クロック(baoudrate)は変更可能ですが、7セグLEDのボードが250kHzまでの対応です。クロックは250kHzまでにしてください。
CS(Chip Select) 用の出力ピンを設定
通信相手を選ぶCS(Chip Select)用のピンを設定します。
この基板では通信状態によってCSを以下のようにするため、設定直後は通信なしの(1)にしておきます。
指定 | 電圧 | value |
チップへのコマンド送信なし | High | 1 |
チップへのコマンド通信あり | Low | 0 |
#
# チップセレクト(スレーブセレクト)用の出力ピンを設定。
#
cs = machine.Pin(17, mode=Pin.OUT)
cs.value(1)
クリアコマンド
表示のクリアコマンド(0x76) で、全てのLEDが消灯して表示のクリアができます。通信に合わせてCSの状態も切り替えてください。
最後のスリープはLEDの消灯を目視確認するためのものなので、必須ではありません。
#
# クリアコマンド(0x76)でLEDを全て消す
#
cs.value(0)
spi.write(b"\x76")
cs.value(1)
time.sleep(0.5)
byte型の表記
LEDのクリアは16進の「0x76」ですが、write関数の引数はbyte型なので、「b”\x76″」という書き方をしています。
公式リファレンスでは、コマンドは16進数で書かれているので、引数に書く際は、上記のように「b”\x〇〇”」という形式に変換してください。
数値表示
左の桁から順に数字を送信すると、LEDに「1234」と表示されます。通信の前後でCSの状態も変化させてください。
#
# 左から順に数値の表示
#
cs.value(0)
spi.write(b'\x01')
spi.write(b'\x02')
spi.write(b'\x03')
spi.write(b'\x04')
cs.value(1)
time.sleep(1)
少数点の表示
コマンド「0x77」を送信すると、小数点などの設定を指定できます。
設定はコマンドに続けて、以下のように2進数で指定します。
#
# 小数点設定コマンド
#
cs.value(0)
spi.write(b"\x77")
spi.write(b"\x01")
cs.value(1)
小数点などの指定方法
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
内容 | — | — | アポストロフィ | コロン | 少数点③ | 少数点② | 少数点① | 少数点⓪ |
※ SparkFunの公式ページより引用
まとめ
RaspberryPi PicoでSPI接続の7セグLEDを使う方法を解説しました。
OLEDディスプレイが格安で買える時代ですが、7セグLEDはいかにも工作・プロダクトっぽくて楽しいですよね。
PicoでSPI使う方法の解説を書こうと思った時に、使いやすくて、面白そうなのでこの7セグLEDを買ってみました。「7セグLEDを使ってみたい」「SPIの使い方が知りたい」という人の参考になればうれしいです。
お知らせ
MicroPythonのプログラミングガイドブックが遂に発売!
「MicroPython」の本が遂にでました。
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!。
内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。
全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。
Pico/Pico W関連のおすすめ本
RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。