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

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

ただいまの
回答率

90.75%

  • Arduino

    489questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,038

dogy

score 1

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

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

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

int a;          

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

void loop(){
  a = analogRead(0);
  Serial.println(a);
  delay(100);
}

購入したセンサ
part1

part2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/10/28 18:19

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

+2

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/30 00:51

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

    キャンセル

  • 2017/10/30 10:38

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

    キャンセル

  • 2017/10/30 10: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
    //

    キャンセル

  • 2017/10/30 10:41

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

    キャンセル

  • 2017/10/30 13:20

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

    キャンセル

  • 2017/10/30 14:09

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

    キャンセル

  • 2017/10/30 14:51

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

    キャンセル

  • 2017/10/30 18:59

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

    キャンセル

  • 2017/10/30 19:04

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

    キャンセル

  • 2017/10/30 19: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の時間を出力。
    }
    }

    キャンセル

  • 2017/10/30 20:00

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

    キャンセル

  • 2017/10/30 20:09

    これを使用してます。
    http://akizukidenshi.com/catalog/g/gM-05825/

    キャンセル

  • 2017/10/30 20:11

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

    キャンセル

  • 2017/10/31 00:34

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

    キャンセル

  • 2017/10/31 00:44

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

    キャンセル

  • 2017/10/31 00:51

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

    キャンセル

  • 2017/10/31 11:02

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

    キャンセル

  • 2017/10/31 13:01

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

    キャンセル

  • 2017/10/31 19:17

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

    キャンセル

checkベストアンサー

+1

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

    arduinoと温度センサ

    arduinoと温度センサ arduinoで温度センサを自作しようと考えています。 そこで、7セグLED温度センサのPICをarduinoで代用出来ないかと考えました。マイコン→A

  • 解決済

    arduinoを使っています。初めての質問です。お願いいたします。

    前提・実現したいこと blynkというアプリでスマートホンからコントロールしようとしています。 ボタンのコントロールはできるようになりました。 ちなみに、ボタンからの操作で動

  • 解決済

    電子回路 マイクの信号を10倍ほどに増幅するには? 低い増幅率(利得)を実現したい!  オペアンプ?...

    ■目的・課題  ●目的 コンデンサマイクで息を検知したいと考えています。 ●問題・質問内容 息を吹きかけることで「マイクの波形(振幅)が大きく変化すること」を読み取

  • 解決済

    Arduinoでwifi通信がならない

    ・実現させたいこと ArduinoでのWifi通信 ・機器 osoyoo arduino uno r3 (5V) ESP-WROOM-02 Wi-Fi シールド (

  • 解決済

    Arduinoで拍手の認識

    いつもお世話になっております。 Arduinoにて躓いてしまったので、どなたかご教授いただけますと幸いです。 現在、手袋にArduinoをつけて拍手をすると、Proce

  • 受付中

    if文を加えたい

    Adafruit LIS3DH 3軸加速度センサーモジュールをアルディーノUNOに搭載しセンサーを傾けた時の角度を検出できるようになりました。 次に質問なのですがif文を以下

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    Arduinoのシリアル通信でサーボモーター制御

    写真にある赤外線発信機(CarMP3)の”1”を押したときにサーボモータ(SG-90)が100度回転するプログラムを作りたいです。 コンパイルは通ったのですが回転しません。

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

  • Arduino

    489questions

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