注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!
1.1.4 7セグメントディスプレイ
はじめに
7セグメントディスプレイを使って、0から9、AからFまでの数字を表示しましょう。
必要な部品
このプロジェクトで必要な部品は以下の通りです。
キットとして購入するのが便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
|---|---|---|
Raphael Kit |
337 |
下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
|---|---|
回路図
74HC595のST_CPをRaspberry PiのGPIO18に、SH_CPをGPIO27に、DSをGPIO17に接続し、並列出力ポートをLEDセグメントディスプレイの8セグメントに接続します。DSピンでの入力データは、SH_CP(シフトレジスタのクロック入力)が立ち上がりエッジにあるときにシフトレジスタに、ST_CP(メモリのクロック入力)が立ち上がりエッジにあるときにメモリレジスタに送られます。次に、Raspberry PiのGPIOを使用して、SH_CPおよびST_CPの状態を制御して、シリアルデータ入力を並列データ出力に変換し、Raspberry PiのGPIOを節約してディスプレイを駆動します。
T-Board Name |
physical |
wiringPi |
BCM |
GPIO17 |
Pin 11 |
0 |
17 |
GPIO18 |
Pin 12 |
1 |
18 |
GPIO27 |
Pin 13 |
2 |
27 |
実験手順
ステップ1: 回路を組み立てます。
ステップ2: コードのフォルダに移動します。
cd ~/raphael-kit/python/
ステップ3: 実行します。
sudo python3 1.1.4_7-Segment.py
コードを実行すると、7セグメントディスプレイに0-9、A-Fが表示されます。
コード
注釈
下のコードは 変更/リセット/コピー/実行/停止 ができます。しかし、それをする前に、ソースコードのパス raphael-kit/python に移動する必要があります。コードを変更した後、その効果を直接確認するために実行することができます。問題がないことを確認したら、変更したコードをコピーするためのコピーボタンを使用し、 nano コマンドでターミナルでのソースコードを開き、貼り付けることができます。
import RPi.GPIO as GPIO
import time
# Set up pins
SDI = 17
RCLK = 18
SRCLK = 27
# Define a segment code from 0 to F in Hexadecimal
segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71]
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(SDI, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(RCLK, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(SRCLK, GPIO.OUT, initial=GPIO.LOW)
# Shift the data to 74HC595
def hc595_shift(dat):
for bit in range(0, 8):
GPIO.output(SDI, 0x80 & (dat << bit))
GPIO.output(SRCLK, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(SRCLK, GPIO.LOW)
GPIO.output(RCLK, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(RCLK, GPIO.LOW)
def main():
while True:
# Shift the code one by one from segCode list
for code in segCode:
hc595_shift(code)
print ("segCode[%s]: 0x%02X"%(segCode.index(code), code)) # %02X means double digit HEX to print
time.sleep(0.5)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
main()
except KeyboardInterrupt:
destroy()
コードの説明
segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71]
0からFまでの16進数(共通カソード)のセグメントコード配列。
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(SDI, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(RCLK, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(SRCLK, GPIO.OUT, initial=GPIO.LOW)
ds、st_cp、sh_cpの3つのピンを出力として設定し、初期状態を低レベルにする。
GPIO.output(SDI, 0x80 & (dat << bit))
datデータをビットごとにSDI(DS)に割り当てます。ここでは、dat=0x3f(0011 1111)と仮定します。bit=2の場合、0x3fは2ビット左にシフトされます。1111 1100 (0x3f << 2) & 1000 0000 (0x80) = 1000 0000、これは真です。
GPIO.output(SRCLK, GPIO.HIGH)
SRCLKの初期値はLOWに設定されていましたが、ここではHIGHに設定されています。これは立ち上がりエッジのパルスを生成し、DSのデータをシフトレジスタにシフトするためです。
GPIO.output(RCLK, GPIO.HIGH)
RCLKの初期値はLOWに設定されていましたが、ここではHIGHに設定されています。これは立ち上がりエッジを生成し、シフトレジスタからストレージレジスタにデータをシフトするためです。
注釈
0~15までの数値の16進数形式は、(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B
現象の画像