Jetson NanoのI2S音声:Raspiaudio Audio+を設定する方法
Jetson NanoでRaspiaudio Audio+を使うには、jetson-ioでI2S4のピンを有効にし、起動のたびにピンを音声モードへ強制設定して、I2S4を音声ドライバーにつなぎます。Jetson Nanoの開発キットはAIやロボティクス向けですが、アナログ音声出力はありません。Raspiaudio Audio+ボードはRaspberry Pi用のサウンドカードで、Nanoの40ピンヘッダーにも接続できます。
このガイドはJetson Nano B02(2019)の全手順を説明します。完了すると、Audio+のヘッドホン端子から音が出ます。
始める前に:Jetson NanoのモデルとAudio+の互換性
まずJetson Nanoをセットアップしてください。まだの場合は、NVIDIAのJetson Nanoセットアップガイドに従います。モニターとキーボードを使い、Nanoをデスクトップまで起動できる状態にしてください。
必要なもの: Jetson Nano B02とRaspiaudio Audio+ボードです。Audio+の40ピンコネクターは、Nanoのヘッダーに直接はまります。すべてのピンが接触するよう、しっかり押し込んでください。
このガイドは、P3450とも呼ばれるJetson Nano B02開発キット(2019)で確認しました。P3449のキャリアボード上にP3448モジュールが載っています。Jetson Nanoは受動冷却のヒートシンクで見分けられます。より新しいJetsonモデルはファンを使います。B02には、小さな「張り出し」のように突き出たピンの列があり、古いA01モデルにはありません。
古いA01や、より新しいJetsonを使っている場合、手順はそのまま適用できないので参考用にしてください。Raspiaudioのコミュニティーで、工夫した点を共有できます。
**他のI2S DACボード:**Audio+や同様のRaspberry Pi用DACには制御インターフェースがなく、I2Sインターフェースだけがあります。Jetson Nano用のRaspberry Pi I2SサウンドカードについてのNVIDIAフォーラムの投稿では、ピンを設定すれば、こうしたボードは動作するはずだと説明されています。そのため、以下の手順はNano B02で同種のI2S DACを使う際にも出発点になります。
このガイドのきっかけとなった、40ピンコネクターのI2S音声出力を有効にするNVIDIAフォーラムの投稿を書いたjas-mxに感謝します。
手順1:jetson-ioでI2S4の音声ピンを有効にする
標準状態では、Jetson Nanoはこれらのヘッダーピンを音声に使いません。モニターとキーボードをつなぎ、Nanoを起動してターミナルを開き、実行します。
sudo /opt/nvidia/jetson-io/jetson-io.py
メニュー式のツールが開きます。
- 方向キー(上/下)で**「Configure Jetson 40pin Header」**を選択状態にし、Enterを押します
- **「Configure header pins manually」**を選び、Enterを押します
- チェックボックスの一覧で**「i2s4」(ピン12、35、38、40)と「audio_mclk」(ピン7)を探します。それぞれでSpace**を押し、アスタリスク [*] を付けます。
- **「Back」**を選びます
- **「Save pin changes」**を選びます
- **「Save and reboot to reconfigure pins」**を選びます
Jetson Nanoが再起動します。ツールは、これらのピンを音声に割り当てる独自のデバイスツリー(DTB)を作り、/boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtbに保存します。
手順2:ピンがI2Sモードか確認する
再起動後、ピンのモードを確認します。
sudo cat /sys/kernel/debug/tegra_gpio | grep "J:"
次の表示になるはずです。J: 2:1 00 00 00 00 00 00 000000
どこかに「f0」がある場合(「f0 00 00」など)は、以下の修正が必要です。
「00」は、ピンがI2S音声用の特殊機能(SFIO)モードであることを示します。「f0」は、GPIOモードのままであることを示します。
手順3:必要ならsystemdサービスでピンを修正する
多くのB02ボードでは、ピンが音声モードへ切り替わりません。次のコマンドで修正できます。
sudo busybox devmem 0x6000d204 32 0
ピンを正しいモードに強制設定しますが、再起動するとGPIOモードに戻ります。起動のたびに修正するため、systemdサービスを作ります。
sudo tee /etc/systemd/system/fix-i2s4-pins.service <<EOF
[Unit]
Description=Fix I2S4 Pinmux for Jetson Nano
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/bin/busybox devmem 0x6000d204 32 0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
この起動時のサービスはGPIO設定レジスター0x6000d204に書き込み、Port JのピンをI2S4用のSFIOモードへ強制設定します。
サービスを有効にし、開始します。
sudo systemctl enable fix-i2s4-pins
sudo systemctl start fix-i2s4-pins
どちらのコマンドも、エラーなしで終了するはずです。「Failed to start fix-i2s4-pins.service: Unit not found」と表示される場合、サービスファイルが正しく作られていません。ログを確認します。
sudo journalctl -u fix-i2s4-pins
手順4:I2S4を音声ドライバーにつなぐ
I2S4インターフェースを音声システムへ接続します。
amixer -c tegrasndt210ref cset name='I2S4 Mux' ADMAIF1
出力はvalues=1で終わるはずです。「Invalid card」エラーなら、音声ドライバーがまだ読み込まれていません。再起動して、もう一度試してください。
これは、音声ドライバーが音声を送るADMAIF1インターフェースをI2S4へルーティングし、ドライバーをハードウェアのピンに接続します。
手順5:テスト音を再生する
このコマンドは、I2S4インターフェースへ48 kHz、16ビット、ステレオの正弦波を送ります。
speaker-test -D hw:tegrasndt210ref,0 -r 48000 -c 2 -F S16_LE -t sine
ヘッドホンやスピーカーから連続した音が聴こえるはずです。Ctrl+Cで止めます。
Audio+ボードの動作を確認する方法
音が聴こえたら、Raspiaudio Audio+はJetson Nano B02で動作しています。手順3のサービスにより、再起動後もピンの修正が適用されます。
補足:独自のDTBでJetson Nanoに書き込む方法
上の方法は1台のデバイス向けです。量産のために複数のJetson Nanoボードへ書き込む場合、それぞれでjetson-ioのメニューを操作するのは手間です。代わりに、手順1で作ったDTB(Device Tree Blob、デバイスツリーのバイナリーファイル)を各ボードに書き込めば、ピン設定を先に適用できます。
/boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb
このファイルをコンピューターへコピーします。再書き込み時には、最初の起動前に/boot/フォルダーへ戻してください。
このDTBファイルは、作成したキャリアボードのリビジョンにだけ対応します。リビジョンはファイル名の末尾にあり、ここではb00です。異なるリビジョンのDTBを書き込むと、起動パーティションが壊れ、ホストコンピューターから全体を書き直す必要が生じることがあります。
Jetson Nanoに書き込む最も簡単な方法は、LinuxのホストコンピューターでNVIDIA SDK ManagerかNVIDIA Jetson Linux Driver Package(L4T)を使うことです。対応するLinuxディストリビューションが多いので、私はL4Tを勧めます。全手順は、L4Tを手動で取得して書き込むNVIDIAフォーラムの投稿にあります。以下は簡潔な手順です。
NVIDIA Jetson LinuxのアーカイブからL4Tをダウンロードします。Jetson Nanoでは、新しいJetPackのブランチではなく、Jetson Linux 32.7.x系列を使ってください。リリースページでDriver Package (BSP)とSample Root Filesystemを取得します。ドライバーパッケージはsudoなしで展開し、サンプルのルートファイルシステムはsudoを使ってLinux_for_Tegra/rootfs/へ展開します。
次にLinux_for_TegraフォルダーからNVIDIAのバイナリーを適用します。
sudo ./apply_binaries.sh
その後、micro USBでJetson Nanoをホストコンピューターに接続します。Nanoには独立した5V電源が必要です。
以下は、独自のDTBファイルでJetson Nanoに書き込むコマンドの例です。Nanoの独自DTBをホストにコピーしてから、ホストコンピューターで実行します。パスは自分のものに置き換えてください。
sudo ./flash.sh -k DTB
-d /path/to/your/file/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb
jetson-nano-devkit mmcblk1p1
書き込みのため、Jetson Nanoをリカバリーモードにする必要があるかもしれません。
- micro USBではなく、5V電源でJetson Nanoに給電します。
- ジャンパーワイヤー、クリップ、小さなドライバーで、「FC RCV」(強制リカバリー)ピンを「GND」ピンへ接続します。
- 「SYS_RST」(システムリセット)ピンを「GND」ピンへ接続し、Jetson Nanoを再起動します。
- micro USBでNanoをホストコンピューターに接続します。
ホストコンピューターで接続を確認します。
lsusb | grep -i nvidia
書き込み後も、起動のたびにピンを正しく設定するため、手順3のsystemdサービスを追加する必要があります。
関連ガイド
ボードから音が出たら、次のガイドで小型のシングルボードコンピューター向けニューラル音声プロジェクトを確認できます。
- IRCAMのRAVEモデル:軽量な「raspberry」設定とnn~外部オブジェクトは、持ち運べるインスタレーション向けの組み込みボードを対象とします。
- 無料のニューラルネットワークギタープラグイン:ToobAmpとStompboxはRaspberry Piのペダル製作でニューラルアンプモデルを動かします。
- Google MagentaのDDSP:Raspberry Piを基盤とするニューラルシンセサイザー、Open NSynth Superを含みます。