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の接続
マイクモジュール信号名 Raspberry Pi 3信号名
3V 3V
GND GND
BCLK GPIO18
DOUT GPIO20
LRCLK GPIO19
SEL -

マイクモジュールとRaspberry Pi 3を接続した画像を次に示します。

PH0645LM4H搭載 I2S MEMSマイクと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」をダウンロードしてパソコンで再生します。