注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

1.1.4 7セグメントディスプレイ

概要

7セグメントディスプレイを制御して、0から9およびAからFまでの数字を表示してみましょう。

必要な部品

このプロジェクトには、次のコンポーネントが必要です。

../_images/1.1.4_7_segment_list.png

一式を購入するのが便利です、こちらがリンクです:

名前

このキットのアイテム

リンク

Raphael Kit

337

Raphael Kit

以下のリンクから別々に購入することもできます。

コンポーネントの紹介

購入リンク

GPIO拡張ボード

BUY

ブレッドボード

BUY

ジャンパーワイヤー

BUY

抵抗器

BUY

7セグメントディスプレイ

BUY

74HC595

BUY

回路図

74HC595のST_CPピンをRaspberry PiのGPIO18に、SH_CPをGPIO27に、DSをGPIO17に接続し、LEDセグメントディスプレイの8つのセグメントに並列出力ポートを接続します。

SH_CP(シフトレジスタのクロック入力)が立ち上がりエッジのときにDSピンへデータを入力し、ST_CP(メモリのクロック入力)が立ち上がりエッジのときにメモリレジスタにデータを入力します。その後、Raspberry PiのGPIOを介してSH_CPとST_CPの状態を制御して、シリアルデータ入力を並列データ出力に変換し、Raspberry PiのGPIOを節約してディスプレイを駆動できます。

T-Board Name

physical

BCM

GPIO17

Pin 11

17

GPIO18

Pin 12

18

GPIO27

Pin 13

27

../_images/1.1.4_7_segment_schematic.png

実験手順

ステップ1: 回路を組み立てます。

../_images/1.1.4_7-Segment_circuit.png

ステップ2: コードのフォルダに移動します。

cd ~/raphael-kit/python-pi5

ステップ3: 実行します。

sudo python3 1.1.4_7-Segment_zero.py

コードを実行した後、7セグメントディスプレイが0から9、AからFまで表示されるのを確認できます。

コード

注釈

以下のコードは 変更/リセット/コピー/実行/停止 することができます。ただし、それを行う前に「raphael-kit/python_5」というソースコードのパスに移動する必要があります。コードを変更した後、そのまま実行して効果を確認できます。問題がないことを確認したら、修正されたコードをコピーするためのCopyボタンを使用し、ターミナルで「nano」コマンドを使用してソースコードを開き、コードを貼り付けることができます。

#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep

# GPIO pins connected to 74HC595 shift register
SDI = OutputDevice(17)   # Serial Data Input
RCLK = OutputDevice(18)  # Memory Clock Input (Register Clock)
SRCLK = OutputDevice(27) # Shift Register Clock

# Hexadecimal digit codes for a common cathode 7-segment display
segCode = [
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
    0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
]

def hc595_shift(data):
    # Shift 8 bits of data into the 74HC595
    for bit in range(8):
        # Set SDI high or low based on data bit
        SDI.value = 0x80 & (data << bit)
        # Trigger shift register clock
        SRCLK.on()
        sleep(0.001)
        SRCLK.off()
    # Latch data to output by triggering memory clock
    RCLK.on()
    sleep(0.001)
    RCLK.off()

def display_all_on():
    # Function to turn all segments on (for common cathode 7-segment display)
    all_on_code = 0x3f
    hc595_shift(all_on_code)
    print("Displaying all segments on")

try:
    while True:
        # Display each hexadecimal digit on 7-segment display
        for code in segCode:
            hc595_shift(code)  # Shift the code into 74HC595
            # Print the displayed segment code
            print(f"Displaying segCode[{segCode.index(code)}]: 0x{code:02X}")
            sleep(0.5)  # Pause between displaying each digit

except KeyboardInterrupt:
    # Gracefully handle script interruption (e.g., Ctrl+C)
    pass

コードの説明

  1. このスニペットはプロジェクトに必要なクラスをインポートします。 gpiozero から OutputDevice は、GPIOピンに接続されたハードウェアコンポーネントを制御するために、 time から sleep は遅延を追加するために使用されます。

    #!/usr/bin/env python3
    from gpiozero import OutputDevice
    from time import sleep
    
  2. SDI、RCLK、SRCLKは、74HC595のシリアルデータ入力、メモリクロック入力(レジスタクロック)、シフトレジスタクロックピンに対応しています。

    # GPIO pins connected to 74HC595 shift register
    SDI = OutputDevice(17)   # Serial Data Input
    RCLK = OutputDevice(18)  # Memory Clock Input (Register Clock)
    SRCLK = OutputDevice(27) # Shift Register Clock
    
  3. segCode は、7セグメントディスプレイに表示する各デジットの16進数コードを含む配列です。

    # Hexadecimal digit codes for a common cathode 7-segment display
    segCode = [
        0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
        0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
    ]
    
  4. この関数は、データを74HC595に8ビットシフトします。それは各ビットを SDI に連続的に入力し、ビットをシフトするために SRCLK をトグルし、データを出力にラッチするために RCLK を使用します。

    def hc595_shift(data):
        # Shift 8 bits of data into the 74HC595
        for bit in range(8):
            # Set SDI high or low based on data bit
            SDI.value = 0x80 & (data << bit)
            # Trigger shift register clock
            SRCLK.on()
            sleep(0.001)
            SRCLK.off()
        # Latch data to output by triggering memory clock
        RCLK.on()
        sleep(0.001)
        RCLK.off()
    
  5. この関数は、ディスプレイのすべてのセグメントをオンにします。これは、共通カソードの7セグメントディスプレイ用です。

    def display_all_on():
        # Function to turn all segments on (for common cathode 7-segment display)
        all_on_code = 0x3f
        hc595_shift(all_on_code)
        print("Displaying all segments on")
    
  6. メインループでは、 segCode の各コードが順番にディスプレイに送られ、各コードの間に遅延があります。

    try:
        while True:
            # Display each hexadecimal digit on 7-segment display
            for code in segCode:
                hc595_shift(code)  # Shift the code into 74HC595
                # Print the displayed segment code
                print(f"Displaying segCode[{segCode.index(code)}]: 0x{code:02X}")
                sleep(0.5)  # Pause between displaying each digit
    
  7. この部分のコードは、スクリプトの中断(Ctrl+Cなど)を優雅に処理します。

    except KeyboardInterrupt:
        # Gracefully handle script interruption (e.g., Ctrl+C)
        pass