注釈

こんにちは!SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ(Facebook)へようこそ!Raspberry Pi、Arduino、ESP32 に関する知識を深め、仲間たちと一緒に楽しみましょう。

参加するメリット

  • 専門的なサポート:購入後の問題や技術的な課題を、コミュニティメンバーやチームのサポートで解決。

  • 学びと共有:ヒントやチュートリアルを交換し、スキルを向上。

  • 最新情報の先行公開:新製品の発表やプレビューをいち早くチェック。

  • 特別割引:最新製品を会員限定の特別価格で購入可能。

  • イベント & プレゼント企画:プレゼントキャンペーンや季節ごとのプロモーションに参加可能。

👉 一緒にものづくりを楽しみましょう![こちら] をクリックして、今すぐ参加!

5.2 数字の表示

このレッスンでは、 7セグメントディスプレイ74HC595シフトレジスタ を使用して、Raspberry Pi Pico 2 で数字を表示する方法を学びます。7セグメントディスプレイは、デジタル時計、電卓、家電製品などで数値情報を表示するために広く使用される電子部品です。

74HC595シフトレジスタを組み合わせることで、Pico の少数の GPIO ピンだけで7セグメントディスプレイの全セグメントを制御でき、他のコンポーネントのための I/O 資源を節約できます。

必要なもの

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

すべて揃ったキットを購入すると便利です。リンクはこちら:

名称

キットに含まれるアイテム

リンク

Newton Lab Kit

450点以上

Newton Lab Kit

個別に購入する場合は、以下のリンクからどうぞ。

SN

コンポーネント

数量

リンク

1

Raspberry Pi Pico 2

1

購入

2

Micro USB ケーブル

1

3

ブレッドボード

1

購入

4

ジャンパーワイヤー

数本

購入

5

抵抗器

1 (220Ω)

購入

6

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

1

購入

7

74HC595

1

購入

7セグメントディスプレイの仕組み

7セグメントディスプレイは、0〜9の数字を表示するために、 a から g の7つのLEDセグメントが「8の字」型に配置されている部品です。さらに、小数点を表示するための dp という8つ目のLEDも搭載されています。

こちらが各セグメントのラベルです:

img_7seg_cathode

共通カソード の7セグメントディスプレイでは、すべてのカソード(負極)が共通のグランド(GND)に接続されています。

回路図

sch_74hc_7seg

この回路の基本的な配線原理は、 5.1 74HC595シフトレジスタの使用方法 の場合とほぼ同じですが、Q0~Q7が7セグメントディスプレイの a ~ g ピンに接続されている点が異なります。

Wiring

74HC595

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

Q0

a

Q1

b

Q2

c

Q3

d

Q4

e

Q5

f

Q6

g

Q7

dp

配線図

wiring_74hc_7seg

コードの作成

このコードでは、74HC595シフトレジスタにシリアルデータを送信し、7セグメントディスプレイを制御します。 ディスプレイは0から9までの数字を順番に表示します。

注釈

  • 5.2_number_display.inonewton-lab-kit/arduino/5.2_number_display から開くことができます。

  • または、このコードを Arduino IDE にコピーして使用できます。

  • Raspberry Pi Pico 2 ボードと適切なポートを選択し、「アップロード」をクリックしてください。

// 74HC595 に接続するピンを定義
const int DS = 0;    // GPIO 0 -> DS (Pin 14)
const int SHCP = 1;  // GPIO 1 -> SHCP (Pin 11)
const int STCP = 2;  // GPIO 2 -> STCP (Pin 12)

// 7セグメントディスプレイに表示する数字 0-9 の 16進数コード
const byte numArray[] = {
  0x3F, // 0: 00111111
  0x06, // 1: 00000110
  0x5B, // 2: 01011011
  0x4F, // 3: 01001111
  0x66, // 4: 01100110
  0x6D, // 5: 01101101
  0x7D, // 6: 01111101
  0x07, // 7: 00000111
  0x7F, // 8: 01111111
  0x6F  // 9: 01101111
};

void setup() {
  // 制御ピンを出力に設定
  pinMode(DS, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT);
}

void loop() {
  // 0から9まで順番に表示
  for (int num = 0; num < 10; num++) {
    // データをセットするため STCP を LOW にする
    digitalWrite(STCP, LOW);

    // シフトレジスタにデータを送信
    shiftOut(DS, SHCP, MSBFIRST, numArray[num]);

    // STCP を HIGH にしてデータを出力ピンに適用
    digitalWrite(STCP, HIGH);

    delay(1000); // 1秒間表示
  }

  // 0-9を表示後、すべてのセグメントをオフにする
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, MSBFIRST, 0x00);
  digitalWrite(STCP, HIGH);
  delay(1000);
}

コードをアップロードすると、ディスプレイは0から9までの数字を順番に1秒間表示します。 9まで表示した後、すべてのセグメントをオフにして1秒待ち、再び0からカウントを開始します。

コードの理解

  1. 制御ピンの定義:

    • DS (Data Serial Input): シフトレジスタにシリアルデータを受信する。

    • SHCP (Shift Register Clock Input): シフトレジスタへのデータシフトを制御する。

    • STCP (Storage Register Clock Input): シフトレジスタから出力ピンへのデータラッチを制御する。

    const int DS = 0;    // GPIO 0 -> DS (Pin 14)
    const int SHCP = 2;  // GPIO 2 -> SHCP (Pin 11)
    const int STCP = 1;  // GPIO 1 -> STCP (Pin 12)
    
  2. データパターンの作成:

    • numArray: 共通カソード7セグメントディスプレイで0~9を表示するための16進コードを格納する配列。

    • 各16進数値は、特定の数字を表示するために点灯させる必要があるセグメントに対応。

    const byte numArray[] = {
      0x3F, // 0: 00111111
      0x06, // 1: 00000110
      0x5B, // 2: 01011011
      0x4F, // 3: 01001111
      0x66, // 4: 01100110
      0x6D, // 5: 01101101
      0x7D, // 6: 01111101
      0x07, // 7: 00000111
      0x7F, // 8: 01111111
      0x6F  // 9: 01101111
    };
    

    例えば、7セグメントディスプレイに「1」を表示する場合、b, c をHIGHにし、a, d, e, f, g, dp をLOWにする必要があります。

    img_1_segment

    つまり、バイナリ値「00000110」を設定する必要があり、可読性のために16進表記の「0x06」を使用します。

  3. セットアップ関数:

    • DSSHCPSTCP ピンを出力として設定し、シフトレジスタにデータを送信する準備を行う。

    void setup() {
      // 制御ピンを出力として設定
      pinMode(DS, OUTPUT);
      pinMode(SHCP, OUTPUT);
      pinMode(STCP, OUTPUT);
    }
    
  4. ループ関数: numArray 配列の各パターンを for ループで順番に表示。

    • データのシフトアウト:

      • shiftOut は1ビットずつデータを送信。

      • MSBFIRST は最上位ビットから送信することを示す。

      shiftOut(DS, SHCP, MSBFIRST, numArray[num]);
      
    • データのラッチ:

      • STCPLOW に設定し、シフトレジスタに新しいデータを準備。

      • データを送信後、 STCPHIGH にして7セグメントディスプレイの出力ピンに適用。

      digitalWrite(STCP, LOW);
      // shiftOut(...)
      digitalWrite(STCP, HIGH);
      
    • delay(500); を挿入し、各数字の視認性を高めるために0.5秒の遅延を追加。

    • すべてのセグメントをオフにする: 0~9を表示した後、 0x00 を送信してすべてのセグメントをオフにする。ディスプレイは1秒間オフになり、ループが繰り返される。

      digitalWrite(STCP, LOW);
      shiftOut(DS, SHCP, MSBFIRST, 0x00);
      digitalWrite(STCP, HIGH);
      delay(1000);
      

トラブルシューティング

  • 数字が表示されない場合:

    • 配線をすべて確認する。

    • 74HC595が適切に電源供給されていることを確認する。

    • PicoのGPIOピンがシフトレジスタに正しく接続されていることを確認する。

    • 7セグメントディスプレイが正しく接続されており、各セグメントに適切な抵抗が入っていることを確認する。

  • 表示される数字が間違っている場合:

    • numArray 配列の16進コードを再確認する。

    • シフトレジスタの出力が正しいセグメントに接続されていることを確認する。

  • ちらつきや不安定な表示がある場合:

    • 電源接続が安定しているか確認する。

    • 各セグメントの電流制限抵抗が適切に接続されていることを確認する。

セグメントコードの理解

各セグメントコードは、特定の数字を表示するために点灯する必要があるセグメントに対応します。

  • 0: Segments a, b, c, d, e, f (code 0x3F)

  • 1: Segments b, c (code 0x06)

  • 2: Segments a, b, g, e, d (code 0x5B)

  • 3: Segments a, b, c, d, g (code 0x4F)

  • 4: Segments b, c, f, g (code 0x66)

  • 5: Segments a, c, d, f, g (code 0x6D)

  • 6: Segments a, c, d, e, f, g (code 0x7D)

  • 7: Segments a, b, c (code 0x07)

  • 8: Segments a, b, c, d, e, f, g (code 0x7F)

  • 9: Segments a, b, c, d, f, g (code 0x6F)

さらに探求しよう

  • 複数の7セグメントディスプレイを制御する

    • 74HC595シフトレジスタを複数連結し、複数の7セグメントディスプレイを制御。

  • LEDアニメーションの実装

    • データパターンを変更し、動的なアニメーションやスクロールテキストを作成。

  • センサーとの統合

    • 温度センサーや光センサーと組み合わせて、リアルタイムデータを表示。

  • デジタル時計の作成

    • 複数の7セグメントディスプレイとリアルタイムクロック(RTC)モジュールを使用し、デジタル時計を構築。

  • 小数点やインジケーターの追加

    • 小数点(dp)やコロン(:)などの追加インジケーターを使用して、より複雑なディスプレイを作成。

結論

このレッスンでは、 Raspberry Pi Pico と 74HC595 シフトレジスタ を使用して 7セグメントディスプレイ を制御する方法を学びました。シフトレジスタにシリアルデータを送信することで、限られたGPIOピンで複数の出力を効果的に管理できます。この技術を利用することで、より多くのLEDやディスプレイ、その他の周辺機器を追加してプロジェクトを拡張することが可能になります。