質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.77%

  • Arduino

    493questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Arduinoとデジタルマイク

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 315

swxpiz

score 2

前提・実現したいこと

Arduino Nanoとデジタルシリコンマイクによる音声入力をしたいと思っています。というのもかつてコンデンサマイクを使ったところ精度が低く、デジタルシリコンマイクは精度・感度が高いと評判で使ってみようと思った次第です。

今手元にあるデジタルマイクは以下の2つです。
http://akizukidenshi.com/catalog/g/gM-04330/
http://akizukidenshi.com/catalog/g/gK-06864/

発生している問題・エラーメッセージ

今のところ、この(https://teratail.com/questions/98219)サイトを参考に、arduinoとレベル変換モジュール、デジタルマイクを配線し以下のプログラムを書き込みました。
しかしながら、Serial.println(count); で帰ってくる値は一定の値で、マイクに音を入力しても数値が変動しません。

該当のソースコード

#define kOutClock 5 
#define kInSignal 4 

void setup() {
   Serial.begin(115200);
  pinMode(kOutClock, OUTPUT);
  pinMode(kInSignal, INPUT);
}

const int kMaxLoop = 100;
const int kMaxDAC = 4095;
const int kMaxRate = 2000 / kMaxLoop;
const int kMaxOffset = kMaxDAC / 2;
const int kOutLoop = 10000 / kMaxLoop;
long a, b; 

void loop() {
  while (1) {
    for (int i = 0; i < kOutLoop; i++) {
      int count = 0;
      for (int l = 0; l < kMaxLoop; l++) { 
        digitalWrite(kOutClock, LOW); 
        a++; b++;
        if (digitalRead(kInSignal) == HIGH) {
          count++;
        }
        else {
          count--;
        }
        if (l < kMaxLoop - 1) {
          digitalWrite(kOutClock, HIGH); 
          digitalWrite(kOutClock, HIGH); 
        }
      }
      count = count * kMaxRate + kMaxOffset;
      Serial.println(count); 
    }
  }
}

聞きたいこと

これまでコンデンザマイクのようなアナログしか使ったことがなかったので、こんなに難易度が違うものかと困惑しています。
自分自身がデジタルシリコンマイクについて知識が不足していることも有りますが、このマイクをarduinoで読み取るための、基本的なプログラムの構成はどのようなものでしょうか?
(例えば超音波センサーはtrigから超音波を発し、echoでそれを読み取るのようなプログラムの流れ、が知りたいです。)
最終的には音の大きさによってpwmを変化させようと思っていますが、まずはhigh,lowが読み取れることが目標です。

大変ご迷惑をおかけしますが、どうか、ご教授いただければと思います。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

PDM出力の方での回答です。
http://akizukidenshi.com/catalog/g/gM-04330/

 PDM

ざっくりいうと、
もとの信号が大きいほどHレベルが長時間出てきて、
小さいほどLレベル長時間連続する
デジタル変換方式です。

音声信号だと例えば何も入力していないとき、
HとLが短い間隔でだいたい交互に出てくることになります。

 マイクの動かし方

何はともあれデータシート読みましょう。
6ページぐらいに書いてあります。

ClockピンをL->Hにすると、少し遅れてDataピンから出力が出てくると言う形式です。
(SELECTピン(秋月だとL/R)がHのとき)

 信号の受け方

 アナログで取る

本末転倒な感じがありますが、
PDM出力をアナログローパスフィルタに通して、Arduinoのアナログ入力で読めば値は取れます。

プログラムはコンデンサマイクをアナログ入力で読むのと何も変わらず、
適切な抵抗とコンデンサがあればできます。

 デジタルで取る

PDM出力をデジタルで読んで、デジタルローパスフィルタをかけます。
サンプリング回数kに於ける読みをx_k(=0or1)
フィルタの出力をy_k (float)としたとき
y_(k+1) = a * y_k + (1 - a) * x_k
a は0<a<1の定数です。

Arduinoで充分早い間隔でサンプリングできるかは知りません。やってみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

質問にURLが書かれている2つのマイクは出力される信号の形式が全く違います。

http://akizukidenshi.com/catalog/g/gM-04330/のほうは、ΣΔ-ADコンバータからの出力をPDM:
Pulse Density Modulation(パルス密度偏重)形式で出力するタイプです。この出力をアナログ信号に変換するには専用のDSP(デジタル信号プロセッサ)が必要です。変換するプログラムを書くことも可能かもしれませんが、デジタル信号処理の詳細を知らないと無理です。DSPを接続することも、複雑なプログラムを作成して実行させることもArduinoには不向き(不可能?)なので、こちらは使えないと思います。

http://akizukidenshi.com/catalog/g/gK-06864/のほうは、出力がPCM(Pulse Coded Modulation:アナログ信号をデジタル化したものをビット列で出力する方式)でデータ転送の方式はI2Cに準じたものを使っていますから、Arduinoで扱うのが容易だと思います。
出力信号のフォーマットが、http://akizukidenshi.com/download/ds/akizuki/AE-ADMP441_K.pdfに書かれていますから、これに合わせてスケッチを書けばよいはずです。
I2Cのようにバイト単位ではなく、24ビット単位でデータを取り込むこと、右と左のマイクの指定があることなどI2Cとの違いがありますから、I2Cのライブラリを使わずにスケッチを書く必要があります。

マイクから読みだした24ビットのデータが音の大きさを2進数で表したものですから、扱い易いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

デジタルマイクってのはその名の通り、デジタル信号で出力されます
で、そのデジタル信号を受け取るための形式が、上のものはSPI、下のものはI2Sという方式で信号を受けるようになってるようです。

ラズパイにはSPIデバイスが内蔵されてるようなので、とりあえずそれでデータ読むのを目標とすればどうでしょうか。
「RaspberryPi SPI」でぐぐるといろいろでてくるので見てみてください


お、上の方はPDM出力方式と書いてありますね。
PDMもI2Sもラズパイには内蔵されてないので、データ取り込み用の別の基板が必要になってきますね。
これはちとハードルが高いですねえ。

たしか、SPI出力形式になってるデジタルマイクがあったと思うんで、そういうのを買いなおすほうがいいかと思いますがどうでしょうか。


も一つ追記
ラズパイじゃなくてArduinoなのか。。
それはちょっと無理じゃないかな。
処理速度が決定的に不足してますぜ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    493questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。