この Howto では、Armadillo-IoT ゲートウェイ G4 に 8 つまでの PDM マイクを接続し、録音する方法をご紹介します。
Armadillo-IoT ゲートウェイ G4をベースにした内容になっていますが、Armadillo-X2でも動作確認しています。 Armadillo-X2はArmadillo-IoTゲートウェイ G4の機能を一部減らして小型にした製品で、基本的には同じソフトウェアで動作します。 また、拡張インターフェース(CON11)の仕様も同じですので、CON11用に作った拡張ボードは両方の製品で動作します。
使用する 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.dts
の iomuxc
に追記したピンと重複する記述があるので、
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:0
や plughw:0,0
のようにデバイスを指定します。
マイク感度の調整
alsamixer
や amixer
で調整できます。
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 > /dev/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 というライブラリを使用し、音源の位置推定ができます。
画像出典:GitHub - introlab/odas: ODAS: Open embeddeD Audition System