注釈

こんにちは、SunFounderのRaspberry Pi、Arduino、ESP32愛好者コミュニティへようこそ! Raspberry Pi、Arduino、ESP32について、他の愛好者と一緒にさらに深く学んでいきましょう。

なぜ参加するべきか?

  • 専門家サポート:コミュニティやチームから、販売後の問題や技術的な課題の解決をサポートします。

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

  • 限定プレビュー:新製品の発表や先行情報をいち早くゲットできます。

  • 特別割引:最新製品に対する限定割引を楽しめます。

  • フェスティブプロモーションとプレゼント企画:プレゼント企画や祝祭プロモーションに参加しましょう。

👉 一緒に探求し、創造してみませんか? [ここ] をクリックして今すぐ参加しましょう!

5.2 数字の表示

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

74HC595シフトレジスタと7セグメントディスプレイを組み合わせることで、PicoのGPIOピンをいくつかだけで全てのセグメントを制御でき、貴重なI/Oリソースを他のコンポーネントに節約できます。

必要なコンポーネント

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

全てを揃えたキットを購入するのが便利です。リンクはこちらです:

名前

キット内容

購入リンク

Pico 2 Wスターターキット

450+

Pico 2 W Kit

これらの部品を別々に購入することもできます。リンクは下記にあります。

番号

コンポーネントの紹介

数量

購入リンク

1

Pico 2 Wの概要

1

2

マイクロUSBケーブル

1

3

ブレッドボード

1

買う

4

ジャンパーワイヤー

数個

買う

5

抵抗器

1個(220Ω)

買う

6

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

1

買う

7

74HC595

1

買う

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

7セグメントディスプレイは、0から9までの数字を表示するために8の字型に配置された7つのLED(セグメント)から構成されています。また、8番目のLEDは小数点を表示するためのものです。各セグメントは a から g 、小数点は dp としてラベル付けされています。

以下がセグメントのラベルです:

img_7seg_cathode

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

回路図

sch_74hc_7seg

ここでの配線原理は基本的に 5.1 74HC595シフトレジスタの使用 と同じですが、違いはQ0-Q7が7セグメントディスプレイのa〜gピンに接続されている点です。

Wiring

74HC595

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

Q0

a

Q1

b

Q2

c

Q3

d

Q4

e

Q5

f

Q6

g

Q7

dp

配線

wiring_74hc_7seg

コードの記述

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

注釈

  • ファイル 5.2_number_display.inopico-2w-kit-main/arduino/5.2_number_display のパスで開くことができます。

  • または、このコードを Arduino IDE にコピーして使用してください。

  • アップロード ボタンをクリックする前に、ボード(Raspberry Pi Pico)と正しいポートを選択することを忘れないでください。

// 74HC595に接続されたピンを定義
const int DS = 0;    // GPIO 0 -> DS (ピン14)
const int SHCP = 1;  // GPIO 1 -> SHCP (ピン11)
const int STCP = 2;  // GPIO 2 -> STCP (ピン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秒間オフになり、再び順番に表示されます。

コードの理解

  1. 制御ピンの定義:

    • DS(データシリアル入力) : シリアルデータをシフトレジスタにシフトインするためのピン。

    • SHCP(シフトレジスタクロック入力) : データをシフトレジスタにシフトするためのピン。

    • STCP(ストレージレジスタクロック入力) : シフトレジスタから出力ピンへのデータロッチを制御するピン。

    const int DS = 0;    // GPIO 0 -> DS (ピン14)
    const int SHCP = 2;  // GPIO 2 -> SHCP (ピン11)
    const int STCP = 1;  // GPIO 1 -> STCP (ピン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には高レベルを、a、d、e、f、g、dgには低レベルを設定する必要があります。

img_1_segment

つまり、バイナリ値「00000110」を書き込む必要があります。読みやすさのために、16進数表記で「0x06」を使用します。

  1. setup関数:

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

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

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

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

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

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

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

      • データをシフトアウトした後、 STCPHIGH に設定して、データを出力ピンにロッチします。

      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: セグメントa, b, c, d, e, f(コード0x3F)

  • 1: セグメントb, c(コード0x06)

  • 2: セグメントa, b, g, e, d(コード0x5B)

  • 3: セグメントa, b, c, d, g(コード0x4F)

  • 4: セグメントb, c, f, g(コード0x66)

  • 5: セグメントa, c, d, f, g(コード0x6D)

  • 6: セグメントa, c, d, e, f, g(コード0x7D)

  • 7: セグメントa, b, c(コード0x07)

  • 8: セグメントa, b, c, d, e, f, g(コード0x7F)

  • 9: セグメントa, b, c, d, f, g(コード0x6F)

さらなる探索

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

    複数の74HC595シフトレジスタを接続して、さらに多くの7セグメントディスプレイを制御し、複数桁のディスプレイを作成します。

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

    シフトレジスタに送信するデータパターンを変更して、動的なアニメーションやスクロールテキストを作成します。

  • センサーとの統合:

    7セグメントディスプレイとセンサー(温度や光など)を組み合わせて、リアルタイムデータを表示します。

  • デジタル時計の作成:

    複数の7セグメントディスプレイとリアルタイムクロックモジュールを使用して、実際に動作するデジタル時計を作成します。

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

    小数点(dp)や追加のインジケーター(コロンなど)を使用して、より複雑な表示を作成します。

結論

このレッスンでは、Raspberry Pi Picoと74HC595シフトレジスタを使用して、7セグメントディスプレイを制御する方法を学びました。シリアルデータをシフトレジスタに送信することで、少数のGPIOピンだけで複数の出力を効率的に管理できるようになり、I/Oリソースを節約しながら、さらに多くのLED、ディスプレイ、またはその他の周辺機器を追加する可能性を広げました。