注釈

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

参加するメリット

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

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

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

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

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

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

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

このレッスンでは、 74HC595シフトレジスタ を使用して、Raspberry Pi Pico 2 のわずかな GPIO ピンで複数の LED を制御する方法を学びます。 74HC595 は、シリアル入力を並列出力に変換することができる集積回路(IC)であり、GPIO ピンが限られている場合に、多数の出力を制御するのに非常に便利です。

必要なもの

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

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

名称

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

リンク

Newton Lab Kit

450点以上

Newton Lab Kit

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

SN

コンポーネント

数量

リンク

1

Raspberry Pi Pico 2

1

購入

2

Micro USB ケーブル

1

3

ブレッドボード

1

購入

4

ジャンパーワイヤー

数本

購入

5

抵抗器

8 (220Ω)

購入

6

LED

8

購入

7

74HC595

1

購入

74HC595シフトレジスタの仕組み

74HC595 は、 8ビットのシリアル入力・並列出力 を持つシフトレジスタで、出力ラッチを備えています。 シリアルデータを入力し、並列出力へ変換できるため、Pico の 3 本の GPIO ピンだけで 8 つの出力を制御できます。

74HC595 の主要ピン:

img_74jc595_pin

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

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

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

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

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

  • Q0-Q7 (Pins 15, 1-7): 並列出力ピン

  • VCC (Pin 16): 3.3V に接続

  • GND (Pin 8): GND に接続

回路図

sch_74hc_led

配線図

wiring_74hc_led

コードの記述

Raspberry Pi Pico からシリアルデータを送信し、74HC595 シフトレジスタを介して LED を順番に点灯させるプログラムを作成します。

注釈

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

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

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

// 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)

// LED を制御するバイナリパターン
int datArray[] = {
  0b00000000, // All LEDs off
  0b00000001, // LED 0 on
  0b00000011, // LEDs 0 and 1 on
  0b00000111, // LEDs 0, 1, and 2 on
  0b00001111, // LEDs 0, 1, 2, and 3 on
  0b00011111, // LEDs 0 to 4 on
  0b00111111, // LEDs 0 to 5 on
  0b01111111, // LEDs 0 to 6 on
  0b11111111  // All LEDs on
};

void setup() {
  // Initialize the control pins as outputs
  pinMode(DS, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT);
}

void loop() {
  // Iterate through each pattern in datArray
  for (int num = 0; num < 9; num++) {
    // Set STCP to LOW to prepare for data
    digitalWrite(STCP, LOW);

    // Shift out the data to the shift register
    shiftOut(DS, SHCP, MSBFIRST, datArray[num]);

    // Set STCP to HIGH to latch the data to the output pins
    digitalWrite(STCP, HIGH);

    delay(500); // Wait for half a second before the next pattern
  }

  // Turn off all LEDs after the sequence
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, MSBFIRST, 0b00000000);
  digitalWrite(STCP, HIGH);
  delay(500);
}

コードをアップロードすると、 datArray に定義されたパターンに従い、74HC595 に接続された LED が順番に点灯します。 すべての LED が点灯した後、順番に消灯します。

コードの理解

  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 = 1; // GPIO 1 -> SHCP (Pin 11)
    const int STCP = 2; // GPIO 2 -> STCP (Pin 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. セットアップ関数:

    DS, SHCP, STCP ピンを出力として設定し、シフトレジスタにデータを送信できるようにする。

    void setup() {
      // Initialize the control pins as outputs
      pinMode(DS, OUTPUT);
      pinMode(SHCP, OUTPUT);
      pinMode(STCP, OUTPUT);
    }
    
  4. ループ関数: 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 の状態を更新

    • LED の消灯

      すべての LED を消灯するために 0b00000000 を送信

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

トラブルシューティング

  • LED が点灯しない場合

    • 配線を再確認

    • 74HC595 に電源が供給されているか確認

    • Pico の GPIO ピンが正しく接続されているかチェック

  • LED の動作が異常な場合

    • datArray のバイナリパターンを見直す

    • LED に適切な抵抗が接続されているか確認

さらなる発展

  • 他のデバイスの制御

    74HC595 を使ってリレーやモーターなどを制御可能

  • シフトレジスタのカスケード接続

    複数の 74HC595 を直列に接続し、出力を拡張

  • LED パターンの作成

    datArrayを変更して、より複雑な LED アニメーションを作成

  • センサーとの統合

    センサーと組み合わせて、インタラクティブなシステムを構築

  • LED マトリックスの作成

    複数のシフトレジスタを使用し、大規模な LED マトリックスを構築

まとめ

このレッスンでは、Raspberry Pi Pico の 3 本の GPIO ピンを使用し、74HC595 シフトレジスタを介して複数の LED を制御する方法を学びました。 この技術を活用することで、GPIO ピンの使用を最小限に抑えながら、より複雑でインタラクティブな電子工作を実現できます。 シリアルデータを並列出力に変換し、効率的に LED やその他のアクチュエータ、ディスプレイを管理できるようになります。