Jetson TK1を持ち歩こう

Jetson TK1を持って旅にでよう。
旅先で開発するもよし, 友達に自慢するのもいい。

概要

持ち運びしたいので, 電源は12V出力できてJetson TK1に差し込めるモバイルバッテリを使用。
Jetsonに直接USBキーボードとHDMIディスプレイを繋げて立ったままJetson TK1を使うのはきつそうだ。
そこでJetson TK1本体はカバン等に入れておき, sshやVNC経由でAndroidタブレットかスマートフォンからJetson TK1を操作する。
タブレットとJetson TK1間をケーブルで繋ぎたくないので, Bluetoothで接続する。
もしWifiが利用可能であればJetson TK1をWifiに接続し, タブレットはJetson TK1経由でインターネットに接続できるようにする。
Jetson TK1本体にはBluetoothも無線LAN機能も無いので, USB BluetoothアダプタとUSB無線LANアダプタを利用した。
現在最新のLinux For Tegra R21.4とThe Grinch Kernel 21.3.4を使用。

BluetoothでJetson TK1にリモートアクセス

BluetoothのPAN(Personal Area Network) Profileを利用してタブレット等からJetson TK1へ接続。

Bluetooth接続のメリット

デメリット

Bluetoothアダプタのセットアップ

BluetoothアダプタにはLogitec LBT-UAN04C1BKを使った。
The Grinch kernelを使っているので, ドライバをインストールしなくても認識されていた。
しかしscanしてもBluetooth機器を発見できなかった。
そこで調べた所, こちらに書いてあることを参考に
$ bccmd psset -r -s implementation 0x028c 0x0001
を実行するとscanが動作した。
その後は再起動した後でもこのコマンドを実行せずに動作した。

Bluetooth PANの準備

この機能を使うにはKernelのCONFIG_BRIDGEとCONFIG_BT_BNEPが有効になっている必要がある。以下のコマンドで確認できる。
zcat /proc/config.gz | grep BRIDGE
zcat /proc/config.gz | grep BT_BNEP
L4T21.4のカーネルではデフォルトで有効になっていないがGrinch kernelだと有効になっている。
sudoしなくてもbluetoothの機能にアクセスできるようにする。
$ sudo gpasswd -a ubuntu bluetooth
簡単にJetson TK1とタブレットを接続できるようにするためにbluemanを使う。
$ sudo apt-get install blueman
bluemanを使うためにデスクトップ画面を出す。(もしデスクトップが起動していなかったら起動する)
画面右上にbluetoothのマークがあるのを確認する。
もしなければ, コンソールから
blueman-appletを実行する。
bluetoothのマークを右クリック→Local Servicesをクリックする。
左側のNetworkをクリックし, Network Access Point(NAP)のチェックボックをonにする。
NAP SettingsのIP Address:の横に書いてあるのがbluetoothからJetson TK1に接続したときのJetson TK1のIPアドレスになる。
Applyをクリックして画面を閉じる。
次はタブレットとJetson TK1をペアリングする。
今度はデスクトップ右上のbluetoothのアイコンをクリックする。
Adapter→PreferencesをクリックしTemporarily visibleを選ぶ。
タブレットでbluetoothデバイスを検索する。
tegra-ubuntu-0のような名前のデバイスが見つかるのでペアリングする。
タブレットでtegra-ubuntu-0経由のインターネットアクセスを有効にする。
もしJetson TK1がインターネットに繋がっていればタブレットもJetson TK1経由でインターネットに繋げられる。

これでデスクトップが立ち上がっていればbluemanが動きbluetoothで接続できるようになった。
しかしJetson TK1にはディスプレイを繋がずに使用するので, その状態でもデスクトップが起動する必要がある。
そこでTurboVNCをインストールして起動時に自動的にTurboVNCサーバーが立ち上がるようにした。
TurboVNCのインストール方法はこちらを参照。

USB無線LANアダプタのセットアップ

USB無線LANにはPLANEX 無線LAN子機 (USB3.0アダプター型) 高速モデル GW-900D-BKを使った。
これにはRTL8812AUというチップが使われていてこのサイトからドライバのソースコードを入手できる。
このソースコードはこちらにあるドライバのソースコードをJetson TK1用にビルドできるよう修正されたものだ。
しかしelinux.orgから配布されているソースコードはgithubにある最新のソースコードが取り入れられていないせいか, そのままビルドしてできたドライバーはエラーがでて使い物にならなかった。
そこでgithubにある最新のソースコードをcloneして, elinux.orgのソースコードの変更箇所をマージしてビルドすると安定して動作した。
ビルドにはkernelのソースコードが必要だった。
ここから自分が使っているThe Grinch 21.3.4 for Jetson TK1のソースコードを入手し, そこに書いてある通りに/usr/src下に解凍した。
後はこちらに書いてある通りにドライバをインストールすればOK。
ちなみにsudo insmod 8812au.koする前にsudo modprobe cfg80211しないとエラーがでる。
ドライバがインストールされUSB無線LANアダプタが接続されていれば以下のコマンドで確認できる。
$ sudo nmcli -f general dev list

無線LAN APに接続

コマンドライン版NetworkManagerでJetson TK1を無線LANアクセスポイントに接続する。
周囲のアクセスポイント一覧を表示。
$ sudo nmcli dev wifi
アクセスポイントに接続。
$ sudo nmcli dev wifi connect  password 
このコマンドで接続できるとSSIDとパスワードが保存される。
以後は以下のコマンドで同じAPに接続できる。
$ sudo nmcli con up id 
以下のコマンドで保存されたSSID一覧が表示される。
$ sudo nmcli con
現在の接続状態を確認。
$ sudo nmcli dev status
$ sudo nmcli con status
一度接続すると次からはアクセスポイントにいると再起動後も自動的に接続するようである。
切断したい場合は
$ sudo nmcli dev disconnect iface wlan0

その他

最初はbluemanを使わずにCUIだけでPANを設定しようとしたがうまくいかなかった。
https://github.com/Douglas6/pinaple
https://github.com/ykasidit/ecodroidlink
にあるpythonスクリプトを使うとPANを構築できたがタブレットからJetson TK1経由でインターネットに接続することはできなかった。
dnsmasqやip-tables, brctlをうまく設定してJetson TK1をルータのようにすれば可能かもしれない。
bluemanは自動的にdnsmasqやip-tablesを呼び出してbluetoothで接続した端末がインターネットにアクセスできるようにしてくれるようだ。

Top