Arduino電子工作ArduinoLED電子工作

Arduinoで音階に合わせてLEDを光らせてみた

Arudinoで音階に合わせてLEDを光らせる

前回は、Arduinoで音を鳴らしてみました。
今回は、2回目として音階に合わせてLEDを光らせる方法をやってみます。

8bitシフトレジスタでLEDを順番に光らせてみよう

最初に、8bitシフトレジスタを使ってLEDを左から右へ順番に光らせてみましょう。

シフトレジスタを使うことで、少ないピンで入出力を制御できます。

使用した部品

8bitシフトレジスタ(74HC595N)について

今回、8bitシフトレジスタとして「74HC595N」を使用しました。

データーシートは以下のようになっています。

74HC595 データーシート

QA~QHがパラレル出力で、ここにLEDを接続します。
SERがシリアル入力でArduinoの12番ピンに、
RCLKがラッチクロックでArduinoの11番ピンに、
SRCLKがクロック信号でArduinoの9番ピンに接続します。

シフトレジスタについては、自分も詳しくはまだ理解できてなく、以下のサイトに詳しく記載されています

「シフトレジスタ」の解説
用語「シフトレジスタ」の意味を解説しています。

サンプル1 回路図

サンプル1の回路図は下図になります。
抵抗はLED側には2.0kΩ、スイッチに10kΩを使用しました。

回路図

サンプルコード1 LEDを順番に光らせる

スイッチを押すとLEDは順番に光るコードです。

//***************************************/
// 8bitシフトレジスタでLEDを順番に光らせる
//***************************************/

#define Bt 500 //光る長さを定義

int rclkPin = 11;
int srclkPin = 9;
int dsPin = 12;

const int Switch = 2; //スイッチの接続するピン

byte leds = B00000000; //ledをbyte型としてB00000000で定義

void setup() {
  pinMode(Switch, INPUT);
  pinMode(rclkPin, OUTPUT);
  pinMode(dsPin, OUTPUT);
  pinMode(srclkPin, OUTPUT);
}

void loop() {
  //スイッチを押したらLEDが順番に光る
  if (digitalRead(Switch) == HIGH) {
    for (int i = 0; i < 8; i++) {
      bitSet(leds, i); //指定したビットを1にする

      digitalWrite(rclkPin, LOW); //送信中のRCLKをLowにする
      shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択
      digitalWrite(rclkPin, HIGH); //送信終了後RCLKをHighにする

      delay(Bt);

      bitClear(leds, i); //点灯したLEDのビットを0にして消灯させる
    }
  } else {
    //LED1からLED8までのレジスタを初期化
    leds = 0;
    digitalWrite(rclkPin, LOW);
    shiftOut(dsPin, srclkPin, LSBFIRST, leds);
    digitalWrite(rclkPin, HIGH);
  }
 }

コードは以下のサイトを参考にさせてもらいました。

Arduino 入門 Lesson 20 【8bitシフトレジスタによる複数LED制御編】
本日は「Lesson 20 シフトレジスタによる複数LED制御編」です。複数のLEDを直接Arduinoに抵抗と合わせて接続して制御するということではありません。これをしてしまうと、Arduino UNOのピンが足りなくなり、センサーやボタンなど他電子部品を接続できないなピン不足になってしまいます。そこで、「74HC5...

音階に合わせてLEDを光らせよう

次は先程の回路図にスピーカーを接続して音を出してみましょう。
スピーカーは今回は4番ピンに接続しました。

サンプルコード2 音階に合わせてLEDを光らせる

スイッチを押すと音階に合わせてLEDを光らせるコードです。

//***************************************/
// 8bitシフトレジスタで音階に合わせてLEDを光らせる
//***************************************/

#define Bt 500 //音の長さを定義

//音程を定義する
#define C4 262 //ド
#define D4 294 //レ
#define E4 330 //ミ 
#define F4 349 //ファ
#define G4 393 //ソ
#define A4 440 //ラ
#define B4 494 //シ
#define C5 523 //ド

int rclkPin = 11;
int srclkPin = 9;
int dsPin = 12;

const int Switch = 2; //スイッチの接続するピン
const int Speaker = 4; //スピーカーの接続するピン

//音階のメロディを配列に入れる
int melody[] = {
  C4, D4, E4, F4, G4, A4, B4, C5 
};

byte leds = B00000000; //ledをbyte型としてB00000000で定義

void setup() {
  pinMode(Switch, INPUT);
  pinMode(rclkPin, OUTPUT);
  pinMode(dsPin, OUTPUT);
  pinMode(srclkPin, OUTPUT);
}

void loop() {
  //スイッチを押したら音階に合わせてLEDが光る
  if (digitalRead(Switch) == HIGH) {
    for (int i = 0; i < 8; i++) {
      bitSet(leds, i); //指定したビットを1にする

      digitalWrite(rclkPin, LOW); //送信中のRCLKをLowにする
      shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択
      digitalWrite(rclkPin, HIGH); //送信終了後RCLKをHighにする
      tone(4, melody[i], Bt);
      delay(Bt);

      bitClear(leds, i); //点灯したLEDのビットを0にして消灯させる
    }
  } else {
    //LED1からLED8までのレジスタを初期化
    leds = 0;
    digitalWrite(rclkPin, LOW);
    shiftOut(dsPin, srclkPin, LSBFIRST, leds);
    digitalWrite(rclkPin, HIGH);
  }
}

音階をmelody[]で配列に入れ、LEDが光ると同時に音を出すようにしました。

動作確認

Arduinoで音階に合わせてLEDを光らせてみた!

スイッチを押したら音階に合わせてLEDが光るのが分かると思います。

まとめ

今回はシフトレジスタを使って、LEDを制御させてみました。
まだシフトレジスタについて理解できていないので勉強したいと思います。

コメント

タイトルとURLをコピーしました