🤖

PokePal 2台目構築:Jetson Orin NanoでGPU搭載AI対話デバイスを作る

に公開

はじめに

PokePalプロジェクトでは、1台目のRaspberry Pi 5で音声対話システム(v0.1.76)が試験稼働中です。今回は2台目としてJetson Orin Nanoを使用し、GPU活用による高性能版を構築します。これにより、複数デバイスの混合運用(RasPi+Jetson)の検証と、将来の管理画面開発を準備します。

作業内容

  1. Jetson Orin Nano Developer Kitの初期セットアップ
  2. JetPack 6.0 OSのインストール
  3. I2S音声入出力システムの構築(マイク+アンプ+スピーカー)
  4. Docker環境とAzure IoT Edge Runtime設定
  5. 既存PokePalモジュール(voice-conversation等)の移植

技術スタック

ハードウェア

  • 本体: NVIDIA Jetson Orin Nano Developer Kit 8GB
  • ケース: KKSB NVIDIA Jetson Orin Nano Developer Kit Case
  • ストレージ: SanDisk Extreme PRO microSDXC 128GB (R:200MB/s, W:90MB/s, A2)
  • マイク: INMP441 I2S MEMSマイクモジュール
  • アンプ: MAX98357A I2S Class-Dアンプ(注文中)
  • スピーカー: Taoglas SPKM.15.8.A(φ15mm×8mm)
  • カメラ: USBカメラモジュール OV3660チップ 視野角110° 2048×1536 15fps(将来的な映像処理用、今回は未使用)
  • 電源: 専用ACアダプタ 19V/2.37A

ソフトウェア

  • OS: JetPack 6.0(Ubuntu 22.04ベース、CUDA対応)
  • コンテナ: Docker CE + NVIDIA Container Runtime
  • IoT: Azure IoT Edge Runtime 1.5
  • 音声処理:
    • Whisper(音声認識、GPU高速化予定)
    • OpenAI GPT-4(対話AI)
    • Azure Speech Services(音声合成)

1. Jetson Orin Nano + ケース

Jetson Orin Nano本体
Jetson Orin Nano Developer Kit 8GBとKKSBケース

購入先:

2. 音声周辺機器の準備

はんだなどが必要だったので今回は準備のみ

マイクモジュール

INMP441マイクモジュール
INMP441 I2S MEMSマイクモジュール - 高品質デジタル音声入力用

購入先: INMP441 I2S MEMSマイクモジュール:679円

スピーカーとアンプ

スピーカーとアンプ
Taoglasスピーカー(φ15mm)とPAM8302Aアンプ(アナログ用のため使用せず)
PAM8302AアンプはMAX98357Aアンプと間違えた😭
これだけamazonじゃなくて海外のサイトだったので、Taoglasスピーカーと一緒に買おうと思ったら間違ったものを買ってしまいました。。。
こちら↓が正しいようです。

TVETE MAX98357Aアンプ
TVETE製 MAX98357A I2Sアンプモジュール - デジタル音声出力用の正しい部品

購入先:

カメラモジュール(将来用)

USBカメラモジュール
OV3660チップ搭載 視野角110° USBカメラモジュール - 将来の映像処理用

購入先: OV3660 USBカメラモジュール:2,076円

3. ストレージの準備

SanDisk Extreme PRO
SanDisk Extreme PRO microSDXC 128GB - 高速読み書き対応(R:200MB/s, W:90MB/s)

購入先: SanDisk Extreme PRO microSDXC 128GB:2,310円

セットアップ手順

JetPack 6.0のインストール

1. JetPackイメージのダウンロード

NVIDIAの公式サイトから、Jetson Orin Nano Developer Kit用のJetPack 6.0 SDカードイメージをダウンロードします。

JetPack 6.0 ダウンロードページ
NVIDIAのJetPack SDK 6.0ダウンロードページ

https://developer.nvidia.com/embedded/jetpack-sdk-60

「SD Card Image Method」→「JETSON Orin Nano DEVELOPER KIT」を選択

2. balenaEtcherのインストール(macOS)

SDカードへの書き込みには、安全で使いやすいbalenaEtcherを使用します。

Homebrewでのインストール(失敗する場合あり)

# Homebrewでインストールを試みる
brew install --cask balenaetcher
# → M3 Maxで失敗:Error: Download failed on Cask 'balenaetcher' 
#   with message: Download failed: .../balenaEtcher-2.1.4-arm64.dmg

つまずきポイント:M1/M2/M3 MacでのHomebrew失敗
Apple Silicon Mac(M1/M2/M3)では、HomebrewからのbalenaEtcherインストールが失敗することがあります。ARM64版のダウンロードリンクが壊れているためです。

解決策:公式サイトから直接ダウンロード

  1. 公式サイトにアクセス:https://www.balena.io/etcher/
  2. 「ETCHER FOR MACOS (ARM64)」を選択(M1/M2/M3 Mac用)
  3. ダウンロードしたdmgファイルを開く
  4. balenaEtcherをアプリケーションフォルダにドラッグ&ドロップ

なぜbalenaEtcher?

  • 間違って内蔵ドライブを消す心配がない(自動的に除外)
  • 書き込み後に自動検証してエラーをチェック
  • 3ステップで簡単に完了

3. SDカードへの書き込み

重要:操作の順番

balenaEtcherは順番通りに操作する必要があります。「Select target」を先に押してもSDカードは選択できません。

正しい手順

balenaEtcher設定画面
balenaEtcherでJetPackイメージとSDカードを選択

  1. Flash from file を最初にクリック

    • ダウンロードしたJetPackイメージを選択
    • ファイル名例:jetson-orin-nano-devkit-sd-card.img
    • サイズ:約7-8GB
  2. Select target をクリック(Flash from file選択後にアクティブになる)

    • SDカード(SanDisk Extreme PRO 128GB)を選択
    • 容量が正しいことを確認(128GB前後と表示)
    • 内蔵ドライブは表示されないので安全
  3. Flash! をクリック

    • 管理者パスワードを入力(要求された場合)
    • 書き込み開始:約15-20分
    • 自動検証も実行される

balenaEtcher書き込み中
SDカードへのJetPackイメージ書き込み中(75%完了)

# 書き込み進捗
# Flashing... [===========     ] 75% 
# Validating... [================] 100%
# Flash Complete!

# 書き込み完了後、SDカードは自動的にアンマウントされます
# Jetsonに挿入する準備が整いました

Jetson初期セットアップの準備

必要な周辺機器

初期セットアップには以下の機器が必要です:

機器 用途 備考
DisplayPort-HDMIケーブル 映像出力 Jetsonはdisplayport出力
USBキーボード・マウス 初期設定入力 設定後はSSHで操作可能
LANケーブル ネットワーク接続 Wi-Fi設定も可能
モニター 画面表示 HDMI入力対応

Jetson初回起動と初期設定

Ubuntu初期設定

初回起動時のセットアップウィザード:

項目 設定値 備考
言語 日本語 or English お好みで
キーボード Japanese 日本語キーボードの場合
タイムゾーン Asia/Tokyo 日本時間
ユーザー名 任意 例:jetson
ホスト名 任意 例:jetson-nano-01
APP Partition Size デフォルト 最大サイズ推奨
Install Chromium Do not ヘッドレス運用のため不要

設定完了後、自動的に再起動されます。

SSH接続の設定

JetsonにSSHでリモート接続すると作業が楽になります:

# Jetsonのターミナルで実行
# IPアドレスを確認
hostname -I

# SSHサービスの確認(通常はデフォルトで有効)
sudo systemctl status ssh
# Macから接続
ssh [ユーザー名]@[JetsonのIPアドレス]
# 例:ssh jetson@***.***.***.***

Azure IoT Edge Runtimeのインストール

1. Microsoftリポジトリの追加

# Microsoft GPGキーを追加
curl https://packages.microsoft.com/keys/microsoft.asc | \
  gpg --dearmor | \
  sudo tee /usr/share/keyrings/microsoft-archive-keyring.gpg > /dev/null

# Ubuntu 22.04用リポジトリを追加
echo "deb [arch=arm64 signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] \
  https://packages.microsoft.com/ubuntu/22.04/prod jammy main" | \
  sudo tee /etc/apt/sources.list.d/microsoft-prod.list

2. IoT Edge Runtimeインストール

# パッケージリストを更新
sudo apt update

# IoT Edge Runtimeをインストール
sudo apt install -y aziot-edge

# バージョン確認
sudo iotedge version
# 結果:iotedge 1.5.21

3. IoT Hubデバイスの作成

Azure CLIを使用して新しいIoT Edgeデバイスを作成:

# Macのターミナルから実行
# 新しいEdgeデバイスを作成
az iot hub device-identity create \
  --hub-name [IoT Hub名] \
  --device-id [デバイスID] \
  --edge-enabled

# 接続文字列を取得
az iot hub device-identity connection-string show \
  --hub-name [IoT Hub名] \
  --device-id [デバイスID]

4. IoT Edge設定

Jetsonで設定ファイルを編集:

# 設定ファイルを編集
sudo nano /etc/aziot/config.toml

以下の内容に編集:

# Manual provisioning with connection string
[provisioning]
source = "manual"
connection_string = "HostName=xxx.azure-devices.net;DeviceId=xxx;SharedAccessKey=xxx"

# ホスト名を設定
hostname = "jetson-nano-01"

設定を適用:

# 設定を適用
sudo iotedge config apply

# サービスステータス確認
sudo iotedge system status

# モジュール確認
sudo iotedge list

5. 自動デプロイメントの設定

Azure DevOpsの自動デプロイメントを受け取るため、デバイスタグを設定:

# Macから実行
az iot hub device-twin update \
  --hub-name [IoT Hub名] \
  --device-id [デバイスID] \
  --set tags='{"environment":"dev"}'

タグ設定後、数分でPokePalモジュールが自動的にダウンロード・起動されます。

トラブルシューティング

Key Vault認証エラーと解決

voice-conversationモジュールでKey Vault証明書認証エラーが発生:

ERROR - Failed to create Key Vault client: [Errno 21] Is a directory: '/[証明書名].pem'

原因:初回デプロイ時にディレクトリとして作成されてしまった

解決方法

  1. RasPi(Device1)から証明書をコピー
# RasPiで証明書を確認
ssh [ユーザー名]@***.***.***.***
sudo ls -la /etc/iotedge/kvcerts/[証明書名].pem
# -rw-r--r-- 1 root root [size] [date] /etc/iotedge/kvcerts/[証明書名].pem

# 証明書をJetsonにコピー
sudo cp /etc/iotedge/kvcerts/[証明書名].pem /tmp/
exit

# Jetsonで受け取り
scp [ユーザー名]@***.***.***.***:/tmp/[証明書名].pem /tmp/
sudo mkdir -p /etc/iotedge/kvcerts
sudo cp /tmp/[証明書名].pem /etc/iotedge/kvcerts/
  1. コンテナを再作成
# 古いコンテナを削除
sudo docker stop voice-conversation
sudo docker rm voice-conversation

# モジュール再起動
sudo iotedge restart voice-conversation
  1. 動作確認
sudo iotedge list
# voice-conversation が running になっていることを確認

sudo iotedge logs voice-conversation --tail 20
# CertificateCredential.get_token succeeded が表示されれば成功

音声対話システムの動作確認

USB音声デバイスでの暫定動作

I2Sアンプ到着までの間、USBマイク・スピーカーで動作確認:

# USBマイク音量設定
amixer -c 3 cset numid=3 8

# 動作確認(応答時間6~9秒、未最適化)
# RasPi(Device1)は2.6~4.9秒

作業結果

  • ✅ Ubuntu 22.04初期設定完了
  • ✅ Azure IoT Edge Runtime 1.5.21インストール
  • ✅ IoT Hubデバイス登録・自動デプロイ設定
  • ✅ Key Vault認証問題解決(RasPiから証明書コピー)
  • ✅ voice-conversationモジュール正常起動確認

モジュール動作状況

モジュール ステータス 備考
edgeAgent ✅ Running 正常動作
edgeHub ✅ Running 正常動作
system-monitor ✅ Running 正常動作
voice-conversation ✅ Running Key Vault認証成功、音声デバイス未接続

学んだこと

  • JetPack 6.0にはDockerがプリインストール済み(追加インストール不要)
  • Azure DevOpsの自動デプロイメントはタグ設定で簡単に適用可能
  • 複数デバイス(RasPi + Jetson)の混合運用が可能
  • Key Vault証明書はデバイス間で共有可能(同じService Principal使用)
  • コンテナ再作成時は docker rm が必要(設定変更を反映させるため)

次回の作業予定

MAX98357A I2Sアンプ到着後のセットアップ

関連リンク

Discussion