.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
.. _1.1.6_py_pi5:
1.1.6 LEDドットマトリックス
============================================
はじめに
--------------------
その名前からも分かるように、LEDドットマトリックスはLEDで構成されたマトリックスです。
LEDの点灯と消灯によって、異なる文字やパターンを形成します。
必要なコンポーネント
------------------------------
このプロジェクトでは、以下のコンポーネントが必要です。
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_list.png
:width: 800
:align: center
.. raw:: html
原理
----------------
**LEDドットマトリックス**
一般的に、LEDドットマトリックスは2つのタイプに分類されます:共通陰極(CC)と共通陽極(CA)。外観は似ていますが、内部に違いがあります。テストで区別できます。このキットではCAタイプが使用されています。サイドにラベル「788BS」と表示されています。
以下の図をご覧ください。ピンは背面の2つの端に配置されています。ラベル側を参照してください:この端のピンはピン1から8で、もう一方はピン9から16です。
外部ビュー:
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_1.png
:width: 400
:align: center
以下の図は内部構造を示しています。CA LEDドットマトリックスでは、ROWはLEDの陽極を表し、COLは陰極です。CCの場合は逆です。共通点は、両方のタイプともに、ピン13、3、4、10、6、11、15、16がすべてCOLであり、ピン9、14、8、12、1、7、2、5がすべてROWであることです。左上隅の最初のLEDを点灯させたい場合、CA LEDドットマトリックスの場合、ピン9をHighに設定してピン13をLowに、CCの場合はピン13をHighに設定してピン9をLowにします。最初の列全体を点灯させたい場合、CAの場合、ピン13をLowにし、ROW 9、14、8、12、1、7、2、5をHighに設定し、CCの場合、ピン13をHighにし、ROW 9、14、8、12、1、7、2、5をLowに設定します。理解を深めるために、以下の図を参考にしてください。
内部ビュー:
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_2.png
:width: 400
:align: center
上記の行と列に対応するピン番号:
=========== ====== ====== ===== ====== ===== ====== ====== ======
**COL** **1** **2** **3** **4** **5** **6** **7** **8**
**Pin No.** **13** **3** **4** **10** **6** **11** **15** **16**
**ROW** **1** **2** **3** **4** **5** **6** **7** **8**
**Pin No.** **9** **14** **8** **12** **1** **7** **2** **5**
=========== ====== ====== ===== ====== ===== ====== ====== ======
さらに、ここでは2つの74HC595チップを使用しています。1つはLEDドットマトリックスの行を制御し、もう1つは列を制御します。
回路図
-----------------------
============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17 Pin 11 0 17
GPIO18 Pin 12 1 18
GPIO27 Pin 13 2 27
============ ======== ======== ===
.. image:: ../python_pi5/img/1.1.6_led_dot_matrix_schematic.png
:width: 800
実験手順
----------------------------
**ステップ1:** 回路を組み立てます。配線が複雑なので、ステップバイステップで進めましょう。まず、T-Cobbler、LEDドットマトリックス、および2つの74HC595チップをブレッドボードに挿入します。T-Cobblerの3.3VとGNDをボードの両側の穴に接続し、次に2つの74HC595チップのピン16と10をVCCに、ピン13とピン8をGNDに接続します。
.. note::
上記のFritzingイメージでは、ラベルが下にある側です。
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_1.png
:width: 800
**ステップ2:** 2つの74HC595のピン11を一緒に接続し、次にGPIO27に接続します。次に、2つのチップのピン12を接続し、GPIO18に接続します。その後、左側の74HC595のピン14をGPIO17に、ピン9を2番目の74HC595のピン14に接続します。
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_2.png
:width: 800
**ステップ3:** 右側の74HC595はLEDドットマトリックスの列を制御します。以下のテーブルを参照してマッピングを確認してください。したがって、74HC595のQ0-Q7ピンは、ピン13、3、4、10、6、11、15、16とそれぞれマッピングされています。
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **74HC595** | **Q0** | **Q1** | **Q2** | **Q3** | **Q4** | **Q5** | **Q6** | **Q7** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **LED Dot Matrix** | **13** | **3** | **4** | **10** | **6** | **11** | **15** | **16** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_3.png
:width: 800
**ステップ4:** さて、LEDドットマトリックスのROWを接続します。左側の74HC595がLEDドットマトリックスのROWを制御します。以下のテーブルを参照してマッピングを確認してください。左側の74HC595のQ0-Q7は、ピン9、14、8、12、1、7、2、5とそれぞれマッピングされています。
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **74HC595** | **Q0** | **Q1** | **Q2** | **Q3** | **Q4** | **Q5** | **Q6** | **Q7** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
| **LED Dot Matrix** | **9** | **14** | **8** | **12** | **1** | **7** | **2** | **5** |
+--------------------+--------+--------+--------+--------+--------+--------+--------+--------+
.. image:: ../python_pi5/img/1.1.6_LedMatrix_circuit_4.png
:width: 800
**ステップ5:** コードファイルを開きます。
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**ステップ6:** 実行します。
.. raw:: html
.. code-block::
sudo python3 1.1.6_led_dot_matrix.py
コードを実行すると、LEDドットマトリックスが一列ずつ点灯し、列ごとに消灯します。
.. warning::
エラー メッセージ ``RuntimeError: Cannot determine SOC peripheral base address`` が表示された場合は、 :ref:`faq_soc` を参照してください。
**コード**
.. note::
以下のコードは **変更/リセット/コピー/実行/停止** することができます。ただし、それを行う前に「davinci-kit-for-raspberry-pi/python-pi5」というソースコードのパスに移動する必要があります。コードを変更した後、そのまま実行して効果を確認できます。問題がないことを確認したら、修正されたコードをコピーするためのCopyボタンを使用し、ターミナルで「nano」コマンドを使用してソースコードを開き、コードを貼り付けることができます。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
# Define GPIO pins connected to the 74HC595 shift register
SDI = OutputDevice(17) # Serial Data Input
RCLK = OutputDevice(18) # Register Clock
SRCLK = OutputDevice(27) # Shift Register Clock
# Define patterns for matrix display; ROWs are anodes (+), COLs are cathodes (-)
# Pattern for ROWs (anode signals)
code_H = [0x01, 0xff, 0x80, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
# Pattern for COLs (cathode signals)
code_L = [0x00, 0x7f, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f]
# Shift data to 74HC595
def hc595_shift(dat):
""" Shift data to the 74HC595 shift register for displaying on the matrix. """
for i in range(8):
# Set SDI value and trigger shift register clock
SDI.value = 0x80 & (dat << i)
SRCLK.on()
SRCLK.off()
# Trigger register clock to update display
RCLK.on()
sleep(0.001)
RCLK.off()
def main():
""" Main loop for cycling through display patterns. """
while True:
# Cycle through patterns in ascending order
for i in range(len(code_H)):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
# Cycle through patterns in descending order
for i in range(len(code_H)-1, -1, -1):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
# Run main loop, handle keyboard interrupt gracefully
try:
main()
except KeyboardInterrupt:
pass
**コードの説明**
1. このスニペットは、プロジェクトのために必要なクラスをインポートします。 ``gpiozero`` からの ``OutputDevice`` は、GPIOピンに接続されたハードウェアコンポーネントを制御するために使用され、 ``time`` からの ``sleep`` は遅延を追加するために使用されます。
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
2. このセクションでは、74HC595シフトレジスタに接続されたGPIOピンを初期化します。 ``SDI`` はシリアルデータ入力、 ``RCLK`` はレジスタクロック、 ``SRCLK`` はシフトレジスタクロックです。これらのピンはデータをレジスタにシフトし、LEDマトリクスの表示を制御するために使用されます。
.. code-block:: python
# 74HC595シフトレジスタに接続されたGPIOピンを定義
SDI = OutputDevice(17) # シリアルデータ入力
RCLK = OutputDevice(18) # レジスタクロック
SRCLK = OutputDevice(27) # シフトレジスタクロック
3. ``code_H`` と ``code_L`` は、LEDマトリクスの行(陽極)と列(陰極)を制御するための2進パターンを定義します。これらの配列の各要素は、マトリクス内のどのLEDがオンまたはオフになるかを制御する2進パターンを表します。
.. code-block:: python
# マトリクス表示のためのパターンを定義します。行は陽極(+)、列は陰極(-)です。
# 行のパターン(陽極信号)
code_H = [0x01, 0xff, 0x80, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
# 列のパターン(陰極信号)
code_L = [0x00, 0x7f, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f]
4. この関数は、バイトデータ( ``dat`` )を74HC595シフトレジスタにシフトします。バイト内の各ビットに対して、ビット値に基づいて ``SDI`` ピンを高または低に設定し、ビットをレジスタにシフトするために ``SRCLK`` ピンをトグルさせます。すべてのビットがシフトされた後、LEDマトリクスの表示を更新するために ``RCLK`` ピンをトグルさせます。
.. code-block:: python
# データを74HC595にシフト
def hc595_shift(dat):
""" マトリクスに表示するためのデータを74HC595シフトレジスタにシフトします。 """
for i in range(8):
# SDIの値を設定してシフトレジスタクロックをトリガー
SDI.value = 0x80 & (dat << i)
SRCLK.on()
SRCLK.off()
# レジスタクロックをトリガーして表示を更新
RCLK.on()
sleep(0.001)
RCLK.off()
5. メイン関数には、LEDマトリクスの事前定義されたパターンを無限ループで循環させるコードが含まれています。 ``hc595_shift`` 関数を使用してシフトレジスタに行と列のパターン( ``code_H`` と ``code_L`` )を送信し、昇順で最初に、次に降順で表示を作成します。
.. code-block:: python
def main():
""" 表示パターンを循環させるためのメインループ。 """
while True:
# 昇順でパターンを循環させます
for i in range(len(code_H)):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
# 降順でパターンを循環させます
for i in range(len(code_H)-1, -1, -1):
hc595_shift(code_L[i])
hc595_shift(code_H[i])
sleep(0.1)
6. このセグメントは、プログラムがキーボード割り込み(Ctrl+C)を使用して中断できるようにします。メインループを中断する際に急激な停止やリソースの漏洩が発生しないようにします。
.. code-block:: python
# メインループを実行し、キーボード割り込みを丁寧に処理します
try:
main()
except KeyboardInterrupt:
pass