注釈

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

なぜ参加するべきか?

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

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

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

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

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

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

5.1 74HC595シフトレジスタの使用

このレッスンでは、 74HC595シフトレジスタ を使用して、Raspberry Pi Pico 2 WのわずかなGPIOピンで複数のLEDを制御する方法を学びます。74HC595は、シリアル入力を使用してデジタル出力の数を拡張できる集積回路(IC)で、多くの出力を制御したいがGPIOピンが限られている場合に非常に役立ちます。

必要なコンポーネント

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

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

名前

キット内容

購入リンク

Pico 2 Wスターターキット

450+

Pico 2 W Kit

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

番号

コンポーネントの紹介

数量

購入リンク

1

Pico 2 Wの概要

1

2

マイクロUSBケーブル

1

3

ブレッドボード

1

買う

4

ジャンパーワイヤー

数個

買う

5

抵抗器

8個(220Ω)

買う

6

LED

8個

買う

7

74HC595

1

買う

74HC595シフトレジスタの理解

74HC595 は、8ビットのシリアルイン、パラレルアウトシフトレジスタで、出力ラッチ機能を持っています。シリアルデータ入力を受け取り、それをパラレル出力に変換することで、PicoのGPIOピン3本だけで8つの出力を制御できます。

74HC595の主なピン:

img_74jc595_pin

  • DS(ピン14): シリアルデータ入力

  • SHCP(ピン11): シフトレジスタクロック入力

  • STCP(ピン12): ストレージレジスタクロック入力(ラッチピン)

  • OE(ピン13): 出力イネーブル(アクティブロー、GNDに接続)

  • MR(ピン10): マスタリセット(アクティブロー、3.3Vに接続)

  • Q0-Q7(ピン15、1-7): パラレル出力

  • VCC(ピン16): 3.3Vに接続

  • GND(ピン8): GNDに接続

回路図

sch_74hc_led

配線

wiring_74hc_led

コードの記述

Picoからシリアルデータを送信して、74HC595シフトレジスタに接続されたLEDを制御するプログラムを作成します。LEDは順番に1つずつ点灯します。

注釈

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

  • または、このコードを 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)

// LEDを制御するためのバイナリパターンの配列
int datArray[] = {
  0b00000000, // すべてのLEDオフ
  0b00000001, // LED 0オン
  0b00000011, // LED 0と1オン
  0b00000111, // LED 0, 1, 2オン
  0b00001111, // LED 0, 1, 2, 3オン
  0b00011111, // LED 0から4オン
  0b00111111, // LED 0から5オン
  0b01111111, // LED 0から6オン
  0b11111111  // すべてのLEDオン
};

void setup() {
  // 制御ピンを出力として初期化
  pinMode(DS, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT);
}

void loop() {
  // datArray内の各パターンを順番に表示
  for (int num = 0; num < 9; num++) {
    // データ準備のためSTCPをLOWに設定
    digitalWrite(STCP, LOW);

    // データをシフトレジスタにシフトアウト
    shiftOut(DS, SHCP, MSBFIRST, datArray[num]);

    // STCPをHIGHに設定して、データを出力ピンにロッチ
    digitalWrite(STCP, HIGH);

    delay(500); // 次のパターンに進む前に0.5秒待機
  }

  // シーケンス終了後、すべてのLEDをオフにする
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, MSBFIRST, 0b00000000);
  digitalWrite(STCP, HIGH);
  delay(500);
}

コードをアップロードした後、74HC595に接続されたLEDは順番に点灯し、 datArray に定義されたパターンに従って動作します。 すべてのLEDが点灯した後、順番にオフになり、再度シーケンスが始まります。

コードの理解

  1. 制御ピンの定義:

    • DS(データシリアル入力) : シリアルデータを受け取ります。

    • SHCP(シフトレジスタクロック入力) : データをシフトレジスタにシフトします。

    • STCP(ストレージレジスタクロック入力) : データを出力ピンにロッチして表示を更新します。

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

    • 配列 datArray は、LEDを制御するための異なるバイナリパターンを保持します。

    • 各ビットはLEDの状態を表します(1はオン、0はオフ)。

    int datArray[] = {
      0b00000000, // すべてのLEDオフ
      0b00000001, // LED 0オン
      0b00000011, // LED 0と1オン
      0b00000111, // LED 0, 1, 2オン
      0b00001111, // LED 0, 1, 2, 3オン
      0b00011111, // LED 0から4オン
      0b00111111, // LED 0から5オン
      0b01111111, // LED 0から6オン
      0b11111111  // すべてのLEDオン
    };
    
  3. setup関数:

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

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

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

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

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

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

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

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

      digitalWrite(STCP, LOW);
      // shiftOut(...)
      digitalWrite(STCP, HIGH);
      
    • 遅延:

      delay(500); で各パターンの表示の間に0.5秒の遅延を追加します。

    • LEDをオフにする:

      すべてのパターンを表示した後、0b00000000を送信してすべてのLEDをオフにします。

      digitalWrite(STCP, LOW);
      shiftOut(DS, SHCP, MSBFIRST, 0b00000000);
      digitalWrite(STCP, HIGH);
      delay(500);
      

トラブルシューティング

  • LEDが点灯しない:

    • すべての配線接続を確認してください。

    • 74HC595が正しく電源に接続されていることを確認してください。

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

  • LEDの挙動が正しくない:

    • datArray 内のバイナリパターンを再確認してください。

    • 抵抗がLEDに正しく配置されていることを確認してください。

さらなる探索

  • 他のデバイスの制御:

    74HC595を使用して、リレーやモーターなどの高電力デバイスを制御します。

  • シフトレジスタのチェーン接続:

    複数の74HC595を直列に接続して、同じ3つのGPIOピンでさらに多くの出力を制御します。

  • LEDパターンの作成:

    datArray を変更して、より複雑なLEDアニメーションやパターンを作成します。

  • センサーとの統合:

    シフトレジスタをさまざまなセンサーと組み合わせて、反応的でインタラクティブなシステムを作成します。

  • LEDマトリックスディスプレイの作成:

    複数のシフトレジスタを使用して、大きなLEDマトリックスを作成し、ディスプレイや看板に利用します。

結論

このレッスンでは、Raspberry Pi Picoと74HC595シフトレジスタを使用して、わずか3つのGPIOピンで複数のLEDを制御する方法を学びました。この技術を使うことで、デジタル出力の数を拡張でき、GPIOリソースを追加で使用することなく、より複雑でインタラクティブなプロジェクトを作成できるようになります。シリアルデータを送信し、それをパラレル出力にロッチする方法を理解することで、電子プロジェクトで複数のアクチュエータやディスプレイ、その他の周辺機器を効率的に管理することができます。