注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32エンスージアストコミュニティへようこそ!Facebookで仲間のエンスージアストと一緒にRaspberry Pi、Arduino、ESP32について深く探求しましょう。

参加する理由

  • 専門的なサポート:コミュニティやチームの助けを借りて、購入後の問題や技術的な課題を解決。

  • 学びと共有:スキルを向上させるためのヒントやチュートリアルの交換。

  • 独占プレビュー:新製品発表やプレビューに早期アクセス。

  • 特別割引:最新製品の特別割引を楽しむ。

  • フェスティバルプロモーションとプレゼント:プレゼントやホリデープロモーションに参加。

👉 私たちと一緒に探求し、創造する準備はできましたか?クリックして[ここ]今日参加しましょう!

24. 74HC595を使用した流れる光

このレッスンでは、74HC595シフトレジスターチップの世界に入り込みます。この強力なコンポーネントを使用することで、少数のピンで多数のLEDを制御でき、流れる光のエフェクトを実現するのに最適です。このレッスンの終わりには、74HC595の仕組み、バイナリーデータのシフト方法、および実際のLED制御実験への適用方法についてのしっかりとした理解が得られます。

このレッスンで学ぶこと:

  • 74HC595チップの動作原理とそのピン機能を理解する。

  • shiftOut() 関数を使用してデータをシフトする方法を学ぶ。

  • 74HC595チップとArduinoを使用して流れる光の回路を作成する。

  • バイナリーデータと74HC595チップを使用して8つのLEDを制御し、流れる光のエフェクトを作成する。

74HC595チップの学習

74HC595チップは、8ビットシフトレジスターと三状態のパラレル出力を持つストレージレジスターで構成されています。シリアル入力をパラレル出力に変換するため、MCUのIOポートを節約できます。

_images/24_74hc595.png

ピン機能

_images/24_74hc595_pin.png
  • Q0-Q7: 8ビットのパラレルデータ出力ピンで、8つのLEDや7セグメントディスプレイの8ピンを直接制御できます。

  • Q7': シリーズ出力ピンで、他の74HC595のDSに接続して複数の74HC595を直列に接続できます。

  • MR: リセットピンで、低レベルでアクティブになります。

  • SHcp: シフトレジスターのタイムシーケンス入力です。立ち上がりエッジで、シフトレジスター内のデータが順次1ビット移動します。立ち下がりエッジでは、シフトレジスター内のデータは変わりません。

  • STcp: ストレージレジスターのタイムシーケンス入力です。立ち上がりエッジで、シフトレジスター内のデータがメモリレジスターに移動します。

  • CE: 出力イネーブルピンで、低レベルでアクティブになります。

  • DS: シリアルデータ入力ピンです。

  • VCC: 正電源電圧です。

  • GND: グランドです。

動作原理

MR(ピン10)が高レベルで、OE(ピン13)が低レベルのとき、データはSHcpの立ち上がりエッジで入力され、STcpの立ち上がりエッジでストレージレジスターに移動します。

  • シフトレジスター

    • 例えば、74HC595のシフトレジスターにバイナリーデータ1110 1110を入力したい場合を考えます。

    • データはシフトレジスターのビット0から入力されます。

    • シフトレジスタークロックが立ち上がりエッジになるたびに、シフトレジスター内のビットが1ステップシフトされます。例えば、ビット7は以前のビット6の値を受け取り、ビット6はビット5の値を受け取る、という具合です。

_images/24_74hc595_shift.png
  • ストレージレジスター

    • ストレージレジスターが立ち上がりエッジ状態になると、シフトレジスターのデータがストレージレジスターに転送されます。

    • ストレージレジスターは直接8つの出力ピンに接続されており、Q0〜Q7は1バイトのデータを受け取ることができます。

    • ストレージレジスターとは、データがこのレジスターに存在し、一度出力されても消えないことを意味します。

    • 74HC595が継続的に電源が入っている限り、データは有効で変更されません。

    • 新しいデータが来ると、ストレージレジスター内のデータは上書きされ更新されます。

_images/24_74hc595_storage.png

回路の作成

必要なコンポーネント

1 * Arduino Uno R3

8 * LED

8 * 220Ω抵抗

1 * 74HC595

list_uno_r3

list_red_led

list_220ohm

list_74hc595

1 * ブレッドボード

ジャンパーワイヤー

1 * USBケーブル

list_breadboard

list_wire

list_usb_cable

ステップバイステップの作成方法

配線図、または以下の手順に従って回路を作成してください。

_images/24_flow_light.png
  1. ブレッドボードに8つのLEDを挿入します。任意の色の構成にできます。すべてのLEDのカソード(短い脚)がブレッドボードのグランドレールに接続され、アノードが別々の行に接続されていることを確認してください。

_images/24_flow_light_led.png
  1. 各LEDのアノードに220Ωの抵抗を接続します。

_images/24_flow_light_resistor.png
  1. 74HC595チップを見つけてブレッドボードに挿入します。チップが中央のギャップをまたいでいることを確認してください。

注釈

74HC595の向きを慎重に確認して、損傷を避けてください。以下の手がかりを使って正しい向きを識別できます:

  • チップのラベルが正しく読める。

  • チップのノッチが左側にある。

_images/24_flow_light_74hc595.png
  1. 74HC595のVCCとMRピンをブレッドボードの正電源レールに接続します。

_images/24_flow_light_vcc.png
  1. 74HC595のCEとGNDピンをブレッドボードの負電源レールに接続します。

_images/24_flow_light_gnd.png
  1. 74HC595のQ0-Q7ピンをブレッドボード上の220Ω抵抗を含む行に接続します。

_images/24_flow_light_q0_q7.png
  1. 74HC595のDSピンをArduino Uno R3の11番ピンに接続します。

_images/24_flow_light_pin11.png
  1. 74HC595のST_CPピンをArduino Uno R3の12番ピンに接続します。

_images/24_flow_light_pin12.png
  1. 74HC595のSH_CPピンをArduino Uno R3の8番ピンに接続します。

_images/24_flow_light_pin8.png
  1. 最後に、Arduino Uno R3のGNDと5Vピンをそれぞれブレッドボードの負電源レールと正電源レールに接続します。

_images/24_flow_light.png
  1. 次の表は、74HC595とArduino Uno R3のピン接続を示しています。

74HC595

Arduino UNO R3

VCC

5V

Q0~Q7

LEDs

DS

11

CE

GND

ST_CP

12

SH_CP

8

MR

5V

GND

GND

コード作成 - LEDの点灯

Arduino Uno R3は、バイナリデータのグループを74HC595チップに送信します。 バイナリデータは、コンピュータや多くの電子デバイスの中核を形成し、複雑なデータや指示を処理するために単純な0と1を使用します。 コンピュータサイエンスおよびデジタル電子工学では、バイナリデータは電子コンピュータの情報処理およびストレージの基礎を形成するため、非常に重要です。 ここで、0と1はスイッチの状態として見ることができ、0はオフ(閉)、1はオン(開)を表します。

バイナリ数について、2つの基本的な概念を理解する必要があります:

  • ビット:ビットはバイナリシステムの基本単位であり、各ビットは0または1のいずれかです。

  • バイト:バイトは8ビットで構成されます。これは、コンピュータでのデータ処理の一般的な単位です。(そして見てください、74HC595チップは一度にちょうど1バイトのデータを受け取ります!)

バイナリ数は、最下位ビットから最上位ビットまで順序付けられ、右端のビットが最下位ビット、左端のビットが最上位ビットです。

_images/24_binary_bit.png

それでは、74HC595がバイナリデータを受信し、それをLEDに出力する方法を見てみましょう!

  1. Arduino IDEを開き、「ファイル」メニューから「新しいスケッチ」を選択して新しいプロジェクトを開始します。

  2. スケッチを Lesson24_Lighting_up_LEDs として保存します。 Ctrl + S を押すか、「保存」をクリックしてください。

  3. 74HC595を制御するには、パルス信号を提供するために3本のピンが必要です。これらをOUTPUTに設定します。

const int STcp = 12;  // 74HC595のST_CPに接続されたピン
const int SHcp = 8;   // 74HC595のSH_CPに接続されたピン
const int DS = 11;    // 74HC595のDSに接続されたピン

void setup() {
    // ピンを出力モードに設定
    pinMode(STcp, OUTPUT);
    pinMode(SHcp, OUTPUT);
    pinMode(DS, OUTPUT);
}
  1. コンピュータはバイナリデータを74HC595の DS (データ入力)ピンに送信し、その後、 SH_CP (シフトレジスタクロック入力)ピンからのクロック信号を使用して各データビットを前方にシフトします。このデータ転送プロセスは、 shiftOut() 関数を使用して実装できます。

    • shiftOut(dataPin, clockPin, bitOrder, value):データを1ビットずつシフトアウトします。最も重要なビット(左端)または最も重要でないビット(右端)から開始します。各ビットは順番にデータピンに書き込まれ、その後、クロックピンがパルスされ(高から低に変わる)、ビットが利用可能であることを示します。

    パラメータ

    • dataPin:各ビットを出力するピン。許容データ型:int。

    • clockPin:dataPinが正しい値に設定された後にトグルするピン。許容データ型:int。

    • bitOrder:ビットのシフトアウト順序; MSBFIRST または LSBFIRST 。(最上位ビットから、または最下位ビットから)。

    • value:シフトアウトするデータ。許容データ型:byte。

    戻り値

    なし

  2. ここでは、 shiftOut() 関数を使用して、74HC595シフトレジスタにバイト(8ビット)のデータを送信しようとします。

void loop()
{
    shiftOut(DS, SHcp, MSBFIRST, B11101110);  // データをシフトアウト、最上位ビットから
}
  • これにより、 B11101110 (バイナリ、Bはバイナリを表す)のデータが74HC595シフトレジスタに送信され、データは最上位ビットから送信されます。

  • SH_CP ピンが立ち上がり信号(電圧が低から高に変わる瞬間)を受信するたびに、シフトレジスタ内のビットが1ステップシフトされます。

  • 例えば、ビット7はビット6の以前の値を受け取り、ビット6はビット5の値を受け取ります。

_images/24_74hc595_shift.png
  1. すべてのデータビットがDSピンを介して入力され、複数のクロック信号を使用して正しい位置にシフトされた後、次のステップは、このデータをシフトレジスタからストレージレジスタにコピーすることです。

void loop() {
    digitalWrite(STcp, LOW);  // ST_CP(ラッチピン)を接地し、データ送信中は低に保持

    // MSBFIRST(最上位ビットから)を使用してシフトレジスタにデータを送信
    shiftOut(DS, SHcp, MSBFIRST, B11101110);

    digitalWrite(STcp, HIGH);  // ST_CP(ラッチピン)を高にしてデータを出力ピンに保存

    delay(1000);  // 繰り返す前に1秒待機
}
  • ST_CP ピンが立ち上がり信号を受信すると、シフトレジスタ内のデータがストレージレジスタにコピーされます。

  • データがストレージレジスタにコピーされると、対応する出力ピン(Q0 ~ Q7)に接続されたLEDが、データが1である場合は点灯し、0である場合は消灯します。

_images/24_74hc595_storage_1data.png
  1. これがあなたの完全なコードです。このコードをArduino Uno R3にアップロードできます。その後、Q0とQ4に接続されたLEDが消灯し、他のLEDが点灯しているのが見えるでしょう。

const int STcp = 12;  // 74HC595のST_CPに接続されたピン
const int SHcp = 8;   // 74HC595のSH_CPに接続されたピン
const int DS = 11;    // 74HC595のDSに接続されたピン

void setup() {
    // ピンを出力モードに設定
    pinMode(STcp, OUTPUT);
    pinMode(SHcp, OUTPUT);
    pinMode(DS, OUTPUT);
}

void loop() {
    digitalWrite(STcp, LOW);  // ST_CPを接地して低に保持しながら送信
    shiftOut(DS, SHcp, MSBFIRST, B11101110);  // データをシフトアウト、MSBから
    digitalWrite(STcp, HIGH);  // ST_CPを高にしてデータを保存
    delay(1000);  // 1秒待機

}

質問

shiftOut(DS, SHcp, MSBFIRST, B11101110);``の ``MSBFIRSTLSBFIRST に変更するとどうなりますか?なぜでしょうか?

コード作成 - 流れる光

LEDが一つずつ点灯する流れる光の効果をどのように実現するのでしょうか?

  1. 以前に保存したスケッチ Lesson24_Lighting_up_LEDs を開きます。

  2. 「ファイル」メニューから「名前を付けて保存」を選択し、スケッチの名前を Lesson24_Flowing_Light に変更します。「保存」をクリックします。

  3. ここでは、LEDが一つずつ点灯する流れる光を設定したいと考えています。この流れる光のシーケンスのオン/オフ状態を配列として書き込みます。

const int STcp = 12;  // 74HC595のST_CPに接続されたピン
const int SHcp = 8;   // 74HC595のSH_CPに接続されたピン
const int DS = 11;    // 74HC595のDSに接続されたピン
int datArray[] = {B00000000, B00000001, B00000011, B00000111, B00001111, B00011111, B00111111, B01111111, B11111111};
  1. 次に、 for ループを使用してこの配列を順次呼び出します。

void loop()
{
    for (int num = 0; num <= 8; num++) {
        digitalWrite(STcp, LOW);                      // ST_CPを接地し、送信中は低に保持
        shiftOut(DS, SHcp, MSBFIRST, datArray[num]);  // データをシフトアウト、MSBから
        digitalWrite(STcp, HIGH);                     // ST_CPを高にしてデータを保存
        delay(1000);                                  // 1秒待機
    }
}
  1. 以下が完全なコードです。このコードをArduino Uno R3にアップロードすると、LEDが一つずつ点灯し、流れる光のようになります。

const int STcp = 12;  // 74HC595のST_CPに接続されたピン
const int SHcp = 8;   // 74HC595のSH_CPに接続されたピン
const int DS = 11;    // 74HC595のDSに接続されたピン
int datArray[] = {B00000000, B00000001, B00000011, B00000111, B00001111, B00011111, B00111111, B01111111, B11111111};

void setup ()
{
    // ピンを出力モードに設定
    pinMode(STcp, OUTPUT);
    pinMode(SHcp, OUTPUT);
    pinMode(DS, OUTPUT);
}

void loop()
{
    for (int num = 0; num <= 8; num++) {
        digitalWrite(STcp, LOW);                      // ST_CPを接地し、送信中は低に保持
        shiftOut(DS, SHcp, MSBFIRST, datArray[num]);  // データをシフトアウト、MSBから
        digitalWrite(STcp, HIGH);                     // ST_CPを高にしてデータを保存
        delay(1000);                                  // 1秒待機
    }
}
  1. 最後に、コードを保存し、作業スペースを整理することを忘れないでください。

質問

3つのLEDが同時に点灯し、それが「流れる」ようにするには、 datArray[] 配列の要素をどのように変更すればよいでしょうか?

まとめ

このレッスンでは、74HC595チップの構造と機能を探求し、シフトレジスタを通じてバイナリデータをシフトし、流れる光の実験を構築する方法を学びました。 shiftOut() 関数を使用してバイナリデータの送信を制御し、8つのLEDの順次点灯を成功裏に管理して流れる光効果を達成しました。この新たに得た知識を使って、74HC595チップを効果的に使用し、自身のプロジェクトに素晴らしい照明機能を追加できるようになるでしょう。