Jetson-Nano互換機OKdo Nano C100の使い方(特にeMMC起動)

スポンサーリンク
OKdo Nano C100 Top

機械学習向け小型マイコンボードJetson-Nanoの互換機OKdo Nano C100の使い方を説明します。

Nano C100はハード・ソフトともJetson-Nanoと互換性があるとの商品説明になっていますが、最も大きな違いがeMMCを搭載していて、SDカードよりもストレージアクセスが高速という点になります。

Jetson-Nano
(SDカード起動)
Nano C100
SDカード起動
Nano C100
eMMC起動
キャッシュ使用読み込み1635 MB/s1638 MB/s1673 MB/s
キャッシュ不使用読み込み89 MB/s22 MB/s265 MB/s
書き込み26 MB/s10 MB/s56 MB/s
MNIST実行時間(Tensorflow)15 m 7 s15 m 42 s10 m 52 s

eMMC以外はほぼ同じ、といって間違いないと思います。

Jetson-NanoおよびNano C100の開発者ボードは、2階建て構造になっていて、2階部分がメインのボード、下のボードはUSBやHDMI、カメラ、GPIOといった拡張用のボードになっています。

Jetson-Nanoの2階部分のボードのみの構造かつ16GB eMMC搭載のJetson-Nano Computing Moduleというボードも発売されていて、Nano C100はこれと同一の構成になっています。

そのため、本記事はJetson-Nano Computing Moduleをお使いの方にも参考になるはずです。

eMMC起動に関して、ネット上に参考になる記事が見当たらず、立ち上げるまでに苦労したので、同じく悩んでいる方には参考になると思います。

本記事の内容は以下の動画でも説明していますので、ご覧ください。

Micro SDカード起動での動作確認

こちらのサイト(IoT本舗)からOKdo社提供のOSイメージファイル(Ubuntuベース)をダウンロードしてBalena Etcherなどのアプリを使ってMicro SDカードにOSイメージを書き込みます。

このOSイメージはJetPack 4.6.1がベースになっています。

イメージファイルc100.img.xzを書き込んだMicro SDカードをNano C100に差し込んで電源を入れるとUbuntuのセットアップ画面が立ち上がります。

セットアップ方法は、本家Jetson-Nanoと同じ方法でできるので、以下の記事に従い、Tensorflow、DeepStreamの実行確認まで実施できます。

eMMC起動 その1(CUIモード)

c100.img.xzを焼いたMicro SDカードを差して、GUIでのセットアップ完了後、Nano C100からMicro SDカードを抜いた状態、またはOSをインストールしていないMicro SDカードを差した状態で起動すると、eMMCモードで起動します。

やっかいなのが、eMMCモードはCUI操作になる(真っ黒な画面で文字だけ)こと、およびJetPackなど通常必要なものはおろか、ビルド環境やWi-Fiドライバもインストールされていません。

有線LANケーブルを差してもネットワークにつながりませんでした。

このような状態からのスタートとなるため、本章のCUIモードの内容はハードルが高めだと思います。

何はなくとも、まずはネットワークにつながらないと話にならないので、Wi-Fiドライバとビルドするための各種ライブラリをMicro SDカード起動で用意してeMMCにコピーしする方法で進めていきます。

Micro SDカード起動での準備

まず、OSをインストールした(c100.img.xzを焼いた)Micro SDカードを差し込んだ状態で起動します。

以下を実行して、Wi-Fi接続に必要となるライブラリのローカルリポジトリを作成します。

sudo apt update
sudo apt upgrade

git clone https://gist.github.com/jeanlescure/084dd6113931ea5a0fd9
cd 084dd6113931ea5a0fd9
chmod +x *.sh
sudo ./dependencies.sh
mkdir ~/archives
./getpkg.sh build-essential ~/archives
./getpkg.sh dkms ~/archives
./getpkg.sh git ~/archives
./getpkg.sh network-manager ~/archives
./mkrepo.sh ~/archives
gunzip ~/archives/Packages.gz

使用するWi-Fi子機は以下で、こちらの記事の中で紹介している2例目のものです。

TP-Link TP-WN725N 無線LAN 子機 11n/11g/b デュアルモード対応モデル 

ホームディレクトリに移動して、上記Wi-Fi子機のドライバをダウンロードします。

別のWi-Fi機器を使用する場合、それに合わせたドライバをダウンロードする必要がありますので、こちらの記事の「その他の機器はどうするの?」の章などを参考にドライバを探してください。

cd
git clone https://github.com/lwfinger/rtl8188eu.git

ローカルリポジトリ(archives)とWi-Fiドライバ(rtl8188eu)をeMMCにコピーして、書き込み権限を追加します。

sudo cp -r archives rtl8188eu /media/USERNAME/xxxx/home/nano
sudo chmod -R a+w /media/USERNAME/xxxx/home/nano/archives /media/USERNAME/xxxx/home/nano/rtl8188eu

eMMCのディスクは/media/USERNAME/xxxxにマウントされています。

USERNAMEの部分はユーザ名、xxxxの部分は数字の連続の名称になっていますので、lsコマンドなどで確認してください。

eMMC起動のセットアップ

Micro SDカード抜いて起動し、ユーザ名: nano、初期パスワード: nanoでログインします。

aptコマンドの参照先にローカルリポジトリを追加するため、以下のファイルを編集します。

sudo vi /etc/apt/sources.list

viエディタの使い方がわからない方は以下の動画を参考にしてください。

/etc/apt/sources.listの最後の行に以下を書き足します。

deb [trusted=yes] file:/home/nano/archives ./

これでaptコマンドがローカルリポジトリを認識できるようになるので、以下のコマンドで最低限ネットワーク接続に必要なライブラリをインストールします。

sudo apt update
sudo apt install build-essential dkms git network-manager

makeコマンドによるビルドを行う際、ファイルのタイムスタンプと現在時刻に矛盾があると正常にビルドできないので、以下のコマンドで時刻を手動で合わせます。(日付と時刻の部分は実行時の日時で置き換えてください)

sudo timedatectl set-ntp false
sudo timedatectl set-time "2023-06-02 09:06:00"

Wi-Fiドライバのディレクトリに移動して、ビルド、インストール、その後再起動します。

cd rtl8188eu
make
sudo make install
sudo reboot

以下のコマンドでWi-Fiの状態を確認します。

nmcli radio wifi

enabledと表示されればWi-Fiは有効な状態です。

有効でない場合、以下のコマンドで有効にします。

sudo nmcli radio wifi on

以下のコマンドでデバイスの一覧が表示され、ステータスを確認できます。

nmcli device status

以下のように表示され、Wi-Fiにはつながっていないことがわかります。

DEVICE  TYPE      STATE         CONNECTION
wlan0   wifi      disconnected  --
eth0    ethernet  unavailable   --
...

接続可能なWi-Fi SSIDをリストアップします。

nmcli device wifi list

お使いのSSIDが表示されていることを確認し、以下のコマンドでWi-Fiに接続します。

sudo nmcli --ask device wifi connect 'SSID' ifname wlan0

SSIDの部分は、お使いのSSID名で置き換えてください。

Wi-Fiパスワードを聞かれるので、入力するとWi-Fiにつながると思います。

インターネット接続を確認するため、以下のコマンドを実行します。

ping google.co.jp

“Unknown host”や”Request timed out”といったエラーが出ず、一定間隔でパケット情報が表示され、Ctrl+Cで終了した際に”0% packet lost”となっていれば、インターネットに接続できています。

nmcli device statusコマンド実行時にeth0も見えており、有線LANケーブルをつなげばネットワークにつながります。

eMMC起動の初期状態では有線LANをつないでもネットワークにつながらなかったので、ローカルリポジトリでnetwork-managerをインストールしたことで有線LANがつながる状態になったと思われます。

これでネットワークにつながったので、最初のアップデートを行います。

sudo apt update
sudo apt upgrade

あとは、「eMMC起動 その2(初期化)」の章に記載の方法でTensorflowまでを実施できるはずです。(DeepStreamの画面出力のあるデモなどはCUIモードのため試せません。)

ただし、私の場合、何度かMicro SDカード起動とeMMC起動を切り替えて使っているうちに、下の画面になり、ログインできない状態になってしまいました。

CUI Boot Error

後述のMicro SDカード起動を復活させるための試行を行っている間、Bootに関係するファイルを書き換えたりしている際にも、何度も上図の状態になり、起動不能に陥ったので、何らかBoot関連の問題が起きた際にこの状態になると思われます。

ただ、初めて上図の状態になった際は、Boot関連のファイル操作をしていた訳ではないので、なぜそうなってしまったか不明です。

この状態になったら、次章「eMMC起動 その2(初期化)」の方法でeMMC起動を可能にし、さらに次の章「Micro SDカード起動を復活させる」の方法を順次実行することでMicro SDからの起動も復活できました。

eMMC起動 その2(初期化)

eMMCを初期化するために、Ubuntu 18.04 LTSをインストールしたPCとNano C100をUSBケーブルでつないでデータを転送する必要があるので、Ubuntu PCの立ち上げ方から説明します。

Ubuntu 18.04 LTS PCの立ち上げ

使っていないWindows PCなどを用意します。(ここがまずハードルが高いですよね・・・)

こちらからUbuntu 18.04 LTSのISOイメージファイルをダウンロードします。

Ubuntu 18.04 LTS ISO Image

Balena EtcherなどでUSBメモリに上記でダウンロードしたISOイメージを焼きます。

用意したPCにUSBメモリを差し込み、電源を入れ、すぐにF2とF10を連打します。

F2とF10を連打するのはBIOSを起動するためで、メーカーによってキーが異なりますが、F2とF10を押しておけば大抵のPCはBIOSを起動できると思います。

BIOSが起動しない場合は、ネットで検索してBIOS起動の方法を確認してください。

BIOSが立ち上がったら、BOOTメニューを開き、USBメモリの起動優先順位を最上位にし、Save & Exitします。

これでUbuntuのインストーラが立ち上がるので、あとは画面の指示にしたがってインストールします。

起動したらログインして、以下のコマンドでアップデートします。

sudo apt update
sudo apt upgrade

sudoのパスワードタイムアウトを無効にしておきます。

sudo visudo

ファイルの末尾に以下の行を書き足して、保存終了します。

Defaults timestamp_timeout=-1

私の場合、sudoパスワードのタイムアウト無効化をせずに下記のNano C100への書き込みを行うと途中でエラーが出て止まってしまったため、この設定をしておくのが良いと思います。

Ubuntu PCとNano C100をUSB接続

Nano C100のeMMCを初期化するには、Micro SDカードを差し込む側にあるFCRECとGND端子をジャンパーピンなどでショートしておく必要があります。

RCREC Pin

私は下図のようにメス-メスのジャンパーケーブルを使用しました。

Jumper Cable

この状態でOKdo Nano C100のMicro USB端子とUbuntu PCのUSB端子をケーブルで接続します。

OKdo Nano C100のHDMI端子にディスプレイにつないでおきます。

Nano C100 connection

以降はUbuntu PCのターミナル上の操作です。

まず、以下のコマンドでUSBケーブルでつないだOKdo Nano C100を認識できていることを確認します。

lsusb

正しく認識できていれば、以下のような行があるはずです。

Bus 002 Devide 020: ID 0955:7020 NVidia Corp.

eMMCへの書き込み

ビルドに必要なライブラリをインストールします。

sudo apt install build-essential bison flex git
sudo apt install crossbuild-essential-arm64 qemu-user-static binfmt-support

Nano C100初期化用GitHubリポジトリをクローンし、できたディレクトリに移動します。

git clone --recurse-submodules https://github.com/LetsOKdo/c100-bootupd.git
cd c100-bootupd

以下の3ファイルをダウンロードします。

ダウンロードした3ファイルを今いるc100-bootupdディレクトリ直下に移動します。

mv ~/Downloads/*.tbz2 .

以下のコマンドを実行します。

./init-jetpack

次にLinux_for_Tegra/tools/samplefsディレクトリに移動して、nvubuntu-bionic-aarch64-packagesの中身を最小構成にリストで置き換えるため、nvubuntu-bionic-aarch64-packages.origというファイル名に変更します。

cd Linux_for_Tegra/tools/samplefs
mv nvubuntu-bionic-aarch64-packages nvubuntu-bionic-aarch64-packages.orig

元のnvubuntu-bionic-aarch64-packagesは、GUI環境を含むため、サイズが大きく、機械学習に必要なライブラリをインストールしようとすると16GBしかないeMMCがすぐに溢れてしまうため、このOKdo Nano C100をeMMC起動で使う場合は必須の作業になると思います。

次に最小構成のパッケージリスト入手するため、FireFoxブラウザを立ち上げ、こちらのページを表示し、Rawボタンをクリックします。

L4T minimal package list page

ファイルの中身のみが表示された画面上で右クリックし、Save Page As…をクリックします。

L4T minimal package list save as

Downloads以下にファイルを保存します。

L4T minimal package list save

保存したファイルを今いるc100-bootupdディレクトリ直下に移動し、nvubuntu-bionic-aarch64-packagesにコピーします。

mv ~/Downloads/nvubuntu-bionic-minimal-aarch64-packages .
cp nvubuntu-bionic-minimal-aarch64-packages nvubuntu-bionic-aarch64-packages

これでnvubuntu-bionic-aarch64-packagesが最小構成のパッケージリストになったのですが、ビルドやネットワーク接続に必要なライブラリすら入っていないので、追加していきます。

build-essentialgitnetwork-managerが元のGUI込みのパッケージリストに入っていたので、egrepコマンドで取り出して、最小構成のパッケージリストに書き足します。

egrep '^(build-essential|git|network-manager)=' nvubuntu-bionic-aarch64-packages.orig >> nvubuntu-bionic-aarch64-packages

これでパッケージリストの準備ができたので、eMMC用のファイルシステムを構築していきます。

sudo ./nv_build_samplefs.sh --abi aarch64 --distro ubuntu --version bionic | tee nv_build_samplefs.log
cd ../../rootfs
sudo rm -rf */
sudo tar xpf ../tools/samplefs/sample_fs.tbz2
cd ..
sudo ./apply_binaries.sh
cd tools
sudo ./l4t_create_default_user.sh -u user -p 1234 -n C100 -a --accept-license
cd ..

l4t_create_default_user.shの引数の意味は以下ですので、お好みで設定値を変更してください。

オプション意味
-u ユーザ名ユーザ名
-p パスワードパスワード
-n マシン名マシン名
-a自動ログイン
–accept-licenseライセンス承諾(必須と思われます)

Wi-Fiでネット接続する場合、ドライバが必要になります。

私はこちらの記事のTP-WN725Nを使用するので、ファイルシステムのユーザのホームディレクトリ以下にドライバのビルド環境(GitHubから入手)を展開します。

cd rootfs/home/user
git clone https://github.com/lwfinger/rtl8188eu.git
cd ../../..

rootfs/home/useruserの部分はl4t_create_default_user.sh実行時の-uオプションで指定した名称になりますので、適宜置き換えてください。

また展開すべきドライバはお使いのWi-Fi機器によって異なりますので、適切なものをお使いください。

これでeMMC書き込みの準備が整いましたので、次はいよいよ書き込みです。

以下のコマンドでNano C100のeMMCドライブに書き込みます。

sudo ./flash.sh jetson-nano-emmc mmcblk0p1

「〜 flashed successfully.」のように表示されれば書き込み成功です。

Nano C100をeMMCから起動

PCとのUSB接続を外し、Nano C100の電源を落としてからジャンパーピンを外し、再度電源を入れます。

上記で設定したユーザ名でログインした状態でターミナルが立ち上がります。

Wi-Fi接続

Wi-Fiドライバをビルドするためにmakeコマンドを使用しますが、時刻が合っていないとうまくビルドできないので、まず現在時刻を手動で設定します。

sudo timedatectl set-ntp false
sudo timedatectl set-time "2023-06-02 09:06:00"

Wi-Fiドライバをビルド、インストールし、再起動します。

cd rtl8188eu
make
sudo make install
sudo reboot

以下のコマンドでWi-Fiの状態を確認します。

nmcli radio wifi

enabledと表示されればWi-Fiは有効な状態です。

有効でない場合、以下のコマンドで有効にします。

sudo nmcli radio wifi on

以下のコマンドでデバイスの一覧が表示され、ステータスを確認できます。

nmcli device status

以下のように表示され、Wi-Fiにはつながっていないことがわかります。

DEVICE  TYPE      STATE         CONNECTION
wlan0   wifi      disconnected  --
eth0    ethernet  unavailable   --
...

接続可能なWi-Fi SSIDをリストアップします。

nmcli device wifi list

お使いのSSIDが表示されていることを確認し、以下のコマンドでWi-Fiに接続します。

sudo nmcli --ask device wifi connect 'SSID' ifname wlan0

SSIDの部分は、お使いのSSID名で置き換えてください。

Wi-Fiパスワードを聞かれるので、入力するとWi-Fiにつながると思います。

インターネット接続を確認するため、以下のコマンドを実行します。

ping google.co.jp

“Unknown host”や”Request timed out”といったエラーが出ず、一定間隔でパケット情報が表示され、Ctrl+Cで終了した際に”0% packet lost”となっていれば、インターネットに接続できています。

時刻設定

以下のコマンドで時刻設定の情報を表示します。

sudo timedatectl

以下のように表示されると思います。

                      Local time: Thu 2023-03-02 12:59:42 UTC
                  Universal time: Thu 2023-03-02 12:59:42 UTC
                        RTC time: Sat 2000-01-01 01:01:50
                       Time zone: n/a (UTC, +0000)
       System clock synchronized: no
systemd-timesyncd.service active: no
                 RTC in local TZ: no

ここで着目すべきは、System clock synchronizedがnoで自動調整がOFFになっていること、Time zoneがn/aでUTC、およびLocal timeの最後にもUTCとあり、Universal timeと同一になっていることです。

以下のコマンドで自動時刻調整をONにします。

sudo timedatectl set-ntp true

UTCはイギリスの時間帯なので、以下のコマンドで日本に合わせます。

sudo apt install tzdata
sudo timedatectl set-timezone Asia/Tokyo

sudo apt install tzdata実行時に地域と国名を尋ねられて、Asia/Tokyoを選択した場合は、sudo timedatectl set-timezone Asia/Tokyoの実行は不要です。

これで再度sudo timedatectlを実行すると以下のようになり、日本時間に合うはずです。

                      Local time: Sun 2023-06-18 09:13:57 JST
                  Universal time: Sun 2023-06-18 00:13:57 UTC
                        RTC time: Sat 2023-06-18 00:13:58
                       Time zone: Asia/Tokyo (JST, +0900)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no

初期設定

sudoのパスワードタイムアウトを無効化します。

sudo visudo

ファイルの末尾に以下の行を書き足します。

Defaults timestamp_timeout=-1

最初のアップデートを行います。

sudo apt update
sudo apt upgrade

冷却ファンの設定をします。

git clone https://github.com/Pyrestone/jetson-fan-ctl.git
cd jetson-fan-ctl/
sudo ./install.sh

上記を実行後、冷却ファンが回れば成功です。

Tensorflowの実行

nvidia-jetpackのインストールを行います。

sudo apt install nvidia-jetpack

以下のコマンドでTensorflowのインストールを行います。

sudo apt update

sudo apt -y install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

sudo python3 -m pip install --upgrade pip
sudo pip3 install -U pip testresources setuptools==49.6.0

sudo apt install python3-h5py
sudo pip3 install -U numpy==1.16.1 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.1 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11

sudo pip3 install --no-cache-dir --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v461 'tensorflow<2'

以下のコマンドで使用CPU数とクロック周波数を最大に設定します。

sudo jetson_clocks

CPU使用数を最大化するsudo nvpmodel -m 0は、うまく実行できませんでした。

続いてGitHubからMNISTの実行サンプルをダウンロードします。

git clone https://github.com/tak6uch1/cuda-tensorflow

mnist_cnn.pyを実行します。実行時間測定のためにtimeコマンドを使用しています。

cd cuda-tensorflow/work
time python3 mnist_cnn.py

以下のように結果が表示されれば成功です。

Test loss: 0.765024191570282
Test accuracy: 0.8433

real    10m52.775s
user    1m57.548s
sys     0m34.868s

Micro SDカード起動でのTensorflow MNIST実行は15分42秒だったので、上記は3割程度速いです。

eMMCの方がSDカードよりも高速という謳い文句は本当のようです。

DISKアクセス速度測定

DISKアクセス速度の測定を行い、eMMCとSDカードを比較します。

eMMCの結果を先に記載し、続いてMicro SDカード起動の場合を記載します。

まず、以下のコマンドでDISKの名前を確認します。

lsblk

MOUNTPOINTが/と表示されるのが、mmcblk0p1になっていると思います。

DISK読み込みスピード測定に使用するhdparmをインストールします。

sudo apt install hdparm

以下のコマンドで読み込みスピードを測定します。

sudo hdparm -tT /dev/mmcblk0p1

私の場合、以下のようにキャッシュ使用あり/なしのアクセススピードが表示されました。

/dev/mmcblk0p1:
 Timing cached reads:   3342 MB in. 2.00 seconds = 1673.27 MB/sec
 Timing buffered disk reads: 796 MB in. 3.0 seconds = 265.31 MB/sec

Micro SDカード起動の場合は以下だったので、buffered disk readsの方は10倍程度速いですね。

/dev/mmcblk0p1:
 Timing cached reads:   3274 MB in. 2.00 seconds = 1638.97 MB/sec
 Timing buffered disk reads:  70 MB in. 3.08 seconds =  22.70 MB/sec

続いて以下のコマンドで書き込みスピードを測定します。

sudo dd if=/dev/mmcblk0p1 of=test bs=1G count=1 oflag=direct

私の場合、以下のように表示されました。

1073741824 bytes (1.1 GB, 1.0 GiB) copied, 18.9407 s, 56.7 MB/s

Micro SDカード起動の場合は以下だったので、5倍くらい速いですね。

1073741824 bytes (1.1 GB, 1.0 GiB) copied, 99.9844 s, 10.7 MB/s

Micro SDカード起動を復活させる

前章の「eMMC起動 その2(初期化)」を実施後は、Micro SDカードを差し込んでもeMMCから起動してしまう状態になり、Micro SDカードからの起動および、c100.img.zxを書き込んだMicro SDカードでの初期化ができなくなってしまいます。

こちらにMicro SDカード起動できるようにする方法の記載がありましたが、うまくいきませんでした。

工場出荷状態から初回のc100.img.xzによる初期化後、eMMCからU-Bootに関係するファイルを吸い出してコピーする方法でうまくMicro SDカード起動を復活させることができたので、吸い出したデータをこちらのGitHubリポジトリに保存しました。

そのデータを利用して、eMMCからしか起動できなくなった状態から、Micro SDカードからも起動できるようにする方法を説明します。

まず、下図のようにデバッグ用のUSBシリアル接続とMicro USB端子からの2系統のUSB接続を行います。

Debug connection

使用したUSBシリアルモジュールはFTDI社のチップが載ったもので、特にドライバのインストールなどは不要で使用できました。

USB-TTLシリアル変換アダプターモジュール

USBシリアルモジュール上にあるジャンパーピンで3.3Vと5Vを選択できるようになっていて、Nano C100のインターフェイスが5Vのようだったので、5V側に設定しました。

Nano C100とUSBシリアルモジュールのGND同士をつなぎ、Nano C100のRXにはUSBシリアルモジュールのTX、Nano C100のTXにはUSBシリアルモジュールのRXをつなぎます。

Nano C100のRX/TXはMicro SDカードの差込口側にある端子を使用します。(UART RXD, UART TXDと記載のある端子です)

eMMC初期化の際に付けていたFCRECのジャンパーピンは外しておきます。

この状態で以下のコマンドを実行してUSB接続を確認します。

lsusb

正しくUSBシリアルモジュールが認識されていれば、表示された一覧の中に以下のような行があるはずです。(使用するUSBシリアルモジュールの機種によって表示は異なります)

Bus 001 Device 055: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

私の場合、USBシリアルモジュールは/dev/ttyUSB0としてUbuntu PCから見えていましたので、以下のコマンドでUART接続を確立しておきます。

sudo screen /dev/ttyUSB0 115200

UART通信可能なポートを調べるには、Arduino IDEが便利です。

Arduinoにプログラムを書き込むためのアプリなので、本来の用途とは異なりますが、Tools→PortからUART通信可能なポートを調べることができます。

Serach Available Serial Port with Arduino IDE

/dev/ttyUSB0はUSBシリアルモジュール経由の接続、/dev/ttyACM0はNano C100のMicro USB端子との接続でした。

screenコマンドは、UART通信で文字情報のやり取りをするためのターミナルアプリケーションです。

Nano C100の電源を入れる前にscreenコマンドでUART接続を確立しておくと良いです。

Nano C100の電源を入れてキー入力を求められている間にデバッグUARTからキー入力する必要があり、Nano C100の電源を入れてからscreenコマンドで接続していると間に合わない可能性があるためです。

Nano C100にはMicro SDカードを差し込んでおきます。

このとき、差し込むMicro SDカードは、以前セットアップしたMicro SDカード、またはc100.img.xzで作成した初期化用Micro SDカードをお使いください。

Micro SDカードを抜いた状態だとうまくいきませんでした。

Nano C100の電源を入れると「Hit any key to stop autoboot: 」と表示され、その右の数値が2→1→0と減っていきます。

このコメントが出ている間に何かのキーを押すと下図のようにU-Bootのプロンプトが出て入力待ち状態になります。

U-Boot Prompt

U-Bootのプロンプトが表示された状態で、以下のコマンドを打ち込みます。

ums 0 0

これで、Nano C100のMicro USB端子との接続側がUbuntu PCからUSB接続のドライブとして見えるようになります。

screenコマンドを立ち上げたターミナルは、U-Bootの操作に使用するため、別のターミナルウィンドウを立ち上げて以降のコマンドを実行します。

dfコマンドでドライブ名と容量を確認します。

df

14GB程度に見えるドライブがeMMCになります。私の場合、/dev/sdb1でした。

以下のコマンドを入力して、Nano C100のeMMCを/mntにマウントします。

sudo mount /dev/sdb1 /mnt

次にU-Bootに関係するファイルをダウンロードして、/mntにマウントしたNano C100のeMMCにコピーします。

git clone https://github.com/tak6uch1/NanoC100_SDboot.git
cd NanoC100_SDboot
./run_cp.sh

/mntのマウントを解除します。

sudo umount /mnt

ums 0 0を入力したU-BootのターミナルでCtrl+Cを押して、U-Bootのプロンプトに戻り、以下を入力します。

reset

これでNano C100が再起動し、自動的にシャットダウンします。

再度、Nano C100の電源を入れるとMicro SDカードから起動できるようになっているはずです。

screenコマンドを終了するには、Ctrl+Aを押した後に”\”(バックスラッシュ)を押し、終了するか聞かれるので”y”を押します。

トラブルシューティング

eMMCへの書き込み失敗

flash.shを実行しても途中で止まってしまって書き込みに失敗することがありました。

sudoパスワードのタイムアウト無効化を行うことで、正常に書き込みが終了するようになりました。

Wi-Fiにつながらない

初回のWi-Fiドライバビルド・インストール後にWi-Fi子機を認識しない状態になりましたが、一度抜き差しすることで認識しました。

また、update, upgrade後にWi-Fi子機を認識しなくなることはLinuxではよくあり、この場合、Wi-Fiドライバをビルドしたディレクトリに移動し、以下を実行します。

cd rtl8188eu
sudo make uninstall
make
sudo make install

上記の後、Wi-Fi子機を抜き差しすると認識しました。

まとめ

Jetson-Nanoの互換機OKdo Nano C100のセットアップからTensorflowの実行確認と実行速後の測定を、SDカード起動およびeMMC起動の両方で行いました。

また、本家Jetson-Nanoでも同じ方法で実行速度を測定して比較したのが下表になります。

Jetson-Nano
(SDカード起動)
Nano C100
SDカード起動
Nano C100
eMMC起動
キャッシュ使用読み込み1635 MB/s1638 MB/s1673 MB/s
キャッシュ不使用読み込み89 MB/s22 MB/s265 MB/s
書き込み26 MB/s10 MB/s56 MB/s
MNIST実行時間(Tensorflow)15 m 7 s15 m 42 s10 m 52 s

Nano C100の謳い文句であるeMMC搭載により、ストレージアクセスが高速というのは確かですね。

Tensorflowの実行時間が3割程度改善するので、処理速度で悩んでいた方には朗報だと思います。

頻繁にストレージにアクセスするようなアプリケーションでは、よりeMMCによる高速化が効いてくると思います。

少々意外だったのが、同じSDカード起動であってもNano C100は本家Jetson-Nanoより遅いということです。

これは、SDカードスロットが上の基盤(2階部分)にあるJetson-Nanoと、下の基盤(1階部分)にあるNano C100ではハードウェアの構造に違いがあり、アクセス速度の差になって現れていると思われます。

したがって、GUIを前提としてSDカード起動での使用をメインに考えている方は、本家Jetson-Nanoを使用すべきと言えます。

以上のことから、Nano C100は、本番運用で高速に動作させたいとうニーズに応える製品と言えます。

ただし、eMMC起動はCUIでの操作が必要になるのが、初心者泣かせです。

本家Jetson-Nano Computing Module(eMMC搭載)は、2階建て構造の2階部分単体の製品となっていますが、ハードウェア互換のNano C100は、1階部分のUSBやHDMI端子を含んだ製品になっているので、開発段階はMicro SDカード起動のGUIを使用し、実運用段階ではeMMC起動にするという使い方が可能です。

Jetson-Nano開発者キットとJetson-Nano Computing Module双方のいいとこ取りをした製品と言えます。

このような2段階運用をしたい方には最適な製品と言えるでしょう。

OKdo Nano C100購入例(Amazon/IoT本舗)

Jetson-Nano購入例(Amazon/IoT本舗)

ものづくりに興味があり、いろいろ触り始めたらLinuxの知識が必要になって困っているという方向けに以下のページを作成しましたので、よろしければ参考にしてください。

参考文献

タイトルとURLをコピーしました