マイクでボード上のRGB LEDを制御する

Nano 33 BLE Sense上の内蔵マイクを使ってサウンドメーターの作り方を学びます。


AUTHOR: Fabricio Troya、LAST REVISION: 2023/03/09 18:51


このチュートリアルでは、周囲の音の値を測定・表示するのに、Arduino Nano 33 BLE Senseを利用します。音の値は内蔵のMP34DT05センサーにより取得可能です。

注意: ごく一部の人は点滅する光やパターンにさらされると発作を起こすことがあります。発作やてんかんを起こしたことがない人も、診断されていない状態があり、速く点滅するライトを見ているときに、このような「光過敏性発作」を起こすことがあります。このような症状が出た場合は、直ちに使用を中止し、医者に相談してください。

目的

このプロジェクトの目的は以下の通りです。

  • Arduino Nano 33 BLE Senseからセンサーの生データを出力する方法を学びます。
  • PDM(Pulse-Density Modulation)ライブラリを使用します。
  • シリアrモニターに音の値を表示します。
  • RGBサウンドメーターを作成します。

必要なハードウェアとソフトウェア

  • Arduino Nano 33 BLE Sense
  • このプロジェクトでは、外部のセンサーや機器を利用しません。
  • このチュートリアルでは、ボードのプログラムを記述するのに、Arduino Create Webエディタを利用します。

MP34DT05センサー

MP34DT05マイクセンサー

MP34DT05マイクセンサー

マイクは物理的な音をデジタルデータに変換する部品です。マイクは、モバイル端末や音声認識システム、ゲームもしくは仮想現実の入力デバイスとしても、広く使われています。

MP34DT05センサーは、アナログ信号をバイナリ信号で表現するのに、PDM(Pulse-Density Modulation)を利用する超小型マイクです。センサーのレンジは以下の通りです。

  • SN比: 64dB
  • 感度: -26dBFS ±3dB
  • 動作温度: -40から85℃

MP34DT05センサーの詳細を知りたければ、データシートを参照してください。

プログラム作成

  1. 設定

Arduino Webエディタを開き、Librariesタブをクリックし、PDM FOR MBEDライブラリを探します。その後、> Examplesで、PDMSerialPlotterスケッチを開きます。開いた後は、Sound_Meterという名前に変更します。

Webエディタでライブラリを探す

Webエディタでライブラリを探す

  1. ボードを接続する

次に、Arduino Nano 33 BLE SenseをPCに接続し、Webエディタが認識することを確認します。すると、ポートとボードが以下の図で示すように現れます。現れない場合は、指示に従いエディタがボードを認識するためのプラグインをインストールしてください。

ボードを選択する

ボードを選択する

  1. 音の値を表示する

ここでは、音の値を表示と、音の大きさに応じて異なるLEDを点滅させるために、スケッチ例を変更します。

setup()の前で、2つの型の変数を初期化します。一つはshort型変数で、もう一つはvolatile int型変数です。16ビットのデータ型を格納するのにshort型変数でsampleBuffer[256]を使います。もう一つのvolatileは、変数の修飾子として知られています。これは通常、変数のデータ型の前で使われ、コンパイラや後続のプログラムがその変数を扱う方法を変更します。この場合、sampleRead変数に、ストレージレジスタからではなく、RAMから値をロードするよう指示します。

1
2
3
4
5
6
7
#include <PDM.h>

// buffer to read samples into, each sample is 16-bits
short sampleBuffer[256];

// number of samples read
volatile int samplesRead;

setup()では、PDM.conReceive()関数を、データ受信時のコールバックとして利用します。最後に、PDM.begin()で、センサーが一つのチャネルからだけデータを受信するように設定し、サンプルレートを16kHzに設定します。この命令は、if()内にあり、センサーが適切に初期化できなかった場合に、メッセージを文字列として表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
void setup() {
  Serial.begin(9600);
  while (!Serial);

  // configure the data receive callback
  PDM.onReceive(onPDMdata);

  // optionally set the gain, defaults to 20
  // PDM.setGain(30);

  // initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate
  if (!PDM.begin(1, 16000)) {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

loop()では、for()ループ内のSerial.println()関数の後にに以下の部分を追加し、スケッチ例を変更します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// check if the sound value is higher than 500
     if (sampleBuffer[i]>=500){
       digitalWrite(LEDR,LOW);
       digitalWrite(LEDG,HIGH);
       digitalWrite(LEDB,HIGH);
     }
     // check if the sound value is higher than 250 and lower than 500
     if (sampleBuffer[i]>=250 && sampleBuffer[i] < 500){
       digitalWrite(LEDB,LOW);
       digitalWrite(LEDR,HIGH);
       digitalWrite(LEDG,HIGH);
     }
     //check if the sound value is higher than 0 and lower than 250
     if (sampleBuffer[i]>=0 && sampleBuffer[i] < 250){
       digitalWrite(LEDG,LOW);
       digitalWrite(LEDR,HIGH);
       digitalWrite(LEDB,HIGH);
     }

このコードの部分で、マイクが受信した音の総量に応じて、RGB LEDを点滅させます。

  1. 完全なコード

コード作成セクションをスキップした場合のために、完全なコードを以下に示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
  This example reads audio data from the on-board PDM microphones, and prints
  out the samples to the Serial console. The Serial Plotter built into the
  Arduino IDE can be used to plot the audio data (Tools -> Serial Plotter)

  Circuit:
  - Arduino Nano 33 BLE Sense board

  This example code is in the public domain.
*/

#include <PDM.h>

// buffer to read samples into, each sample is 16-bits
short sampleBuffer[256];

// number of samples read
volatile int samplesRead;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // configure the data receive callback
  PDM.onReceive(onPDMdata);

  // optionally set the gain, defaults to 20
  // PDM.setGain(30);

  // initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate
  if (!PDM.begin(1, 16000)) {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

void loop() {
  // wait for samples to be read
  if (samplesRead) {

    // print samples to the serial monitor or plotter
    for (int i = 0; i < samplesRead; i++) {
      Serial.println(sampleBuffer[i]);
      // check if the sound value is higher than 500
      if (sampleBuffer[i]>=500){
        digitalWrite(LEDR,LOW);
        digitalWrite(LEDG,HIGH);
        digitalWrite(LEDB,HIGH);
      }
      // check if the sound value is higher than 250 and lower than 500
      if (sampleBuffer[i]>=250 && sampleBuffer[i] < 500){
        digitalWrite(LEDB,LOW);
        digitalWrite(LEDR,HIGH);
        digitalWrite(LEDG,HIGH);
      }
      //check if the sound value is higher than 0 and lower than 250
      if (sampleBuffer[i]>=0 && sampleBuffer[i] < 250){
        digitalWrite(LEDG,LOW);
        digitalWrite(LEDR,HIGH);
        digitalWrite(LEDB,HIGH);
      }
    }

    // clear the read count
    samplesRead = 0;
  }
}

void onPDMdata() {
  // query the number of bytes available
  int bytesAvailable = PDM.available();

  // read into the sample buffer
  PDM.read(sampleBuffer, bytesAvailable);

  // 16-bit, 2 bytes per sample
  samplesRead = bytesAvailable / 2;
}

テスト

スケッチの検証とアップロードに成功したら、左側のメニューからシリアルモニターを開きます。すると新しい変数が表示されるのがわかります。

シリアルモニターに表示されたマイクデータ

シリアルモニターに表示されたマイクデータ

テストするには、スピーカーの横にボードを置き、音楽を演奏し、 RGB LEDの色が音楽に従って変わるのを確認してください。

音楽に従ってRGB LEDが点滅する。

音楽に従ってRGB LEDが点滅する。

注意: 音楽によっては、ライトはとても速く点滅することを覚えておいてください。「光過敏性発作」の症状が出た場合は、直ちに使用を中止し、医者に相談してください。

トラブルシュート

エラーが起きることもあります。コードが動作しないときはいくつかの共通の問題があり、解決できます。

  • 括弧やセミコロンが抜けている。
  • Arduinoボードが認識されないときは、CreateプラグインがPC上で適切に動作していることを確認する。
  • ケーブル接続の予期しない切断。
  • 音楽の音が小さい、もしくは、ボードがスピーカーから遠すぎる。

おわりに

このチュートリアルでは、PDMライブラリを使ってMP34DT05センサーから音の値を読む方法と、環境からの音の値を表示するために、Arduino Nano 33 BLE Senseを使う方法、RGB LEDを通じて視覚化する方法を学びました。

オリジナルのページ

https://docs.arduino.cc/tutorials/nano-33-ble-sense/microphone-sensor

最終更新日

March 12, 2023

inserted by FC2 system