.. note::

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

    **参加する理由は？**

    - **エキスパートサポート**：コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
    - **学び＆共有**：ヒントやチュートリアルを交換してスキルを向上させましょう。
    - **独占的なプレビュー**：新製品の発表や先行プレビューに早期アクセスしましょう。
    - **特別割引**：最新製品の独占割引をお楽しみください。
    - **祭りのプロモーションとギフト**：ギフトや祝日のプロモーションに参加しましょう。

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

.. _1.1.4_py:

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

はじめに
-------------------

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

必要な部品
------------------------------

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

.. image:: ../img/list_7_segment.png

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

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - 名前
        - このキットのアイテム
        - リンク
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

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

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - コンポーネントの紹介
        - 購入リンク

    *   - :ref:`cpn_gpio_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_7_segment`
        - |link_7segment_buy|
    *   - :ref:`cpn_74hc595`
        - |link_74hc595_buy|


回路図
---------------------

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
============ ======== ======== ===

.. image:: ../img/schematic_7_segment.png

実験手順
------------------------------

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

.. image:: ../img/image73.png

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

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/

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

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.4_7-Segment.py

コードを実行すると、7セグメントディスプレイに0-9、A-Fが表示されます。

**コード**

.. note::
    下のコードは **変更/リセット/コピー/実行/停止** ができます。しかし、それをする前に、ソースコードのパス ``raphael-kit/python`` に移動する必要があります。コードを変更した後、その効果を直接確認するために実行することができます。問題がないことを確認したら、変更したコードをコピーするためのコピーボタンを使用し、 ``nano`` コマンドでターミナルでのソースコードを開き、貼り付けることができます。

.. raw:: html

    <run></run>

.. code-block:: python

    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()

**コードの説明**

.. code-block:: python

    segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71]

0からFまでの16進数（共通カソード）のセグメントコード配列。 

.. code-block:: python

    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つのピンを出力として設定し、初期状態を低レベルにする。

.. code-block:: python

    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、これは真です。

.. code-block:: python

    GPIO.output(SRCLK, GPIO.HIGH)

SRCLKの初期値はLOWに設定されていましたが、ここではHIGHに設定されています。これは立ち上がりエッジのパルスを生成し、DSのデータをシフトレジスタにシフトするためです。

.. code-block:: python

    GPIO.output(RCLK, GPIO.HIGH)

RCLKの初期値はLOWに設定されていましたが、ここではHIGHに設定されています。これは立ち上がりエッジを生成し、シフトレジスタからストレージレジスタにデータをシフトするためです。

.. note::
    0~15までの数値の16進数形式は、(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B

現象の画像
------------------------

.. image:: ../img/image74.jpeg

