Howto

Armadillo-IoT ゲートウェイ G4 で PDM マイクを使用する方法

この Howto では、Armadillo-IoT G4 に 8 つまでの PDM マイクを接続し、録音する方法をご紹介します。

使用する PDM マイク

1.8Vで動作する PDM マイクであれば、レベル変換回路等なしで使用することができます。
使用可能と思われるマイクの例を以下に示します。

マイク単体

  • MP34DT01-M
  • SPM0405HD4H

実装済み基板

  • Adafruit PDM Microphone Breakout
  • 秋月電子 デジタルシリコンマイクロホンモジュール SPM0405HD4H

この検証では、秋月電子 デジタルシリコンマイクロホンモジュール SPM0405HD4H を8つ使用し、
マイクアレイを構成しました。

接続方法

CON11 を使用します。 接続方法は以下の通りです。
L/R の接続に注意してください。
チャンネル番号が小さいほうから順に使用してください。

例:

  • モノラル : CH0
  • ステレオ : CH0(L), CH1(R)
  • 8 チャンネル : 全チャンネル使用
CON11
ピン番号
ピン名 CH0 CH1 CH2 CH3 CH4 CH5 CH6 CH7
17 SAI5_RXC CLK CLK CLK CLK CLK CLK CLK CLK
19 SAI5_RXD0 DAT DAT
21 SAI5_RXD1 DAT DAT
23 SAI5_RXD2 DAT DAT
25 SAI5_RXD3 DAT DAT
30 VDD_1V8 VDD VDD, L/R VDD VDD, L/R VDD VDD, L/R VDD VDD, L/R
34 GND GND, L/R GND GND, L/R GND GND, L/R GND GND, L/R GND

Device Tree のカスタマイズ

現時点では at-dtweb では設定できないので、Device Tree に直接追記します。
編集するのは arch/arm64/boot/dts/freescale/ 内にある以下 2 つのファイルです。

  • armadillo_iotg_g4.dts
  • armadillo_iotg_g4-expansion-interface.dtsi

armadillo_iotg_g4.dts には 3 箇所の追記が必要です。

1 つ目は root ノードの中に sound-micfil を追加します。

/ {
    model = "Atmark-Techno Armadillo-IoT Gateway G4 Board";
    compatible = "atmark,yakushima-es1", "fsl,imx8mp";

        :
        :
        :

    sound-micfil {
        compatible = "fsl,imx-audio-micfil";
        model = "imx-audio-micfil";
        cpu-dai = <&micfil>;
    };
};

2 つ目は iomuxc ノードの中に pinctrl_pdm: pdmgrp を追加します。
この部分はピンの定義をしています。
モノラル・ステレオ(2 チャンネル以下)では以下のようにしてください。

&iomuxc {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_hog>;

        :
        :
        :

    pinctrl_pdm: pdmgrp {
        fsl,pins = <
            MX8MP_IOMUXC_SAI5_RXC__AUDIOMIX_PDM_CLK         0x80
            MX8MP_IOMUXC_SAI5_RXD0__AUDIOMIX_PDM_BIT_STREAM00   0x80
        >;
    };
};

8 チャンネルすべて使用する場合は、以下の記述も追加してください。

            MX8MP_IOMUXC_SAI5_RXD1__AUDIOMIX_PDM_BIT_STREAM01   0x80
            MX8MP_IOMUXC_SAI5_RXD2__AUDIOMIX_PDM_BIT_STREAM02   0x80
            MX8MP_IOMUXC_SAI5_RXD3__AUDIOMIX_PDM_BIT_STREAM03   0x80

3 つ目は micfil ノードを追加します。

&micfil {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_pdm>;
    assigned-clocks = <&clk IMX8MP_CLK_PDM>;
    assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>;
    assigned-clock-rates = <196608000>;
    status = "okay";
};

armadillo_iotg_g4-expansion-interface.dtsi の編集は、armadillo_iotg_g4-at-dtweb.dtb を使用する場合に必要です。
上で armadillo_iotg_g4.dtsiomuxc に追記したピンと重複する記述があるので、
MX8MP_IOMUXC_SAI5_RXC, MX8MP_IOMUXC_SAI5_RXD が含まれる行をコメントアウトします。
モノラル・ステレオ(2 チャンネル以下)では以下のようにしてください。

            // MX8MP_IOMUXC_SAI5_RXC__GPIO3_IO20    0x40000000 // CON11_17
            MX8MP_IOMUXC_SAI3_TXD__GPIO5_IO01   0x40000000 // CON11_18
            // MX8MP_IOMUXC_SAI5_RXD0__GPIO3_IO21   0x40000000 // CON11_19

8 チャンネルすべて使用する場合は、以下のコメントアウトも追加してください。

            // MX8MP_IOMUXC_SAI5_RXD1__GPIO3_IO22   0x40000000 // CON11_21  
            MX8MP_IOMUXC_SAI3_MCLK__GPIO5_IO02  0x40000000 // CON11_22
            // MX8MP_IOMUXC_SAI5_RXD2__GPIO3_IO23   0x40000000 // CON11_23
            MX8MP_IOMUXC_GPIO1_IO15__GPIO1_IO15 0x40000000 // CON11_24
            // MX8MP_IOMUXC_SAI5_RXD3__GPIO3_IO24   0x40000000 // CON11_25

これは at-dtweb の save により上書きされるため、save 後毎回必要になります。

イメージのビルド・書き込み

製品マニュアル内「9.4.2. Linux カーネルをビルドする」の方法でカーネルをビルドし、
dtb ファイルと Image ファイルを Armadillo に書き込んでください。

コンテナの作成・ログイン

コンテナイメージをダウンロード・起動します(ネットワークに繋がっている必要があります)。

[armadillo ~]# podman run -it --name=rec_example --device /dev/snd docker.io/debian /bin/bash

alsa-utilsのインストール

コンテナにalsa-utilsをインストールします。

[container /]# apt update && apt upgrade -y && apt install -y alsa-utils

録音デバイスの一覧表示

arecord -l で録音デバイスの一覧を確認できます。

[container /]# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: imxaudiomicfil [imx-audio-micfil], device 0: micfil hifi snd-soc-dummy-dai-0 [micfil hifi snd-soc-dummy-dai-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Device [USB Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

PDMマイクは imxaudiomicfil として認識されます。
この例の場合、カード 0 のサブデバイス 0 が PDM マイクですので、以降は hw:0plughw:0,0 のようにデバイスを指定します。

マイク感度の調整

alsamixeramixer で調整できます。
alsamixer は GUI ライクで、マウスでも操作できるようです。

ステレオの場合、 CH0, CH1 の感度を調整します。
また、フィルターの設定によっても感度が変わります。 以下にステレオの場合の推奨設定を示します。

[container /]# amixer -D hw:0 sset 'CH0' '100%'
[container /]# amixer -D hw:0 sset 'CH1' '100%'
[container /]# amixer -D hw:0 sset 'MICFIL DC Remover Control' 'Cut-off @21Hz'
[container /]# amixer -D hw:0 sset 'MICFIL Quality Select' 'VLow0'

なお、 Armadillo を再起動するとデフォルト設定に戻ってしまいます。
コンテナイメージ等を作成する際は、コンテナ起動時にこれらのコマンドが実行されるようにしてください。

マイク動作・感度の確認

以下のようなコマンドで、マイクの反応を確認することができます。

[container /]# arecord -Vstereo -D plughw:0,0 -f cd -c 2 > null

録音

arecord を使用します。

[container /]# arecord -D plughw:0,0 -f cd mic_rec.wav -d 10

もしくは

[container /]# arecord -D plughw:0,0 -r 44100 -f S16_LE -c 2 mic_rec.wav -d 10

のようにすると、 CD の音質(サンプルレート 44.1kHz 、ステレオ)で 10 秒間録音します。
以下にいくつか例を挙げます。

# 192KHz, 8ch, 10秒
[container /]# arecord -D plughw:0,0 -r 192000 -f S16_LE -c 8 mic_rec.wav -d 10

# 44.1KHz, 1ch, 1時間
[container /]# arecord -D plughw:0,0 -r 44100 -f S16_LE -c 1  mic_rec.wav -d 3600

(無圧縮録音となりますので、空き容量に注意してください)

録音したファイルの確認

ls コマンドなどで確認できます。

[container /]# ls -l
total 30004
-rw-r--r--    1 root     root      30720044 Dec 15 02:58 mic_rec.wav

再生デバイスの一覧表示

aplay -l で録音デバイスの一覧を確認できます。

[container /]# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: audiohdmi [audio-hdmi], device 0: imx8 hdmi i2s-hifi-0 [imx8 hdmi i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Device [USB Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

この例では HDMI と USB オーディオデバイスが表示されています。

再生

上の例で確認できた USB オーディオデバイスから音を再生する例です。

[container /]# aplay -D plughw:2,0 mic_rec.wav

波形の確認

Audacity などを使用し、録音した音声の波形を確認することができます。
以下は 8 チャンネルで録音した場合の波形です。

マイクアレイの応用例

ODAS というライブラリを使用し、音源の位置推定ができます。

ODAS リポジトリ内 スクリーンショット 画像出典:GitHub - introlab/odas: ODAS: Open embeddeD Audition System