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
トラブルシューティング
無音で録音される場合
- 配線を再確認:特にSCK(Pin 12)とWS(Pin 35)の接続
-
ピン状態を確認:
cat /sys/kernel/debug/pinctrl/2430000.pinmux/pinmux-pins | grep -E "PH0[0-3]"
-
デバイスの確認:
arecord -l | grep APE
I/Oエラーが出る場合
- DTB統合を再実行
- extlinux.confの確認(全角スペースに注意)
- 別のDTBファイルを試す
レベルメーターが0%の場合
- INMP441の電源を確認(3.3Vが供給されているか)
- L/Rピンの接続を確認(左右チャンネルの選択)
- 別の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.conf
のFDTOVERLAYS
行は無視される - 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マイクより小型で省電力な音声入力を実現
- ✅ 音声認識に十分な音質を確保
- ✅ はんだごて台なしでのはんだ付けサバイバル成功
学んだこと
技術面
- 既存リソースの確認が重要:カスタムDTBO作成前に、NVIDIA提供のファイルを探す
- バージョン固有の情報に注意:JetPack 6は従来とは異なる仕様
- 基本的なミスも見逃さない:全角スペースなどの初歩的な問題も要チェック
人生面
- 準備の大切さ:電子工作には適切な道具が必要
- でも諦めない心も大切:道具がなくても工夫次第でなんとかなる
次のステップ
- MAX98357A I2Sアンプの接続(完全I2S音声システムへ)
- はんだごて台を買う(これが一番重要かも...)
参考リンク
Jetson Orin NanoでI2Sマイクを使いたい方の参考になれば幸いです。
Discussion