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化キットはんだ付けの注意
マイクの開口部が実装面の裏にあるので、ピンヘッダの装着面に注意しましょう。この通り、ちゃんと説明書に書いてあります。が、私ははんだ付けしてから気づきました……。
ピン配置
ピンの配置は次の通りです。直接挿すだけなので、難しくないです。L/RはGNDの場合は左チャンネル、+Vの場合は右チャンネルになりますが、1つしかマイクがない場合はどのみちモノラルになります。
電源電圧は1.8V~3.3Vなので、3.3Vピンに接続しましょう。動作時の消費電流が1.4mAなので、余裕で給電可能です。
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の音量設定に切り替えます。
ボリュームを適当にあげて、再度録音してみましょう。今度はだいぶ録音音量が大きくなったはずです。