サウンド・ディテクターとArduinoで外部割込みを使ってみる

こんにちは、ばいろんです。

今回は外部割込み(attachInterrupt()関数)を実際に使ってみたいと思います。

 

必要なもの

 

サウンド・ディテクターの紹介

今回使うサウンド・ディテクターについて紹介しておきます。

 

サウンド・ディテクター

このモジュールは5つの信号ピンを持っています

  1. GND
  2. VCC(5V)
  3. GATE:外部割込みのトリガーとして使用
  4. ENVELOPE:このピンの出力をanalogRead()で読み込みます
  5. AUDIO:今回は使用しません
  • GATE

GATEは音声を検知すると5V(HIGH)を返します。下の画像の赤いラインで示した波形の信号を出力します。

  • ENVELOPE

ENVELOPEは音声が入力されると、音の大きさをアナログで返します。下の画像の明るい緑色で示した波形の信号を出力します。

  • AUDIO

AUDIOはマイクから入力された生のデータを返します。下の画像の暗い緑色で示した波形の信号を出力します。

 

今回は扱いやすいGATEとENVELOPEを使用します。

配線図

 

sound-detector-analog_%e3%83%96%e3%83%ac%e3%83%83%e3%83%89%e3%83%9c%e3%83%bc%e3%83%89

 

スケッチの例1

それでは、スケッチに行ってみましょう。

#define PIN_GATE_IN 2
#define IRQ_GATE_IN  0
#define PIN_ANALOG_IN A0

volatile int peak;

void soundISR()
{
  peak = analogRead(PIN_ANALOG_IN);
  Serial.print("peak : ");
  Serial.println(peak);
}

void setup() {
  Serial.begin(9600);
  pinMode(PIN_GATE_IN, INPUT);
  attachInterrupt(IRQ_GATE_IN, soundISR, RISING);
  peak = 0;
}

void loop() {
  
}

外部から音声が入力されると、その音の大きさを出力するスケッチです。

attachInterrupt(interrupt, function, mode)関数のパラメータの設定

  • interrupt:音声の検知に2ピンを使いたいのでパラメータは0を設定(#define でIRQ_GATE_INに0を定義しています)
  • function:外部割込みで呼び出される関数です(今回はsoundISR()関数を呼び出します)
  • mode:LOW→HIGHになるタイミングで割込みをしたいのでRISINGを指定します

また、音声の検知のために使うピンとして#defineで2ピンを定義しています(PIN_GATE_IN)

今回はこんな感じです。

次回はこのスケッチを少し変えて、少し応用っぽい処理をしてみようと思います。

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to top