I2Sインタフェースを使用し、 デジタルマイクをRaspberry Pi 3に接続して録音します。「Raspberry Pi 3にマイクロホンの接続」ではUSBに接続したヘッドセットから入力した音声をwaveファイルに録音しましたが、今回はスイッチサイエンスから購入した「SPH0645LM4H搭載 I2S MEMSマイクモジュール」を使って、音声をwaveファイルに録音します。なおRaspberry Pi 3で使用したRaspbianのimgファイルのバージョンは「2018-04-18-raspbian-stretch」です。
SPH0645LM4H搭載 I2S MEMSマイクモジュールとRaspberry Pi 3の接続
マイクモジュールの仕様を次に示します。
- 約50 Hz〜15 kHzでオーディオ録音/検出
- 搭載のマイクはモノラルで、2個使用することによりステレオ出力
- 動作電圧 : 1.6 V 〜 3.3 V
- インタフェース:I2S
マイクモジュールにはPowerピン「3V」「GND」の他に次の信号ピンがあります。
信号名 | 説明 |
---|---|
BCLK | データ転送を行うI2Sマスターからのデータクロック |
DOUT | マイクからのデータ出力 |
LRCLK | ワードセレクトを示す左/右のクロック |
SEL | 左右のチャンネルを示し、lowの場合は左チャンネルモノラル |
マイクモジュールとRaspberry Pi 3の接続を次に示します。I2SインタフェースのGPIOピンは18,19,20(21)を接続し、ALT0で利用します。
マイクモジュール信号名 | Raspberry Pi 3信号名 |
---|---|
3V | 3V |
GND | GND |
BCLK | GPIO18 |
DOUT | GPIO20 |
LRCLK | GPIO19 |
SEL | - |
マイクモジュールとRaspberry Pi 3を接続した画像を次に示します。
Raspberry Pi 3のI2Sインタフェースの設定
Raspberry Pi 3のI2Sインタフェースを使用するために、ALT0でI2Sを有効にし、デバイスドライバを使用します。しかし、RaspberryPiのデフォルトでは、I2Sマイクで利用可能なモジュールが存在しないため、カーネルをビルドしてI2Sマイク用のカーネルモジュールと組み合わせ、デバイスドライバをインストールします。
1.I2S構成設定
次のコマンドでファイル「config.txt」を開き、「#dtparam=i2s=on」のコメント「#」を削除します。
$ sudo vi /boot/config.txt
次のコマンドでファイル「modules」を開き、「snd-bcm2835」を最後の行に追加します。
$ sudo vi /etc/modules
次のコマンドでrebootします。
$ sudo reboot
次のコマンドでモジュールがロードされていることを確認します。「snd_pcm_dmaengine,snd_soc_bcm2835_i2s,snd_bcm2835,snd_soc_core」により確認できます。
$ lsmod | grep snd snd_soc_bcm2835_i2s 16384 2 snd_soc_simple_card 16384 0 snd_soc_simple_card_utils 16384 1 snd_soc_simple_card snd_soc_core 188416 3 snd_soc_simple_card_utils,snd_soc_bcm2835_i2s,snd_soc_simple_card snd_compress 20480 1 snd_soc_core snd_pcm_dmaengine 16384 1 snd_soc_core snd_bcm2835 32768 1 snd_pcm 98304 4 snd_pcm_dmaengine,snd_soc_bcm2835_i2s,snd_bcm2835,snd_soc_core snd_timer 32768 1 snd_pcm snd 69632 7 snd_compress,snd_timer,snd_bcm2835,snd_soc_core,snd_pcm
2.カーネルコンパイル
I2Sインタフェースを利用するために、手動でコンパイルします。最初に次のコマンドでRaspberry Piを更新します。
$ sudo apt-get update $ sudo apt-get install rpi-update $ sudo rpi-update
次のコマンドでrebootします。
$ sudo reboot
次のコマンドでコンパイルの依存関係をインストールします。
$ sudo apt-get install git bc libncurses5-dev
次のコマンドでカーネルソースをダウンロードしてコンパイルします。少し時間がかかります。
$ sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source $ sudo chmod +x /usr/bin/rpi-source $ /usr/bin/rpi-source -q --tag-update $ rpi-source --skip-gcc
3.I2Sモジュールの準備
I2Sが使用できるか次のコマンドで確認します。「mount: debugs is already mounted」が表示されます。
$ sudo mount -t debugfs debugs /sys/kernel/debug
次のコマンドで、モジュール名「3f203000.i2s」が表示されることを確認します。
$ sudo cat /sys/kernel/debug/asoc/platforms 3f203000.i2s snd-soc-dummy
次のコマンドでモジュールをダウンロードします。
$ git clone https://github.com/PaulCreaser/rpi-i2s-audio $ cd rpi-i2s-audio
次のコマンドでモジュールをコンパイルします。
$ make -C /lib/modules/$(uname -r )/build M=$(pwd) modules $ sudo insmod my_loader.ko
次のコマンドでモジュールがロードされたことを確認します。「my_loader」が表示されます。
$ lsmod | grep my_loader my_loader 16384 0
4.起動時にI2Sモジュールの自動ローディング
Raspberry Piの起動時にデバイスドライバがロードされるように、次のコマンドで設定します。
$ sudo cp my_loader.ko /lib/modules/$(uname -r) $ echo ‘my_loader’ | sudo tee –append /etc/modules > /dev/null $ sudo depmod -a $ sudo modprobe my_loader
次のコマンドでrebootします。
$ sudo reboot
PH0645LM4H搭載 I2S MEMSマイクを使った録音とその再生
デバイス「PH0645LM4H搭載 I2S MEMSマイク」を確認するために次のコマンドを実行し、「snd_rpi_simple_card」が表示されることを調べます。
$ arecord -l **** List of CAPTURE Hardware Devices **** card 1: sndrpisimplecar [snd_rpi_simple_card], device 0: simple-card_codec_link snd-soc-dummy-dai-0 [] Subdevices: 1/1 Subdevice #0: subdevice #0
次にコマンドを実行して、マイクモジュールに向かって話すと、waveファイル「mic.wav」にその声が録音されます。
$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v mic.wav Recording WAVE 'mic.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Mono Plug PCM: Route conversion PCM (sformat=S32_LE) Transformation table: 0 <- 0*0.5 + 1*0.5 Its setup is: stream : CAPTURE access : RW_INTERLEAVED format : S32_LE subformat : STD channels : 1 rate : 48000 exact rate : 48000 (48000/1) msbits : 32 buffer_size : 24000 period_size : 6000 period_time : 125000 tstamp_mode : NONE tstamp_type : MONOTONIC period_step : 1 avail_min : 6000 period_event : 0 start_threshold : 1 stop_threshold : 24000 silence_threshold: 0 silence_size : 0 boundary : 1572864000 Slave: Hardware PCM card 1 'snd_rpi_simple_card' device 0 subdevice 0 Its setup is: stream : CAPTURE access : MMAP_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 32 buffer_size : 24000 period_size : 6000 period_time : 125000 tstamp_mode : NONE tstamp_type : MONOTONIC period_step : 1 avail_min : 6000 period_event : 0 start_threshold : 1 stop_threshold : 24000 silence_threshold: 0 silence_size : 0 boundary : 1572864000 appl_ptr : 0 hw_ptr : 0 ##+ | 02%^CAborted by signal Interrupt... ##+ | 02%
作成したwavファイルのヘッダ情報を次に示します。
オーディオチャンネル数(モノラル: 1 ステレオ:2 ) : 1 サンプルサイズ(バイト数) : 4 サンプリングレート : 48000 オーディオフレーム数 : 420000 圧縮形式 : NONE (圧縮形式) : not compressed パラメータ : _wave_params(nchannels=1, sampwidth=4, framerate=48000, nframes=420000, comptype='NONE', compname='not compressed')
「Raspberry Pi 3にマイクロホンの接続」に従って、作成したwaveファイル「mic.wav」を再生します。もしくは、作成したwaveファイル「mic.wav」をダウンロードしてパソコンで再生します。