はじめに
本記事では、Toradex社のVerdin iMX95 SOMとMallowキャリアボードを使用し、Torizon OS上でDockerコンテナを利用したGUIアプリケーションを開発する方法を紹介します。
Verdin iMX95 SOMは、NXP i.MX95プロセッサを搭載したシステムオンモジュール(SOM)です。Toradexが提供するソフトウェアサポートや長期供給体制を活用できるため、PoCや試作開発から量産製品まで同じプラットフォームを継続して利用できます。
また近年は、Cyber Resilience Act(CRA)に代表される法規制の動きもあり、産業機器において継続的な脆弱性対策やソフトウェアアップデートが求められるようになっています。このような背景から、OTAアップデートや長期的なソフトウェアメンテナンスを提供するTorizon OSが注目されています。
具体的な説明内容は以下の通りです。
- Verdin iMX95へのTorizon OSインストール
- LVDS接続10.1インチディスプレイの有効化
- Dockerコンテナ内でPythonとGTKを使用したGUIアプリケーションの実行
- コンテナ内からのアプリケーション編集
本記事は、Ubuntuで基本的なターミナル操作ができる方を対象としています。DockerやDevice Tree Overlayの知識がなくても進められるように説明しますが、コマンドは内容を確認したうえで実行してください。
注意事項
- 本記事では、Verdin iMX95 SOMとMallowキャリアボードを組み合わせて使用します。
- USBシリアル変換ケーブルは、ターゲットボードのUART電圧に対応した1.8 V対応品を使用してください。
- UART接続では、TX、RX、GNDを正しく接続してください。VCCピンは接続しません。
- 3.3 V専用のUSBシリアル変換ケーブルを接続すると、ターゲットボードを破損するおそれがあります。
- OSイメージ、Dockerイメージ、パッケージのダウンロードにはインターネット接続が必要です。
- 初期ログイン後は、必ず初期パスワードを変更してください。
システム構成
以降、Ubuntu 22.04が動作するPCをホストPC、Verdin iMX95 SOMとMallowキャリアボードを組み合わせた機器をターゲットボードと呼びます。
本記事ではディスプレイの表示機能を利用します。タッチパネル機能は扱いません。
ターゲットボード
- Verdin iMX95 SOM
- Mallowキャリアボード
- CapacitiveTouchDisplay - 10inch LVDS
- Torizon OS 7.7.0
- Ethernetケーブル
- データ通信に対応したUSBケーブル
- USBシリアル変換ケーブル(1.8 V対応)
- SDカード(本記事では32GBを利用)
ホストPC
- Ubuntu 22.04が動作するPC
- モニター、キーボード、マウス
- インターネット接続環境
Verdin iMX95 SOMとキャリアボード
Verdin iMX95 SOMは、CPU、メモリ、電源回路、高速インターフェースなどをモジュール化したSystem on Module(SOM)です。
SOMを利用することで、SoC周辺回路の設計負荷を抑えながら、キャリアボード設計やアプリケーション開発に注力できます。その結果、開発期間の短縮や設計リスクの低減が期待できます。
Torizon OSの概要
キャリアボードは、USB、Ethernet、ディスプレイ、カメラ、GPIOなどのインターフェースをSOMから引き出し、製品用途に合わせて利用するための基板です。SOMとキャリアボードを分離することで、用途に応じたI/O構成やコネクタ配置を設計しやすくなります。
Torizon OSは、Toradex社が提供する組み込み機器向けLinuxプラットフォームです。
Torizon OSのベースはYocto Projectを利用した組み込みLinuxです。アプリケーションはDockerコンテナとして開発・実行できるため、アプリケーションの依存関係をOS本体から分離しやすくなります。
本記事では、Dockerコンテナ内にPythonおよびGTKの実行環境を用意し、GUIアプリケーションを実行します。
コンテナを利用する主な利点は以下のとおりです。
- 開発環境をDockerfileやComposeファイルとして共有しやすい
- アプリケーションと依存パッケージをまとめて管理しやすい
- アプリケーションイメージを更新・切り替えしやすい
- チーム内で開発・実行環境をそろえやすい
- OS本体とアプリケーションの依存関係を分離しやすい
Torizon OS のインストール
OSイメージの書き込み
Toradex Easy Installer (以下、Tezi)を利用してVerdin iMX95 (以下、開発ボード)にTorizon OSをインストールします。
1. ホストPCに必要なツールをインストールする
ホストPCで以下のコマンドを実行します。
sudo apt update
sudo apt install tigervnc-viewer minicom
2. ターゲットボードに接続する
ホストPCとターゲットボードをUSBケーブルで接続します。
ターゲットボードがTeziを起動している状態で、ホストPCから次のコマンドを実行します。
vncviewer 192.168.11.1
初回接続時に証明書に関する確認画面が表示された場合は、内容を確認してから接続を続行してください。
Teziの画面が表示されます。
192.168.11.1 に接続できない場合は、USBケーブルがデータ通信に対応しているか、ホストPC側にUSBネットワークインターフェースが作成されているかを確認してください。
3. Teziのバージョンを確認する
Teziの画面下部に表示されるバージョンを確認します。
使用するTorizon OSイメージは、Teziのバージョンと対応している必要があります。
4. Torizon OSイメージをダウンロードする
Toradexダウンロードページから、Verdin iMX95用のTorizon OSイメージをダウンロードします。
イメージを選択する際は、少なくとも以下を確認してください。
- Verdin iMX95用のイメージであること
- 使用するTeziのバージョンに対応していること
- 本記事の検証環境ではTorizon OS 7.7.0を使用しています
- Teziのバージョンが古い場合は、ダウンロードページの「Torizon OS 7 older quarterly releases」から、対応するイメージを選択してください。
5. SDカードにOSイメージを展開する
SDカードをホストPCに接続し、マウント先を確認します。
以下の例では、SDカードが /media/$USER/SDCARD にマウントされているものとします。
tar -xvf torizon-docker-verdin-imx95-Tezi_7.7.0+build.40.tar -C /media/$USER/SDCARD
展開後、SDカードのルートディレクトリにイメージファイルが配置されていることを確認してください。
6. Torizon OSをインストールする
SDカードをターゲットボードに挿入します。
Teziの画面にOSイメージが表示されたら、対象のイメージを選択し、左上の Install をクリックします。
ライセンス条項が表示されたら内容を確認し、I Accept をクリックします。
OSイメージの書き込みが開始されます。
インストール完了画面が表示されたら、VNC Viewerを終了し、ターゲットボードの電源を切ります。
以上で、Verdin iMX95へのTorizon OSのインストールは完了です。
Torizon OSの初期設定
初回起動後に、シリアルコンソールを使用してログインします。
USBシリアル変換ケーブルを接続する
1.8 V対応のUSBシリアル変換ケーブルを用意します。
MallowキャリアボードのDebug UARTに、TX、RX、GNDを接続します。TXとRXはクロス接続してください。
接続するピンの位置およびピン番号は、Mallowキャリアボードのハードウェア資料を確認してください。
1. ホストPCでシリアルポートのアクセス権を設定する
ホストPCで以下のコマンドを実行します。
sudo usermod -aG dialout $USER
コマンド実行後は、一度ログアウトしてから再度ログインしてください。
2. シリアルデバイスを確認する
USBシリアル変換ケーブルを接続した状態で、ホストPC上のデバイスファイルを確認します。
ls /dev/ttyUSB0
/dev/ttyUSB0
環境によっては、/dev/ttyUSB1 や /dev/ttyACM0 と表示される場合があります。その場合は、表示されたデバイス名を以降のコマンドで使用してください。
3. minicomでシリアルコンソールに接続する
以下のコマンドを実行します。
minicom -D /dev/ttyUSB0 115200
minicomを起動したら、ターゲットボードの電源を入れます。
ログインプロンプトが表示されるまで待ちます。
4. 初回ログインする
ログインプロンプトが表示されたら、以下の初期認証情報でログインします。
- ユーザー名:torizon
- 初期パスワード:torizon
初回ログイン時にはパスワード変更が求められます。
現在のパスワードとして torizon を入力した後、新しいパスワードを設定してください。パスワード入力中は画面に文字が表示されませんが、正常な動作です。
ターゲットボードを終了する場合は、以下のコマンドを実行します。
sudo shutdown now
LVDSディスプレイの有効化
本記事では、Verdin iMX95のディスプレイとしてCapacitive Touch Display - 10 inch LVDSを使用します。
Yocto Projectを使用した一般的な組み込みLinux開発では、新しいハードウェアを有効化するためにDevice Treeの修正やOSイメージの再ビルドが必要になる場合があります。
Torizon OSでは、Device Tree Overlayを利用して、ディスプレイや周辺デバイスに関する設定を追加できます。
今回はToradex純正のディスプレイを使用するため、用意済みのDevice Tree Overlayを有効化します。
LCDパネルを接続する
LCDパネルに付属するケーブルを使用して、LCDパネルとMallowキャリアボードを接続します。
接続先のコネクタ位置、ケーブルの向き、固定方法は、Mallowキャリアボードおよびディスプレイのハードウェア資料を確認してください。
Mallow用のDeviceTreeが有効であることを確認する
以下の手順はターゲットボード上で実行します。
まず、現在有効なDevice Treeを確認します。
以下は実行例です。
sudo tdx-info -dt
Password:
Device tree
------------------------------------------------------------
Device tree enabled: imx95-verdin-wifi-dev.dtb
Compatible string: toradex,verdin-imx95-wifi-devtoradex,verdin-imx95-wifitoradex,verdin-imx95fsl,imx95
Device trees available:
imx95-verdin-nonwifi-dahlia.dtb
imx95-verdin-nonwifi-dev.dtb
imx95-verdin-nonwifi-ivy.dtb
imx95-verdin-nonwifi-mallow.dtb
imx95-verdin-nonwifi-yavia.dtb
imx95-verdin-nonwifi-zinnia.dtb
imx95-verdin-wifi-dahlia.dtb
imx95-verdin-wifi-dev.dtb
imx95-verdin-wifi-ivy.dtb
imx95-verdin-wifi-mallow.dtb
imx95-verdin-wifi-yavia.dtb
imx95-verdin-wifi-zinnia.dtb
------------------------------------------------------------
Device tree overlays
------------------------------------------------------------
Overlays enabled: fdt_overlays=verdin-imx95_dsi-to-hdmi_overlay.dtbo verdin-imx95_spidev_overlay.dtbo
Overlays available:
verdin-imx95_dsi-to-hdmi_overlay.dtbo
verdin-imx95_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo
verdin-imx95_mezzanine_panel-cap-touch-10inch-lvds_overlay.dtbo
verdin-imx95_mezzanine_panel-lvds-dual-channel-1080p_overlay.dtbo
verdin-imx95_nau8822-btl_overlay.dtbo
verdin-imx95_ov5640-27mhz_overlay.dtbo
verdin-imx95_ov5640_overlay.dtbo
verdin-imx95_panel-cap-touch-10inch-dsi_overlay.dtbo
**verdin-imx95_panel-cap-touch-10inch-lvds_overlay.dtbo**
verdin-imx95_panel-cap-touch-7inch-dsi_overlay.dtbo
verdin-imx95_reserve-cm7-uart_overlay.dtbo
verdin-imx95_spidev_overlay.dtbo
------------------------------------------------------------
出力中の Overlays available: に、以下のOverlayが表示されることを確認します。
verdin-imx95_panel-cap-touch-10inch-lvds_overlay.dtbo
必要に応じて、次のコマンドで対象のOverlayを検索できます。
sudo tdx-info -dt | grep panel-cap-touch-10inch-lvds
Device Tree Overlayを有効化する
現在使用されている overlays.txt の場所を確認します。
sudo find /sysroot/boot/ostree -path '*/dtb/overlays.txt'
表示されたパスを使用して、overlays.txt を編集します。
以下はパスの例です。
sudo nano /sysroot/boot/ostree/torizon-<deployment-id>/dtb/overlays.txt
fdt_overlays= の行を確認し、LVDSディスプレイ用Overlayを追加します。
- fdt_overlays=verdin-imx95_dsi-to-hdmi_overlay.dtbo verdin-imx95_spidev_overlay.dtbo
+ fdt_overlays=verdin-imx95_panel-cap-touch-10inch-lvds_overlay.dtbo verdin-imx95_spidev_overlay.dtbo
nano を使用する場合は、以下のキー操作で保存して終了します。
- Ctrl + O を押して保存する
- Enterキーを押してファイル名を確定する
- Ctrl + X を押して終了する
設定を保存したら、以下のコマンドで再起動します。
sync
sudo reboot
再起動時にToradexロゴがディスプレイに表示されれば、Overlayが有効になっています。
OS起動後に画面が黒くなる場合がありますが、この時点ではGUIアプリケーションを起動していないため正常です。
GUIアプリケーション開発環境の構築
ここからは、Dockerコンテナ内でPythonとGTKを使用するGUIアプリケーションを実行します。
1. ターゲットボードをネットワークに接続する
ターゲットボードのEthernetポートにネットワークケーブルを接続します。
USBシリアル変換ケーブルを使用してターゲットボードにログインします。
minicom -D /dev/ttyUSB0 -b 115200
2. ターゲットボードのIPアドレスを確認する
以下のコマンドを実行します。
ip addr
本記事の環境では、有線LANインターフェースとして ethernet0 が表示されました。
ip addr show ethernet0
出力例を以下に示します。
5: ethernet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
altname enP1p0s0f0
altname end0
inet 192.168.1.123/24 brd 192.168.1.255 scope global dynamic noprefixroute ethernet0
valid_lft 63523sec preferred_lft 63523sec
この例では、ターゲットボードのIPアドレスは 192.168.1.123 です。
以降のコマンドでは、表示されたIPv4アドレスに読み替えてください。
ネットワーク環境によっては、インターフェース名が ethernet0 ではない場合があります。その場合は、ip addr の出力から、UP 状態でIPv4アドレスが割り当てられている有線LANインターフェースを確認してください。
3. ターゲットボード上に作業ディレクトリを作成する
ターゲットボードで以下を実行します。
mkdir ~/docker/nexty-gui/app
cd docker/nexty-gui
以降の作業はホストPCで行います。
以下のファイルをホストPC上の任意のディレクトリに保存してください。
4. ホストPCからターゲットボードへファイルをコピーする
ホストPCのターミナルで、保存したファイルがあるディレクトリへ移動します。
次のコマンドを実行し、ファイルをターゲットボードへコピーします。
scp Dockerfile entrypoint.sh build.sh docker-compose.yml \
torizon@<ターゲットボードのIPアドレス>:/home/torizon/docker/nexty-gui
scp hello_button.py \
torizon@<ターゲットボードのIPアドレス>:/home/torizon/docker/nexty-gui/app
初回接続時には、SSHホスト鍵の確認メッセージが表示される場合があります。接続先が正しいことを確認したうえで続行してください。
パスワードの入力を求められた場合は、ターゲットボードで設定したパスワードを入力します。
5. コンテナイメージをビルドする
ターゲットボードに戻り、コピーしたスクリプトファイルに実行権限を付与します。
cd ~/docker/nexty-gui
chmod +x build.sh entrypoint.sh
次に、ビルドスクリプトを実行します。
./build.sh
ネットワークからコンテナイメージやパッケージがダウンロードされ、GUIアプリケーション用のコンテナイメージが作成されます。
6. GUIアプリケーションを起動する
以下のコマンドを実行します。
docker compose up
LCDにGUIアプリケーションのウィンドウが表示されれば成功です。
開発ボードにマウスをつないで、ボタンをクリックするとダイアログが表示されます。
コンテナを終了するには、ターミナルで Ctrl + C を押します。
docker-compose.yml では、コンテナ内のGUIアプリケーションがターゲットボードの表示機能にアクセスできるよう、Waylandソケットや関連デバイスをコンテナと共有する設定を行っています。
アプリケーションの編集
本格的なアプリケーション開発では、Visual Studio Code用のTorizon IDE Extensionを利用できます。
本記事では、コンテナ内でPythonファイルを直接編集し、変更を確認する簡易的な方法を紹介します。
1. 開発用コンテナを起動する
ターゲットボード上で以下を実行します。
cd ~/docker/nexty-gui
docker compose run --rm --name nexty-gui-dev \
-v "$PWD/app:/opt/nexty-gui" \
nexty-gui bash
コンテナが起動し、ターミナルがコンテナ内のシェルに接続されます。
2. アプリケーションファイルを確認する
コンテナ内で以下を実行します。
ls /opt/nexty-gui
出力例を以下に示します。
__pycache__ hello_button.py
ターゲットボード上の ~/docker/nexty-gui/app ディレクトリは、コンテナ内の /opt/nexty-gui にbind mountされています。
このため、コンテナ内で編集したファイルは、ターゲットボード上の ~/docker/nexty-gui/app にも反映されます。
3. アプリケーションを直接実行する
以下のコマンドを実行します。
python3 /opt/nexty-gui/hello_button.py
GUIアプリケーションのウィンドウが表示されます。
4. ボタンを追加する
以下のコマンドでPythonファイルを編集します。
nano /opt/nexty-gui/hello_button.py
HelloWindow クラスの初期化処理を、以下のように変更します。
class HelloWindow(Gtk.Window):
def __init__(self) -> None:
super().__init__(title="Nexty GUI")
self.set_default_size(360, 200)
self.set_border_width(32)
+ box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12)
+ self.add(box)
button = Gtk.Button(label="押してください")
button.set_hexpand(True)
button.set_vexpand(True)
button.connect("clicked", self.on_clicked)
- self.add(button)
+ box.pack_start(button, True, True, 0)
+ button2 = Gtk.Button(label="もう一つのボタン")
+ button2.set_hexpand(True)
+ button2.set_vexpand(True)
+ button2.connect("clicked", self.on_clicked)
+ box.pack_start(button2, True, True, 0)
self.connect("destroy", Gtk.main_quit)
5. 変更後のアプリケーションを実行する
以下のコマンドを実行します。
python3 /opt/nexty-gui/hello_button.py
2つのボタンが表示されれば、変更は成功です。
6. コンテナを終了する
が完了したら、以下のコマンドを実行します。
exit
または、Ctrl + D を押してコンテナを終了します。
コンテナ内で編集した hello_button.py は、ターゲットボード上の次のファイルにも反映されています。
~/docker/nexty-gui/app/hello_button.py
まとめ
本記事では、Verdin iMX95 SOMとMallowキャリアボードを使用して、Torizon OS上でGUIアプリケーションを開発する手順を紹介しました。
本記事で実施した内容は以下のとおりです。
- Verdin iMX95にTorizon OSをインストールした
- LVDSディスプレイ用のDevice Tree Overlayを有効化した
- Dockerコンテナ内でPythonとGTKを使用したGUIアプリケーションを実行した
- bind mountを利用して、コンテナ内からアプリケーションコードを編集した
- 変更したアプリケーションを再実行し、表示内容を確認した
Dockerコンテナを利用することで、アプリケーションの実行環境や依存関係を管理しやすくなります。Torizon OSを利用した組み込みLinux開発では、OS本体とアプリケーションを分離することで、開発・検証・運用の各工程を進めやすくなります。
ネクスティ エレクトロニクスでは、NXP社のi.MXシリーズを使用した製品開発や技術サポートを行っています。
お客さまの要望に合わせたさまざまな製品のご紹介ができますので、お気軽にお問い合わせください。
お問い合わせ
関連技術コラム
関連製品情報

MOTIX™ マイクロコントローラー モーター制御をスマートに。MOTIX™は駆動回路を統合した高集積マイコン
MOTIX™は高集積32ビットマイコンでモーター制御に特化し、車載や産業機器向けに高信頼性と制御精度を実現します。
- Infineon Technologies AG
- NEXT Mobility

ADA4356:設定可能なトランスインピーダンス、電流/ビット・レシーバーµModule
設定可能なTIAとLPF、14ビット125MSPS ADC内蔵の電流入力μModuleです。LVDS出力対応でToF用途に適し、評価ボードも用意されています。
- Analog Devices, Inc.
- ICT・インダストリアル

Lantronix - Qualcomm IoT Application Processors搭載 System on Module
Lantronixは、Qualcomm IoTプロセッサを搭載したSoMを提供し、AIや5Gを活用したエンドツーエンドソリューションを提供しています。
- LANTRONIX, INC.
- ICT・インダストリアル
- スマートファクトリー・ロボティクス

NXPの車載統合マイコンS12 MagniVの魅力を徹底解説
NXPの統合マイコンS12 MagniVは、ECUの小型化と短期開発を実現し、車載システムの電動化に貢献します。S12 MagniVの特長や利点を解説しています。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル

CodeMeterによるソフトウェア保護とライセンス付与
Wibu-SystemsのAxProtectorは、PythonやNvidia Jetsonなど多様なコードに対応し、ソフトウェア全体を強力に暗号化します。
- WIBU-SYSTEMS AG
- ICT・インダストリアル
- スマートファクトリー・ロボティクス
- ソフトウェア

エッジ処理による消費電力低減 第3世代MEMSセンサー
加速度+ジャイロのモノリシック集積センサ iNEMO™慣性モジュールのご紹介です。センサー内で一定のデータ処理が可能なほか、機能実装を容易に行えます。
- STMicroelectronics
- NEXT Mobility
- ICT・インダストリアル
- スマートファクトリー・ロボティクス







