PokePal 2台目構築:Jetson Orin NanoでGPU搭載AI対話デバイスを作る
はじめに
PokePalプロジェクトでは、1台目のRaspberry Pi 5で音声対話システム(v0.1.76)が試験稼働中です。今回は2台目としてJetson Orin Nanoを使用し、GPU活用による高性能版を構築します。これにより、複数デバイスの混合運用(RasPi+Jetson)の検証と、将来の管理画面開発を準備します。
作業内容
- Jetson Orin Nano Developer Kitの初期セットアップ
- JetPack 6.0 OSのインストール
- I2S音声入出力システムの構築(マイク+アンプ+スピーカー)
- Docker環境とAzure IoT Edge Runtime設定
- 既存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 Developer Kit 8GBとKKSBケース
購入先:
-
NVIDIA Jetson Orin Nano Developer Kit:67,500円
*2025年6月8日に67,500円で購入しましたが、9月6日時点では51,067円まで値下がりしてますね...値下がりしにくいものだと思っていましたが意外でした。 -
KKSB Jetson Orin Nano ケース:4,519円
2. 音声周辺機器の準備
はんだなどが必要だったので今回は準備のみ
マイクモジュール
INMP441 I2S MEMSマイクモジュール - 高品質デジタル音声入力用
購入先: INMP441 I2S MEMSマイクモジュール:679円
スピーカーとアンプ
Taoglasスピーカー(φ15mm)とPAM8302Aアンプ(アナログ用のため使用せず)
PAM8302AアンプはMAX98357Aアンプと間違えた😭
これだけamazonじゃなくて海外のサイトだったので、Taoglasスピーカーと一緒に買おうと思ったら間違ったものを買ってしまいました。。。
こちら↓が正しいようです。
TVETE製 MAX98357A I2Sアンプモジュール - デジタル音声出力用の正しい部品
購入先:
- Taoglas SPKM.15.8.A スピーカー:200円くらい
- MAX98357A I2Sアンプ(正しい部品):835円
カメラモジュール(将来用)
OV3660チップ搭載 視野角110° USBカメラモジュール - 将来の映像処理用
購入先: OV3660 USBカメラモジュール:2,076円
3. ストレージの準備
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カードイメージをダウンロードします。
NVIDIAのJetPack SDK 6.0ダウンロードページ
「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版のダウンロードリンクが壊れているためです。
解決策:公式サイトから直接ダウンロード
- 公式サイトにアクセス:https://www.balena.io/etcher/
- 「ETCHER FOR MACOS (ARM64)」を選択(M1/M2/M3 Mac用)
- ダウンロードしたdmgファイルを開く
- balenaEtcherをアプリケーションフォルダにドラッグ&ドロップ
なぜbalenaEtcher?
- 間違って内蔵ドライブを消す心配がない(自動的に除外)
- 書き込み後に自動検証してエラーをチェック
- 3ステップで簡単に完了
3. SDカードへの書き込み
重要:操作の順番
balenaEtcherは順番通りに操作する必要があります。「Select target」を先に押してもSDカードは選択できません。
正しい手順
balenaEtcherでJetPackイメージとSDカードを選択
-
Flash from file を最初にクリック
- ダウンロードしたJetPackイメージを選択
- ファイル名例:
jetson-orin-nano-devkit-sd-card.img
- サイズ:約7-8GB
-
Select target をクリック(Flash from file選択後にアクティブになる)
- SDカード(SanDisk Extreme PRO 128GB)を選択
- 容量が正しいことを確認(128GB前後と表示)
- 内蔵ドライブは表示されないので安全
-
Flash! をクリック
- 管理者パスワードを入力(要求された場合)
- 書き込み開始:約15-20分
- 自動検証も実行される
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'
原因:初回デプロイ時にディレクトリとして作成されてしまった
解決方法:
- 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/
- コンテナを再作成
# 古いコンテナを削除
sudo docker stop voice-conversation
sudo docker rm voice-conversation
# モジュール再起動
sudo iotedge restart voice-conversation
- 動作確認
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