注釈

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

参加する理由は?

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

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

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

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

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

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

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

はじめに

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

必要な部品

このプロジェクトで必要な部品は以下の通りです。

../_images/list_7_segment.png

キットとして購入するのが便利です。こちらがリンクです:

名前

このキットのアイテム

リンク

Raphael Kit

337

Raphael Kit

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

コンポーネントの紹介

購入リンク

GPIO拡張ボード

購入

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

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

購入

74HC595

購入

回路図

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

../_images/schematic_7_segment.png

実験手順

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

../_images/image73.png

ステップ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

現象の画像

../_images/image74.jpeg