🎤

Jetson Orin NanoでI2Sマイクを動かす:JetPack6特有の落とし穴と解決法

に公開

はじめに

「はんだごて台もない、部品を固定するクリップもない」

机の上でINMP441マイクモジュールを手で押さえながら、はんだごてを握ったとき、自分のエンジニアリングの準備不足に愕然としました。

マイクモジュールにピンを通して、ピンとピンホールをハンダづけするのですが、そもそも接着前なのでうまいこと姿勢を保ってくれなくて、両手ははんだとコテで塞がっているので、部品を固定できないのです。しかも台もないので、燃えても良さそうな雑誌の上(その下はガラストップのテーブル)で作業するという素人さでした。

背景:なぜ今、I2Sマイクなのか

AI音声対話デバイス「PokePal」の2台目を構築中。1台目のRaspberry Pi 5ではUSBマイクで動作確認できましたが、Jetson Orin NanoではよりコンパクトなI2Sマイクに挑戦することにしました。

しかし、電子工作初心者の私には大きな落とし穴が...

はんだ付けという最初の壁

INMP441モジュールを開封して気づいたのは、ピンヘッダーが付いていないこと。そして私の作業机には:

  • ❌ はんだごて台(はんだごてを置く場所がない!)
  • ❌ 基板固定用のクリップ(手で押さえるしかない)
  • ❌ フラックス(はんだの乗りを良くする魔法の液体)
  • ✅ はんだごてとはんだ(さいしょははんだだけ買っていて、セットが必要だと後で気づいた)

それでもモジュールを絶妙なバランスにしつつ、不格好ながらもなんとか6本のピンを接続しました。

はんだ付け直後の状態
道具なしでのはんだ付け。固定できないからうまく角度をセットできていない

直面した問題

I2Sピンが無効

Jetson Orin NanoのI2Sピン(40ピンヘッダー)は、デフォルトではGPIOモードになっています:

# I2Sデバイスへの録音を試みる
arecord -D plughw:APE,0 -f S32_LE -r 48000 -c 2 test.wav
# 結果:I/O error または無音

JetPack 6の新仕様

従来のJetPackで使えた(らしい)方法が、JetPack 6(L4T R36.3)では動作しません:

  • FDTOVERLAYSがU-Bootでサポートされていない
  • jetson-ioツールが期待通り動作しない

はんだ付け完了、しかし音が出ない

配線を接続し、いよいよ録音テスト。期待を込めてコマンドを実行:

arecord -D plughw:APE,0 -f S32_LE -r 48000 -c 2 test.wav
# 録音はできたが...無音のファイルが生成される

デバイスは認識されているのに、音が録音されない。ここからいろいろ試行錯誤でした。

試行錯誤の記録

失敗1:ADMAIFルーティング設定

# I2Sルーティング設定を試みる(ピン未設定のため失敗)
amixer -c APE cset name='I2S2 Mux' ADMAIF2
# エラー:Cannot find the given element

ピン自体がI2Sモードになっていないため、ルーティング設定だけでは解決しません。

失敗2:カスタムDTBO作成

Device Tree Overlayを自作しようとしましたが、JetPack 6ではFDTOVERLAYSがサポートされていないため、extlinux.confで指定しても読み込まれませんでした。

失敗3:jetson-ioツール

sudo /opt/nvidia/jetson-io/jetson-io.py

JetPack 6では、jetson-ioツールでI2S設定を行っても、実際には反映されないケースがあります。

失敗4:全角スペースの罠

# extlinux.confを編集(見た目は正しい)
FDT /boot/dtb/tegra234-runtime-hdr40.dtb
#  ↑実は全角スペースが混入していた!

設定ファイルに全角スペースが混入し、起動時にエラーになる初歩的なミスもありました。

解決方法:既存リソースの活用

ステップ1:NVIDIA提供DTBOの発見

実は、NVIDIAが既にI2S設定用のDTBOファイルを提供していました:

# 既存のI2S設定用DTBOを確認
ls -la /boot/tegra234-p3767-0000+p3509-a02-hdr40.dtbo
# ファイルが存在することを確認

ステップ2:DTBに直接統合

JetPack 6ではオーバーレイの動的適用ができないため、事前に統合します:

# fdtoverlayコマンドでDTBとDTBOを統合
sudo fdtoverlay -i /boot/dtb/tegra234-runtime.dtb \
                 -o /boot/dtb/tegra234-runtime-hdr40.dtb \
                 /boot/tegra234-p3767-0000+p3509-a02-hdr40.dtbo

# 統合結果を確認
ls -la /boot/dtb/tegra234-runtime-hdr40.dtb

ステップ3:ブートローダー設定の更新

# extlinux.confをバックアップ
sudo cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.backup

# 編集
sudo nano /boot/extlinux/extlinux.conf

FDT行を変更:

# 変更前
FDT /boot/dtb/kernel_tegra234-p3767-0000+p3509-a02.dtb

# 変更後
FDT /boot/dtb/tegra234-runtime-hdr40.dtb

ステップ4:再起動と確認

# 再起動
sudo reboot

# 起動後、I2Sピンの状態を確認
cat /sys/kernel/debug/pinctrl/2430000.pinmux/pinmux-pins | grep -i i2s

以下のように表示されれば成功です:

pin 47 (PH00): (MUX UNCLAIMED) (GPIO UNCLAIMED) (func i2s2 in TEGRA234_PAD_I2S2_SCLK_PH0)
pin 48 (PH01): (MUX UNCLAIMED) (GPIO UNCLAIMED) (func i2s2 in TEGRA234_PAD_I2S2_DOUT_PH1)
pin 49 (PH02): (MUX UNCLAIMED) (GPIO UNCLAIMED) (func i2s2 in TEGRA234_PAD_I2S2_DIN_PH2)
pin 50 (PH03): (MUX UNCLAIMED) (GPIO UNCLAIMED) (func i2s2 in TEGRA234_PAD_I2S2_FS_PH3)

INMP441の配線

必要な部品(理想)

  • INMP441 I2S MEMSマイクモジュール
  • ジャンパーワイヤー(メス-メス)6本
  • はんだごて
  • はんだごて台(私は持っていなかった...)
  • 基板固定用クリップ(こんなのがあったなんて!)
  • フラックス(はんだ付けを楽にする魔法の液体、これも...)

配線表

INMP441ピン Jetson 40ピンヘッダー 説明
VDD Pin 1 3.3V電源
GND Pin 6 グランド
SD Pin 38 I2S2_SDIN(データ入力)
SCK Pin 12 I2S2_SCLK(シリアルクロック)
WS Pin 35 I2S2_FS(フレームシンク)
L/R Pin 9 GND(左チャンネル選択)

配線接続後の状態
完成したINMP441マイクの配線。小さなモジュールから6本のワイヤーが伸びる様子

動作確認

録音テスト

# 5秒間録音(詳細表示付き)
arecord -D plughw:APE,0 -f S32_LE -r 48000 -c 2 -d 5 -vv test_i2s.wav

正常に動作している場合の出力:

Recording WAVE 'test_i2s.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo
Hardware PCM card 1 'NVIDIA Jetson Orin NX APE' device 0 subdevice 0
Its setup is:
  stream       : CAPTURE
  access       : RW_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     : 6755399441055744000
####################+ | 53%

レベルメーターが50%前後を示していれば、マイクが正常に音を拾っています。

再生テスト

# USBスピーカーで再生(カード番号は環境により異なる)
aplay -D plughw:2,0 test_i2s.wav

# または、デフォルトデバイスで再生
aplay test_i2s.wav

音質の確認

録音したファイルの詳細情報:

file test_i2s.wav
# test_i2s.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 32 bit, stereo 48000 Hz

# 音声波形を確認(soxパッケージが必要)
sox test_i2s.wav -n stat

トラブルシューティング

無音で録音される場合

  1. 配線を再確認:特にSCK(Pin 12)とWS(Pin 35)の接続
  2. ピン状態を確認
    cat /sys/kernel/debug/pinctrl/2430000.pinmux/pinmux-pins | grep -E "PH0[0-3]"
    
  3. デバイスの確認
    arecord -l | grep APE
    

I/Oエラーが出る場合

  1. DTB統合を再実行
  2. extlinux.confの確認(全角スペースに注意)
  3. 別のDTBファイルを試す

レベルメーターが0%の場合

  1. INMP441の電源を確認(3.3Vが供給されているか)
  2. L/Rピンの接続を確認(左右チャンネルの選択)
  3. 別のINMP441モジュールを試す

パフォーマンス評価

音質特性

INMP441の実測特性:

  • SNR:実測約61dB(仕様値65dB)
  • 周波数特性:60Hz〜15kHz(音声認識に十分)
  • 感度:-26dBFS(通常会話レベルで適切)
  • 消費電力:約1.4mA(省電力)

CPUリソース

# 録音中のCPU使用率を確認
top -p $(pgrep arecord)

I2S録音のCPU使用率は約1〜2%と非常に低く、音声認識処理に十分なリソースを残せます。

JetPack 6での注意点

1. FDTOVERLAYSが非対応

従来のJetPackとは異なり、U-BootレベルでのDTBオーバーレイ適用ができません:

  • /boot/extlinux/extlinux.confFDTOVERLAYS行は無視される
  • DTBOファイルは事前に統合する必要がある

2. jetson-ioツールの制限

JetPack 6では、jetson-ioツールが完全に機能しない場合があります:

  • GUIでの設定が実際に適用されない
  • 手動でのDTB統合が確実

3. デバッグ情報の確認方法

# カーネルログでI2S関連のメッセージを確認
dmesg | grep -i i2s

# ALSAデバイスの詳細情報
cat /proc/asound/cards
cat /proc/asound/APE/pcm0c/info

まとめ

成果

  • ✅ INMP441 I2Sマイクの接続成功
  • ✅ JetPack 6特有の問題を解決
  • ✅ USBマイクより小型で省電力な音声入力を実現
  • ✅ 音声認識に十分な音質を確保
  • ✅ はんだごて台なしでのはんだ付けサバイバル成功

学んだこと

技術面

  1. 既存リソースの確認が重要:カスタムDTBO作成前に、NVIDIA提供のファイルを探す
  2. バージョン固有の情報に注意:JetPack 6は従来とは異なる仕様
  3. 基本的なミスも見逃さない:全角スペースなどの初歩的な問題も要チェック

人生面

  1. 準備の大切さ:電子工作には適切な道具が必要
  2. でも諦めない心も大切:道具がなくても工夫次第でなんとかなる

次のステップ

  • MAX98357A I2Sアンプの接続(完全I2S音声システムへ)
  • はんだごて台を買う(これが一番重要かも...)

参考リンク


Jetson Orin NanoでI2Sマイクを使いたい方の参考になれば幸いです。

Discussion