はじめに
RaspberryPi(ラズパイ)4 のSPIを使って、7セグメント4桁LED(青)を操作する方法について解説します。言語はPython。ライブラリは「spidev」を使います。
~ この記事の内容 / Contents ~
環境
環境 | 備考 | |
RaspberryPi | 4 Model B | |
OS | RaspberryPi OS (bullseye) | 64bit版です |
言語 | Python 3.9.2 | |
ライブラリ | spidev ver.3.5 |
OSの書き込みやセットアップ方法はこちらをご覧ください。
RaspberryPiとの接続
以下のようにRaspberryPiと7セグLEDを接続します。
ピン番号 | RaspberryPi側 | 7セグ側 |
17 | 3V3 | VCC |
19 | MOSI | SDI |
23 | SCLK | SCK |
24 | CE0 | SS |
25 | GND | GND |
RaspberryPi ピンアサイン(Pinout)
※ RaspberryPi 公式のGitHubより引用
7セグLEDデータシート
使用する部品
今回の回路には以下のものを使用しています。
RaspberryPi 4 (8GB モデル)
解説でも使用しているRaspberryPi 4 です。
在庫切れ・価格高騰が続いていましたが、ようやく在庫もできて価格も定価近くまで下がりました。
7セグメント4桁LED
Amazonでも購入することができます。
こちらはレッド版です。
ブレッドボード
国内サンハヤト製のブレッドボードです。少々堅めの指し心地ですが、海外製と違ってピン穴の番号がすべて印刷されており、品質も高いのでおすすめです。
ジャンプワイヤ (オス-メス タイプ)
RaspberryPiで使う場合は、以下のオスーメスタイプがおすすめです。
エネループ
使い捨ての乾電池もいいですが、エネループなら4本充電時の電気代が約1円。モーター・ポンプなどの電池が消耗しやすい実験・工作におすすめです。
※ はじめて使う方は充電器とのセットがおすすめです
電池ボックス
電源に使用する乾電池用のボックスとスナップです。記事では単4を使っていますが、容量の大きい単3タイプをお勧めします。単3でも単4でも電圧は変わりません。
プログラム概要
今回のプログラムの概要は以下の通りです。
- SPIを設定する
- 7セグLEDに「1234」と表示する
- 7セグLEDに「コロン(:)」を表示する
実行結果
後述するプログラムを実行すると、以下のように7セグLEDに数値を表示できます。
SPIの有効化
RaspberryPiでは、デフォルトでSPI通信が無効化されているので、設定画面からSPIを有効化します。
デスクトップの「RaspberryPiのマーク」→「設定」→「RaspberryPiの設定」をクリックします。表示された画面で「インターフェイス」のタブを選択し「SPI」のスイッチをクリックします。
ライブラリのインストール
2023年3月にインストールしたRaspberryPi OS(64bit)では、デフォルトの状態で「spidev」が使用できました。使用できない(importでエラーがでる)場合は、以下のコマンドでインストールしてください。
pip install spidev
全体コード
全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。
import spidev
import time
# SPIの設定です
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 100000
#
# ChipSelectコマンド内部で自動的にしてくれるので、
# 別途GPIOを操作する必要はありません。
#
# 表示のクリア
writeData = [ 0x76,]
spi.xfer2(writeData)
time.sleep(1)
# 数値の表示
writeData = [ 0x1, 0x2, 0x3, 0x4 ]
spi.xfer2(writeData)
# コロンの表示
writeData = [ 0x77, 0x10]
spi.xfer2(writeData)
print("done")
コードのポイント
コードのポイントは以下の通りです。
SPIの作成
SPI通信用のオブジェクトを作成して、周波数等を設定します。7セグLED側が250kHzまでしか対応していないため、周波数はそこまでの値を設定してください。
# SPIの設定です
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 100000
表示のクリア
xfer2関数でSPIのコマンドを送信します。SS(スレーブセレクト・チップセレクト)はコマンド内で自動でON/OFFされるので、別途GPIOを操作する必要はありません。
送信する「0x76」7セグLEDの表示をクリアするコマンドで、送信するとLEDが全て消灯します。sleepは消灯を目視確認するためのもので、必須ではありません。
#
# ChipSelectコマンド内部で自動的にしてくれるので、
# 別途GPIOを操作する必要はありません。
#
# 表示のクリア
writeData = [ 0x76,]
spi.xfer2(writeData)
time.sleep(1)
数値の表示
7セグLEDに数値を表示します。左から順に指定します。
# 数値の表示
writeData = [ 0x1, 0x2, 0x3, 0x4 ]
spi.xfer2(writeData)
コロンの設定
「0x77」と合わせて数値を送ると小数点やコロンを表示できます。
表示内容は2進数で指定します。コロンは2進数で「0001 0000」となるため、16進数に変換した「0x10」を送信しています。詳細は以下の表をご覧ください。
# コロンの表示
writeData = [ 0x77, 0x10]
spi.xfer2(writeData)
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
内容 | — | — | アポストロフィ | コロン | 少数点③ | 少数点② | 少数点① | 少数点⓪ |
※ SparkFunの公式ページより引用
まとめ
RaspberryPi(ラズパイ)4 のSPIを使って、7セグメント4桁LED(青)を操作する方法について解説しました。RaspberryPi4で、SPI通信をしてみたい方の参考になればうれしいです。
おすすめの最新書籍
今月号の日経Interfaceは「Linuxチューニング術50」
今月号のInterfaceは『Linux チューニング術 50』です。
Linuxを組み込んだ機器を”本格的”に作ろうとすると「起動を早くしたい」「いきなり電源を切られてもデータを守りたい」など、対応が必要なチューニングはおおいですよね。
今回の記事は、「カーネルをいじらない」方法でチューニングを行う方法が解説されています。
こういった”実用的”な特集はレアですし、知っておいても損はない情報だと思います。
私も仕事でこの手の問題に何度も遭遇していますが、こういったOSレベルの難しそうな設定を、さらっとできちゃう人はかっこいいですよね。
興味のある方は、以下のリンクから確認できます。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。