キノコの自省録

日々適当クリエイト

RaspberryPiでGPIO(I2S)を使ってマイクから録音する

RaspberryPiで録音方法について調べると、大抵USBマイクの紹介記事が見つかります。USBマイクは楽ですが、USB-Aが必要なのでRaspberryPi Zeroの場合はmicroB→HostA変換する必要がありますし、そもそも場所を取るので取り付けに困ったりします。特に、小型化したいとか、基板上に配置したいといった場合に苦労します。

ということで、GPIOで録音する方法を紹介。

方法

RaspberryPiはA-Dコンバータを積んでいないので、デジタル信号を入力する必要があります。音声信号のデジタル入出力は、I2S、PDM、TDMなどがあります。I2Sが一番メジャーで、RaspberryPiもI2Sをサポートしています。

そんなわけで、I2SでRaspberryPiに入力して録音する方法を模索します。

マイクの調達

まずはI2SでRaspberryPiにマイク音声を入力するって、どんな部品を調達すればいいいんでしょう?というところから。”I2S RaspberryPi”とかで検索すると、お値段の高いハイレゾDACに関する記事が大量に見つかります。いや、そっちじゃないんです。DACじゃなくてADCが欲しいんです。

それはさておき、I2SをOutputにするADCは例えばこんなものがあります。

ADAU1977 データシートおよび製品情報 | アナログ・デバイセズ

このADAU1977は、RaspberryPiに標準でDeviceTreeにドライバが登録されています。ただ、チップ単体販売なので、基板を作らなければならないので非常に面倒くさいです。私も扱ったことがないので、たぶんできるよとしか言えません。

しかし、世の中には、I2S出力するデジタルマイクが存在したりします。便利な世の中になったものです。手に入りやすいところではADMP441, SPH0645LM4H, ICS-43432あたり。ADMP441なら秋月電子DIP化キットが売っているので、今回はこれを使います。1つ750円。

ADMP441 DIPモジュール: パーツ一般 秋月電子通商 電子部品 ネット通販

SPH0645LM4Hにもスイッチサイエンス製のモジュールキットがあります。こちらはAmazonでも購入可能。


SPH0645LM4H搭載 I2S MEMSマイクモジュール

ADMP44 DIP化キットはんだ付けの注意

マイクの開口部が実装面の裏にあるので、ピンヘッダの装着面に注意しましょう。この通り、ちゃんと説明書に書いてあります。が、私ははんだ付けしてから気づきました……。

f:id:kinokorori:20180224212215j:plain

ピン配置

ピンの配置は次の通りです。直接挿すだけなので、難しくないです。L/RはGNDの場合は左チャンネル、+Vの場合は右チャンネルになりますが、1つしかマイクがない場合はどのみちモノラルになります。

電源電圧は1.8V~3.3Vなので、3.3Vピンに接続しましょう。動作時の消費電流が1.4mAなので、余裕で給電可能です。

f:id:kinokorori:20180225014458p:plain

RaspberryPiの設定(ソフト)

上記の通り、I2SのGPIOピンは18,19,20(,21)を接続し、ALT0で利用します。ただし、ALT0でI2Sを有効にするだけでなく、デバイスドライバも必要です。しかし、RaspberryPiのデフォルトでは、I2Sマイクで利用可能なモジュールが存在しません。

ただ、カーネルソースにはモジュールがあるので、カーネルをビルドしてカーネルモジュールとくっつけて利用する説明が数多く存在します。

この辺とか。

GitHub - nejohnson2/rpi-i2s: Using the ICS43432 MEMS microphone on a Raspberry Pi with i2s

調べていると、Device-Treeを利用した、もっと簡単な方法を公開している人がいましたので、今回はそちらを紹介します。

GitHub - gtalusan/admp441-rpi: ADMP441 for the Raspberry Pi

手順は書いてありますが、少し補足説明を加えておきます。

kernelフォルダのビルド

git cloneして、kernelフォルダの中身をビルドします。

$ git clone https://github.com/gtalusan/admp441-rpi.git
$ cd admp441-rpi
$ cd kernel
$ make
$ make install

おそらく、make時に以下のようなエラーが出ると思います。

make -C /lib/modules/4.9.59+/build M=/home/pi/admp441-rpi/kernel modules
make[1]: *** /lib/modules/4.9.59+/build: No such file or directory.  Stop.
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2

このエラーが発生した場合、

$ sudo apt-get install raspberrypi-kernel-headers

を実行してみてください。それでも解決しない場合、おそらくraspberrypi-kernel-headersでインストールされるバージョンと、uname -rのバージョンがずれています。カーネルビルドを施したのであれば、ターゲットのbuildから、ビルドに用いたlinuxディレクトリへのシンボリックリンクを貼ってみてください。

Device Tree Overlay

Device-Treeに登録します。

$ cd ../dts
$ dtc -@ -I dts -O dtb -o i2s-soundcard.dtbo i2s-soundcard-overlay.dts
$ sudo cp i2s-soundcard.dtbo /boot/overlays

これはただ実行するだけです。dtc実行時にwarningが出ますが、特に問題はなさそうです。

Configuration

以上の全てが完了後、/etc/modulesの末尾にadmp441を追加し、/boot/config.txtに、dtoverlay=i2s-soundcard,alsaname=mems-micを追加します。

編集を終えたらリブートをかけます。これで完了です。

※ ADMP411専用っぽい感じがしますが、I2SのMEMSマイクなら、同じモジュールで動作する可能性が高いです。

録音

まずは、録音デバイスの確認。arecord -lを叩いてチェックしてみます。

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: memsmic [mems-mic], device 0: bcm2835-i2s-admp441-hifi admp441-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

先ほど登録したmems-micがデバイスとして見えています。 では、早速録音してみます。

$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono voice.wav
Recording WAVE 'voice.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo

これでvoice.wavに音声が録音されます。録音できました、やったーと思いきや、めちゃくちゃゲインが低いです。再生してもなんだかほとんど聞こえません。

ゲイン調整

alsamixerやamixerでボリュームを調整できるよう、ALSAのPCMプラグインを登録します。ALSAのPCMプラグインは、ユーザ設定の場合は~/.asoundrcファイルに、システム全体に反映させる場合は/etc/asound.confに書き出します。今回は~/.asoundrcに書き出します。ファイル内容は以下の通りです。

pcm.dmic_hw {
    type hw
    card memsmic
    channels 2
    format S32_LE
}

pcm.dmic_sv {
    type softvol
    slave.pcm dmic_hw
    control {
        name "Boost Capture Volume"
        card memsmic
    }
    min_dB -3.0
    max_dB 30.0
}

上記内容は、基本的にここの情報を参照して、少し組み替えています。 https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-and-test

※PCMプラグインのフォーマットについては、こちらを参照のこと。 ALSA project - the C library reference: PCM (digital audio) plugins

登録はしたものの、alsamixerを開いても項目が出てきません。しかし、一度以下のようにもう一度arecordを実行したところ、alsamixerやamixerで設定できるようになりました。

$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v voice.wav

うーん、これは要調査ですね。とりあえず今回は、この問題は横に置いておきます。

$ alsamixer

でalsamixerを起動し、F6キーを押して、”mems-mic”を選択します。mems-micのボリューム設定に切り替わったら、F4キー、またはTABキーを押して、Captureの音量設定に切り替えます。

f:id:kinokorori:20180304015007p:plain

ボリュームを適当にあげて、再度録音してみましょう。今度はだいぶ録音音量が大きくなったはずです。