18x6 LEDドライバーモジュールを使って4桁7セグメントLEDを4個接続する

今回紹介するのは下記のように HT16K33 マトリクスドライバーモジュールを使って４個の4桁7セグメントLED (カソードコモン) を接続する方法です。

複数の測定データを表示するために4桁7セグメントLEDを使うメリットは、かなり離れた(室内で大体7〜8メートル位)ところからでも昼夜とわずはっきりと視認できることです。

![WeatherDataDisplay_overview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/5267faad-93e1-3d1a-6ae3-5f8c8b4f7aa6.jpeg)

### 動作環境

+ Raspberry Pi zero WH
    + 別途 I2C バス用電圧レベル変換モジュールが必要
    ※ 秋月電子: I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
+ 表示制御プログラム: python 3.7 (pigpioライブラリ使用)

### 使用部品
+ 18x6 LEDドライバーモジュール(HT16K33) x 1個
※秋月電子 (型番 AE-HT16K33)
+ ダイナミック接続4桁赤色7セグメントLED表示器 x 4個
※カソードコモン
+ LED用制限抵抗(表面実装) 330Ω x 24個
※4桁7セグメントLED 簡易化基板使用

### 参考書

<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/029949f9-167a-5a22-c5c6-9bc6d256f022.jpeg">

**「Raspberry Pi 電子工作 実践講座 改訂第2版」[株式会社ソーテック社]**
+ Chapter 8 数字や文字などを表示するデバイスの制御
    + Section 8-1 数字を表示する (7セグメントLED)
        + **HT16K33を使って7セグメントLEDを点灯する**

### 参考サイト

+ 2個の4桁7セグメントLEDを使った例を紹介しているサイト
[カソードコモンの８セグメントLEDへ表示する(HT16K33を使う) <br>※[保護されていない通信] とアドレスバーに表示されます](http://nopnop2002.starfree.jp/8SEG-LED/8SEG-HT16K33.html)

+ 1桁7セグメントLEDを8個使った例を紹介しているサイト
[少し大きめの７セグLEDを８個つなぎI2Cシリアル接続で動かしてみた](https://ameblo.jp/pta55/entry-12754949745.html)

### ドキュメント

+ 秋月電子
    + (1) [データシート(HT16K33) (PDFドキュメント)](https://akizukidenshi.com/goodsaffix/ht16K33v110.pdf)
    + (2) [マニュアル (PDFドキュメント)](https://akizukidenshi.com/goodsaffix/AE-HT16K33.pdf)


データシート(1)のメモリーレイアウトより最大4個の4桁7セグメントLEDに出力するメモリを持っていることがわかります。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/7f4085d7-78d8-3e03-33c2-fd095e637915.jpeg">

### 1. 接続方法

#### 1-1. 4桁7セグメントLEDのピン番号と接続例

ポイントは4個の4桁7セグメントLED(カソードコモン)を下記のように並列接続することです。

LED1のデータ送信完了後に次のLED2のデータを送信するというように、順次データを送信するようにすれば目的のLEDに誤ったデータが表示されることはありません。

<img width="650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/90f8a851-8de4-e3cf-f03f-e0c3cb8f7ca9.jpeg">

#### 1-2. ドライバーモジュールと4桁7セグメントLEDの接続一覧

それぞれの4桁7セグメントLEDのピンとドライバーモジュールのピンとの接続箇所を整理した一覧です。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/7fc16825-3772-d747-6cc2-5c048ae35419.jpeg">

#### 1-3. 配線イメージ (Fritzing)

上記 1-2の接続一覧を元に具体的な配線イメージを Fritzing で作成したものです。

![WeatherDataDisplay_withHt16k33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/0d080d5f-e2e9-4f69-6b0e-cb93bacb06e4.png)

### 2. ブレッドボード上で検証

各部品の接続(配線)が正しく動作することをブレッドボードを使って予め検証します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/d4eae093-88f0-4388-b316-b33c4a809c71.jpeg">

### 3. ユニバーサル基板を使って組み立てる

上記 2のブレッドボード上での検証を見ての通り、通常のLED用制限抵抗(1/4w)を使った4桁7セグメントLEDをユニバーサル基板上にコンパクトに配置するのは大変です。

今回はスイッチサイエンスさんで販売している「4桁セグメントLED 簡易化基板(外側)」を使うことにしました。
[スイッチサイエンス: 4桁7セグメントLED 簡易化基板（外側）](https://www.switch-science.com/products/4067)

#### 3-1. 4桁7セグメントLED 簡易化基板

最近はリフロー半田という方法もあるようですが、オーソドックスに普通の半田付を行いしました。
※表面実装の抵抗は紛失しやすいので浅めの箱の中で作業するのがお薦めです。

ハンダ付けした基板の抵抗が見えない面を上にして4桁7セグメントLEDに被せます。
※被せる前に予めテスターではんだ付けした箇所の抵抗値を確認します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/d03f7182-9c8f-b0b0-881f-d1679ec23748.jpeg">

#### 3-2. ハンダ付け完了 (背面)

見てのとおりですが組み立ては難易度が高いものになります。ただし簡易化基板を使った分スッキリしています。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/9c688d7b-ff34-3b6c-a16e-51b7112c91e1.jpeg">

実際に背面でハンダ付け作業を行うとき初心者 (私も含め) には 1-3 に示した回路イメージで組み立てるのは大変です。

ひと手間かかりますが下記のような手書きの背面配線図を作成することをおすすめします。
※ハンダ不良で部品を交換する場合にも役に立ちます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583120/d6211555-8aa4-8ca3-cee9-28f341a4fdfb.jpeg">

+ この記事の元ネタページ (GitHub pages)
[HT16K33モジュールで4個の7セグ4桁LEDに数値を出力する](https://pipito-yukio.github.io/home_weather_sensors/52_displayWeatherDataBoard.html)

+ 気象データ表示板を含むシステム概要
[ラズベリーパイによる家庭用気象データ監視システム](https://github.com/pipito-yukio/home_weather_sensors?tab=readme-ov-file)

+ 気象データ表示板の制御プログラム (Pythonソースコード)
 [pipito-yukio/home_weather_sensors/raspi_zero](https://github.com/pipito-yukio/home_weather_sensors/tree/master/raspi_zero)