【Raspberry Pi Advent Calendar 2023】ブレッドボード+7セグ+タクトスイッチであそぼ
これは Raspberry Pi Advent Calendar 2023 22日目の記事です。
お前は誰
卒論を控えた大学4年生。2時間で生やしたクソアプリが2.1万いいね・60stars・はてブ90usersを達成し、絶賛人生崩壊中です。
詳細は X (旧Twitter) と ウェブサイト 見て、どうぞ。最近は Misskey (ActivityPub) もやってます。過去のRaspberry Pi Advent Calendarでは ジャンクスキャナを使う話 や Orange Piの話 をしました。
家にはRaspberry Pi 1 Model B+とOrange Pi Zero (ラズパイの中華パチモン) が各1台あります。
…と言いつつ、Raspberry Piの品薄が長続きした影響でサーバは中古デスクトップに完全移行。ゆるして
今はデジタルサイネージや後述の電子工作でたまに使っています。
経緯
私の所属する静岡大学には「電子組込みシステム」と呼ばれる授業があります。Raspberry Piで電子部品を操作するコードを書き、レポートにするだけで単位が貰える神講義です。
この授業、ラズパイマン (ほんまか) として受けない訳にはいきません。
地獄の3連インターンシップを目前に控えた2022年8月に他学部履修届を提出、10月~今年2月にかけ受講しました。
作ったもの
イベント開催予定地などに設置されるカウントダウン表示板のミニチュアを作成し、期末レポートとしました。
7セグ+タクトスイッチ2~3個をブレッドボード経由でマイコンボードに繋ぐと、ちょっとした内容ならコマンドラインを触らず操作できるお手軽インタフェースが完成します。このシステムも残り日数変更やバージョンの確認を7セグ+タクトスイッチで行えるため、Pythonスクリプト実行より後はモニタやキーボードが要りません。
7セグは7年前に秋葉原のAitendoで購入したものを使用。Aitendo、コロナ禍で実店舗閉めて通販専業になったんですね…悲しい。タクトスイッチは手持ちが無く大学生協で購入。浜松キャンパス北館ショップにはマルツの出張コーナーが有り、マイコンボード (ラズピッピも!) や各種電子部品を購入できます。BIG LOVE…
ここからは、7セグをマイコンボードで扱う時の意外な詰まりポイントにスポットを当てていきます。
7セグ
7つのセグメント (画) から構成され、個々の部分が点いたり消えたりすることでアラビア数字を表現するLEDを7セグメントLED (7セグ) と呼びます。
情報量を増やせる液晶パネルが低コストになった今でも、自動販売機の料金表示など数字しか扱わない分野ではまだまだ現役です。
桁数や色に多くのバリエーションが有り、安いものなら数十円で購入可能。大抵の電子工作用7セグは数字に加え小数点 (Decimal Point, DP) があります。8セグじゃねーか!
7セグLEDは-極が共通で+極が複数ある「カソードコモン」と、+極が共通で-極が複数ある「アノードコモン」の2種類に分けられます。上図で右側のDPを光らせたい場合、Ax (カソードコモン) では5ピンに+極・6ピンに-極、Bx (アノードコモン) では6ピンに+極・5ピンに-極を接続します。一度に点灯できるのは1桁だけです。
ダイナミック点灯
つまり7セグ自体に複数桁を同時点灯する機能はありません。不良品か~?
そこで「ダイナミック点灯」と呼ばれる制御をします。
ダイナミック点灯は、1桁目→2桁目→3桁目→1桁目→…と順番に点灯させる手法です。人間の目はアホですから、このループを高速 (1周0.03秒程度) で回せば全ての桁が点灯しているように見えます。
GPIOのGND足りない問題
Raspberry PiではGPIOピンを+極・GNDを-極と考えがちですが、今回使ったアノードコモンの7セグLEDは-極を大量に使うため、全てGNDに割り当てると足りなくなります。Raspberry PiよりArduinoのような小規模マイコンボードで起こりやすい問題です。
解決策ですが…実は!GPIOピンから1を出力すると+極、0を出力すると-極になります。つまりプログラムさえ適切に書けば、GPIOピン→電子部品→GPIOピンの回路でも正常に動くのです。中学レベルの電子工作知識で「1つの端子が+にも-にもなる」と言われてもピンと来ない、地味な初見殺しポイント。
回路図を見ても分かる通り、7セグはGNDと繋がっていません。+極も-極もGPIOピンに繋ぎ、ON/OFFを切り替えるプログラムにより回路を構成しています。
今回使用している7セグはアノードコモンですから、+極の3ピンまたは5ピンに1・-極の14~21ピンに0を出力することで回路が完成し点灯します。消灯する場合は、両方0か1にします。LED程度の電力量なら両極がONでも問題無いようです。
# サンプル: 2桁の7セグメントLEDに「12」を表示
import time
import RPi.GPIO as GPIO
# GPIO初期化
GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.OUT) # 10's place
GPIO.setup(3, GPIO.OUT) # 1's place
GPIO.setup(14, GPIO.OUT) # Segment A
GPIO.setup(15, GPIO.OUT) # Segment B
GPIO.setup(16, GPIO.OUT) # Segment C
GPIO.setup(17, GPIO.OUT) # Segment D
GPIO.setup(18, GPIO.OUT) # Segment E
GPIO.setup(19, GPIO.OUT) # Segment F
GPIO.setup(20, GPIO.OUT) # Segment G
# メインループ
def main():
try:
while True:
# 7セグメントLED点灯 (10の位に"1"を表示)
clear_number()
GPIO.output(2, 1)
GPIO.output(3, 0)
GPIO.output(15, 0)
GPIO.output(16, 0)
time.sleep(0.01)
# 7セグメントLED点灯 (1の位に"2"を表示)
clear_number()
GPIO.output(2, 0)
GPIO.output(3, 1)
GPIO.output(14, 0)
GPIO.output(15, 0)
GPIO.output(17, 0)
GPIO.output(18, 0)
GPIO.output(20, 0)
time.sleep(0.01)
except KeyboardInterrupt:
GPIO.cleanup()
# 7セグメントLED消灯
def clear_number():
for i in range(8):
GPIO.output(14 + i, 1)
return
# プログラム実行時にmain関数を呼び出す
if __name__ == "__main__":
main()
まとめ
以上、7セグのダイナミック点灯&GND足りない問題解決法でした。タクトスイッチの使い方はネットに山ほど転がっています。チャタリング (1度押しただけで複数回入力される現象) 対策以外に難しい箇所はありません。
しかし…見た目がとにかく貧相!7セグとタクトスイッチに加え抵抗が8本も要るため仕方ありません。これ以上マシな見た目にするにはユニバーサル基板を使うしか無さそうです。
まあ、このマシンは解体済でもう無い訳ですが…
最後に宣伝
冬コミにて新刊「Train Driver 遠州鉄道編」「エンジニアの中国語入門」と既刊を頒布します。決済は現金の他、各種キャッシュレスに対応!「2日目 東S-40b (同人ソフト島)」でお待ちしております!!