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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

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

Q&A

3回答

5877閲覧

Arduinoとデジタルマイク

swxpiz

総合スコア6

Arduino

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

0グッド

0クリップ

投稿2018/01/19 15:23

###前提・実現したいこと
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が読み取れることが目標です。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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
a0<a<1の定数です。

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

投稿2018/04/06 04:43

編集2018/04/06 04:44
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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


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

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


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

投稿2018/04/06 03:29

編集2018/04/06 03:54
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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進数で表したものですから、扱い易いと思います。

投稿2018/04/06 03:15

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問