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

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

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

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

Q&A

解決済

2回答

9926閲覧

デジタルマイクSPM0405HD4Hの使い方について

dogy

総合スコア7

Arduino

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

0グッド

1クリップ

投稿2017/10/28 07:56

編集2017/10/29 16:14

Arduinoで以下のセンサを活用し周囲の音を数値化したいのですが使い方が全くわかりません。

簡単でいいのでサンプルコードを書いてくれたら幸いです。。。

試みたプログラムです。
⑤DATとA0を接続してます。

Arduino

1int a; 2 3void setup() { 4 Serial.begin(9600) ; 5 6void loop(){ 7 a = analogRead(0); 8 Serial.println(a); 9 delay(100); 10}

購入したセンサ
part1

part2

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

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

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

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

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

guest

回答2

0

気になったので本日、秋葉原に行って秋月で購入して試してみました。(夕方近くだったので急な天候の変化にも邪魔されましたが)
http://akizukidenshi.com/download/SPM0405HD4H.pdf を参考に”すんなり動くだろう”と考えながら。
参考にしたのはデジタルマイクSPM0405HD4Hがデジタルで動いた!
ですが、特に難しい部分はありませんでしたが。

まずはHPのソースを眺めて理解されながら試すのは如何でしょうか?

投稿2017/10/29 15:29

MasahikoHirata

総合スコア3747

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

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

dogy

2017/10/29 15:51

ご指摘ありがとうございます。 実は以前にもそのホームページも拝見したのですが意味がわからなかったです。。。 ですがもう少しHPのソースを確認してみます!
MasahikoHirata

2017/10/30 01:38

まず異なる部分が接続方法ですね。このデジタルマイクは名前の通り、デジタルで音声をデータ化して送信します。そのために必要なのがマイクから見て”CLK"(クロック)が入力。これを受けてデータをデジタルで送信。つまり信号として2本の接続。また電源関係も接続が必要です。貴殿のソースでは単にA0の入力だけですので”ウンともスンとも”言わないはず。
MasahikoHirata

2017/10/30 01:40

各ピンの接続につきましては // // DAC MCP4921 // // GPIO 13 - Pin 5 SDI // 14 - 4 SCK // 15 - 3 !CS // 16 - 8 LDAC // 1, 9, 11, 13 - Vcc // 12 - Gnd // 1 - 0.1uF - 13 //
MasahikoHirata

2017/10/30 01:41

arduinoのピンにSDIなどSPIの通信の接続をする必要があります。
dogy

2017/10/30 04:20

たしかにうんともすんとも言いませんでした。 ”SPIの通信”が勉強不足で理解できない点が多いのですが、この通信を用いないとできないものなのでしょうか・・・?
MasahikoHirata

2017/10/30 05:09

私が参考にしたソースからSPI通信であることがハッキリとしています。今日の夜にでも配線などの情報を追加回答いたします。
dogy

2017/10/30 05:51

有難うございます。とても助かります。
MasahikoHirata

2017/10/30 09:59

まず私の回答の修正です。DAC MCP4921のピン記載について、これはマイクではなくてマイクからのデータを音声に変換するボードの事でした。すみません。
MasahikoHirata

2017/10/30 10:04

続いて、マイクですが先ほどの回答に誤りが。これは音声をON/OFFの長さで強弱をデジタル化しています。 従ってON/OFFの長さ(時間)を得ればデータに。
MasahikoHirata

2017/10/30 10:17

参考にしたHPのソースを改造して、その部分の解説をします。 // // SPM0405 // #define kOutClock 5 // to CLK #define kInSignal 4 // from DAT // L/R is connected to GND -> down edge mode void setup() { // put your setup code here, to run once: Serial.begin(230400); // ここはシリアルモニターとか自分のデータを得る端末の速度です。私は115200bpsにしました。 pinMode(kOutClock, OUTPUT); pinMode(kInSignal, INPUT); } // // loop // 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; // dummy wait 時間調整の為の無駄処理用です。 void loop() { while (1) { for (int i = 0; i < kOutLoop; i++) { int count = 0; for (int l = 0; l < kMaxLoop; l++) { // 25n digitalWrite(kOutClock, LOW); // low 212.5n a++; b++; if (digitalRead(kInSignal) == HIGH) { count++;    //データの信号線がHIGHになってる長さをカウント。 } else { count--; } if (l < kMaxLoop - 1) { digitalWrite(kOutClock, HIGH); // high=225.0n 時間調整で2つ入ってます。この225.0nは”nSec"で”ナノ秒”を意味します。 digitalWrite(kOutClock, HIGH); // high=225.0n } } count = count * kMaxRate + kMaxOffset; } Serial.println(count); //これでシリアルに信号のHIGHの時間を出力。 } }
MasahikoHirata

2017/10/30 11:00

配線の注意点はマイクの動作電圧が3.6VまでなのでUNOでは5Vでオーバー。それなので3.3Vと5Vのレベル変換を使うのが確実です。
MasahikoHirata

2017/10/30 11:11

接続にはVDD(電源としてArduinoの3.3V)GND(0Vライン)は共通、PIN5をクロック、PIN4をデータ、そしてマイクのL/RをGNDに接続で動作しました。
dogy

2017/10/30 15:34

コード記載から接続部分など細部までご教授本当に助かります。 コンパイル時に最後の行のSerial.println(count);にて 「'count' was not declared in this scope」とエラーが出るのですが、 なぜ"count"が定義されていない扱いになるのでしょうか?
dogy

2017/10/30 15:44

一つ前の” } ” のなかに収めると書き込めるのですがシリアルプリントが 2007 2007 2007 2007 1927 1927 1927 1927 1967 2007 2007 2007 2007 2007 2007 1927 2007 1927 このような感じで正確な値が取れていないような気がします。。。 ちなみに私のArduino unoは幸いにも3.3V電源PINがあったので変換器は買わなくて済みそうです!
MasahikoHirata

2017/10/30 15:51

"ちなみに私のArduino unoは幸いにも3.3V電源PINがあったので変換器は買わなくて済みそうです"については、信号線も3.3V で動作させないと、信号のHIGH・LOWの閾値が違うので動作が保障されません。
dogy

2017/10/31 02:02

ということはやはり5Vから変換器を通して3.3Vにした方が良いのでしょうか?
MasahikoHirata

2017/10/31 04:01

そうです。VDDは3.3Vから信号線はレベル変換で。
dogy

2017/10/31 10:17

なるほど! では例に挙げてくださったレベル変換器を購入して試してます!
guest

0

ベストアンサー

デジタルマイクSPM0405HD4Hの出力は、PDM(Pulse Density Modulation:パルス密度)形式です。
PDMは、低い値の時にはパルスが時々出力され、値が高い時にはパルスが頻繁に出力されるというものです。

パルスを取り込めたとしても、それを正確にアナログ値に変換するにはDSP(デジタルシグナルプロセッサ)が必要で、Arduinoで処理するには荷が重いです。

PDM形式の信号は、PWM形式の信号と同様にローパスフィルターを通すことでアナログ値にすることが出来ます。

SPM0405HD4HのDATAピン -> ローパスフィルター -> アンプ -> Arduinoのアナログ入力ピン
SPM0405HD4HのCLKピン <- Arduinoのデジタル出力ピン
という配線をして、Arduinoのデジタル出力ピンにクロック信号を出しながら、アナログ入力ピンから値を読み取れば、音声信号データになると思います。

Arduinoからクロック信号を出すのが面倒くさいなら、発信回路の出力をCLKピンにつなぐ方法もあります。

また、どうせアナログ入力でデータを取るのなら普通のマイクを使うというのも有りでしょう。

投稿2018/04/06 05:07

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問