【第 9 回】 OpenWrt開発入門 UART接続によるコンソールログイン方法の紹介
今回はUART接続について紹介します。
OpenWrtデバイスを使用しているときに発生する最大の問題は、設定ミスによるネットワークの通信断です。
これは高確率で、ユーザーインタフェース(UI)をネットワーク通信のみで提供するOpenWrtデバイスの文鎮化(Brick)を招きます。
できれば、ネットワークトラブルによる文鎮化の発生を意識せずに、OpenWrtデバイスを自由に操作したいものです。
そんな要望に応えるのがシリアルコンバーター(USB to TTL)によるUART接続です。
ここでは本連載記事で使用したRaspberry Pi3Bをターゲットに、ホストPCとUART接続してみます。
これによって、Raspberry Pi3BのGPIOピンとホストPCに接続したシリアルコンバーターの通信路(※)を利用したOpenWrtコンソールのログインが実現できます。 (※Jumperケーブル(信号線)を使用した物理的な通信路です。)
それでは、行ってみます。
目次
- 実施環境と補足事項について
- 手順1:必要な物(シリアルコンバーター)を用意する
- 手順2:UART接続設定の有効化
- 手順3:OpenWrtデバイスとシリアルコンバーターの物理接続
- 手順4:UART接続によるコンソールログイン
- おまけ:この記事に実装したシリアル通信機能でUART接続(Google chrome・Edge限定)
実施環境と補足事項について
この記事は以下の環境で実施した結果を元に作成しています。
なお、この記事ではホストPCのOSをWindowsとLinux(Ubuntu)のそれぞれにし、OpenWrtデバイス(Raspberry Pi3B)とのUART通信を確認しています。 各OSのUART通信方法は本記事の手順4で紹介しています。
- #ホストPC環境
- Windows 11 Home / ubuntu 22.04 LTS 64bit
- シリアル通信機材
- シリアルコンバーター(USB to TTL [CH340])
- Jumperケーブル(メスメス)
- #OpenWrtデバイス
- 名称:Raspberry Pi3 Model B
- CPU:ARM Cortex-A53 (1.2GHz)
- SOC:Broadcom BCM2837
- RAM:1GB
- ストレージ(media):MicroSDカード
- #OpenWrt
- OpenWrt 22.03
補足:機種によるUART接続可否について
ここで取り上げるUART接続は全てのOpenWrtデバイスが対応しているわけではありません。 基板(ボード)上にUART接続用のピンが存在しない、または、OSレベルでUART接続が禁止されているなどの理由で、UARTによるシリアル通信ができない場合があります。
ただし、基板にピンは無いけど取り付けができる場合、ユーザー自身でピンをはんだ付けすればUART接続が出来る場合もあります。
いずれにせよ、UART接続できるかは各ファームウェア・ハードウェアのサポートによります。
その点、Raspberry Piはピンヘッダーが最初から取りけられており、専用のOpenWrtはUART接続を容易に有効化することができます。 簡単にUART接続をする環境が整っていると言えます。
手順1:必要な物(シリアルコンバーター)を用意する
必要な物はシリアルコンバーター(USB to TTL [CH340])とJumperケーブル(メスメス)です。
今回、私は以下のシリアルコンバーターとJumperケーブルのセットを購入してUART接続をしてみました。
このシリアルコンバーターを使用して次に紹介する手順2~4により、OpenWrtデバイスのRaspbery Pi3BとホストPCをUART接続します。
※もちろん、ここで私が紹介した物とは異なる、他メーカーのシリアルコンバーターでも同じ手順で接続することができます。 ただし、そのときはシリアルコンバーター側のピン配置がここで紹介したものとは若干違う場合が考えられますので、適宜、ピン配置の違いを確認してください。
手順2:UART接続設定の有効化
最初にOpenWrt側でUART接続を有効化する必要があります。
UART接続を有効化するために、一度SSH接続でOpenWrtコンソールにログインしましょう。
OpenWrtをインストールした直後のRaspberry Piは192.168.1.1のIPアドレスでSSH接続ができますので、 次のコマンドでコンソールにログインします。(既に読者の方がIPアドレスを変更していた場合は、変更後のIPアドレスで次のコマンドを実行してください。)
kamo@kamo:~$ ssh 192.168.1.1 -l root
ログインできたら、/boot/config.txtを開き、UART接続の有効化を示すenable_uart=1を 追記して保存します。
root@OpenWrt:~# cat /boot/config.txt ################################################################################ # Bootloader configuration - config.txt ################################################################################ ################################################################################ # For overclocking and various other settings, see: # https://www.raspberrypi.org/documentation/configuration/config-txt/README.md ################################################################################ # OpenWrt config include distroconfig.txt [all] # Place your custom settings here. enable_uart=1 # UART接続を有効にします
これでOS(OpenWrt)側のUART接続の準備は整いました。
手順2を実施後は、OpenWrtデバイス(Raspberry Pi3B)の電源は抜いておきましょう。
手順3:OpenWrtデバイスとシリアルコンバーターの物理接続
次は機器接続をします。
ホストPCのUSBポートにシリアルコンバーターを挿し込み、シリアルコンバーターとRaspberry Pi3Bの GPIOピンをJumperケーブルで繋ぎます。
シリアルコンバーターとRaspberry Pi3BのGPIOピンには、UART接続をするためのピンとそうでないピンがあります。 適切に接続をすることで以降の手順で紹介するUART接続によるコンソールログインが可能です。
接続の対応関係に気を付けながらやっていきましょう。
今回取り上げるRaspberry Pi3BのGPIO Pinoutは以下の図の右側のものです。
そして、UART接続に必要なピンは上図の青丸部分のピンになります。まとめると以下のピンです。
ピン番号 | ピン名 |
---|---|
6 | GND |
8 | UART TX(GPIO14) |
10 | UART RX(GPIO15) |
これらのピンに対して、対応するシリアルコンバーター側のピン(GND、TXD、RXD)をJumperケーブルで繋ぐことでUART接続を実現します。 つまり、対応関係は次の表になります。
Raspberry PI3B GPIOピン | 対応するシリアルコンバーターのピン |
---|---|
GND | GND |
UART TX(GPIO14) | RXD |
UART RX(GPIO15) | TXD |
ということで、上記の表通りに機器接続をすると、次の図のようになるはずです。
これで機器接続に関する手順は完了です。
次の手順でシリアル通信用ソフトウェアを利用してOpenWrtコンソールにログインできます。
手順4:UART接続によるコンソールログイン
シリアル通信用のソフトウェアをインストールし、OpenWrtとのUART通信によってコンソールにログインする方法を紹介します。
ホストPCのOSがWindowsまたはUbuntuのときの手順をそれぞれ紹介します。
[Windows] tera termでUART接続
手順4-1:シリアルコンバーターの接続を確認する
シリアルコンバーターをホストPCに接続したら、デバイスとしてWindowsに認識されているか確認しましょう。
デバイスマネージャーを開いて「ポート(COMとLPT)覧をプルダウンしたときに、シリアルコンバーターの項目があり、仮想COM番号が割り当てられていればOKです。 今回、私の環境ではCOM3がシリアルコンバーターになります。ここに表示された仮想COM番号は手順4-2で使用しますので覚えておいて下さい。
もし、ここでシリアルコンバーターが認識されていない場合、デバイスドライバーがインストールされていない可能性があります。 今回のシリアルコンバーターはCH340を使用していますので、Microsoftやその他のWebサイトからデバイスドライバ―をダウンロード&インストールする必要があります。
手順4-2:TeraTermのインストールと起動
今回使用するTera termを窓の杜(https://forest.watch.impress.co.jp)からダウンロードします。
そして、Tera termをインストール後に起動し、メニューバー「設定(S)」のプルダウンにある「シリアルポート(E)」を選択してください。
「シリアルポート設定と接続」ダイアログを以下の内容に設定し、「新規オープン(N)」をクリックします。 (仮想COM番号は手順4-1で確認したときのものを指定してください。)
baudrateについて
この記事で紹介するRaspberry Pi3Bのbaudrateは115200[bps]です。
baudrateの値はデバイスによって異なります。baudrateの値が不明な場合はデバイス仕様を確認するか、 片っ端から様々なbaudrate設定を試して正しく文字列が受信できるま頑張るという策で解決する必要があります。
ちなみに、baudrateはデジタル信号の変復調を意味します。送信側と受信側は同じbaudrate値でないとデータを正しく 受け取ることができません。
これで、UART接続の準備がすべて終わりました。
手順4-3:OpenWrtデバイス(Raspberry Pi3B)を起動してUART接続をする
最後に、Raspberry Pi3Bの電源を入れましょう。
接続不良がなければ、正常にUART通信が行われ、次のOpenWrtコンソールにログインできます。
電源投入直後であれば、OpenWrtのシステムブート時のカーネルログも見ることができ、SSH接続でコンソールを見るよりも詳細な情報を得られます。 ※またこの時に、OpenWrtデバイスによってはブートローダー(Uboot)にアクセスできるタイミングがあったりします。
[Linux] minicomでUART接続
手順4-1:[バグ対応] シリアルコンバーター(CH340)と競合状態のソフトウェアをアンインストールする
今回使用したシリアルコンバーター(CH340)は、視覚障碍者用の点字ディスプレイ制御ソフトウェアのBrlttyと競合します。
(これはUbuntu22.04 LTSに存在するバグらしいです。最新バージョンでも発生する可能性があります。ちなみに本件の詳細はこちら)
そのため、事前準備としてシリアルコンバーターを認識させるために以下のコマンドでBrlttyをアンインストールしましょう。 もちろん、このソフトウェアが必要ないことが前提ですが...
kamo@kamo:~$ sudo apt remove brltty
手順4-2:シリアルコンバーターの接続確認とttyUSB0設定
ホストPCに接続したシリアルコンバーターがデバイスとして認識されているか確認しましょう。
コンソール上でlsusbコマンドを実行してシリアルコンバーターが表示されていればOKです。
kamo@kamo:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 8087:0a2b Intel Corp. Bluetooth wireless interface Bus 001 Device 003: ID 13d3:5a11 IMC Networks USB2.0 VGA UVC WebCam Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics CH340 serial converter <--- USBポートに接続したシリアルコンバーター Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
確認できたら、シリアルコンバーターをシリアルコンソールデバイス/dev/ttyUSB0として紐づける設定を実施します。
まず、/etc/udev/rule.d直下に99-usb-to-ttl.rulesファイルを作成します。
kamo@kamo:~$ touch /etc/udev/rule.d/99-usb-to-ttl.rules
そして、99-usb-to-ttl.rulesファイルを以下のようにします。 これはlsusbコマンドで表示したシリアルコンバータのベンダーIDとプロダクトIDを/dev/ttyUSB0というデバイスファイルに紐づける設定です。
#/etc/udev/rule.d/99-usb-to-ttl.rules
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB0"
上記の内容で99-usb-to-ttl.rulesファイルを保存したら、次のコマンドで/etc/udev/rule.d直下の 設定ファイルをシステムにリロードさせましょう。
kamo@kamo:~$ sudo udevadm control --reload-rules
正常に設定が適用されていれば、/dev/ttyUSB0というファイルがシリアルコンバーターが接続されていることで作成されているはずです。 (作成されていなかったら、一度、シリアルコンバーターを抜き差ししてください)
kamo@kamo:~$ ls /dev/ttyUSB* ttyUSB0
これで後はシリアル通信用ソフトウェア(minicom)でOpenWrtデバイス(Raspberry Pi3B)にコンソールログインできます。
手順4-3:minicomのインストール
次のコマンドでminicomをインストールします。
kamo@kamo:~$ sudo apt-get install minicom
手順4-3:minicomによるUART通信の開始
次のコマンドで、baudrateを115200、通信先デバイスとして/dev/ttyUSB0を指定してminicomを起動します。
kamo@kamo:~sudo minicom -b 115200 -o -D /dev/ttyUSB0
baudrateについて
この記事で紹介するRaspberry Pi3Bのbaudrateは115200[bps]です。
baudrateの値はデバイスによって異なります。baudrateの値が不明な場合はデバイス仕様を確認するか、 片っ端から様々なbaudrate設定を試して正しく文字列が受信できるま頑張るという策で解決する必要があります。
ちなみに、baudrateはデジタル信号の変復調を意味します。送信側と受信側は同じbaudrate値でないとデータを正しく 受け取ることができません。
手順4-4:OpenWrtデバイス(Raspberry Pi3B)を起動してUART接続をする
OpenWrtデバイス(ここではRaspberry Pi3B)の電源を入れ、Linuxのminicom用コンソール画面を見ると次のようにOpenWrtコンソールが表示されることが確認できます。
電源投入直後であれば、OpenWrtのシステムブート時のカーネルログも見ることができ、SSH接続でコンソールを見るよりも詳細な情報を得られます。 ※またこの時に、OpenWrtデバイスによってはブートローダー(Uboot)にアクセスできるタイミングがあったりします。
おまけ:この記事に実装したシリアル通信機能でUART接続(Google chrome・Edge限定)
作成中のため、バグありです。
この記事のhtmlファイルに埋め込んだWeb Serial API(JavaScript)によるシリアル通信処理を利用して、UART通信ができます。
以下に適切なボーレート(デフォルト:Raspberry Pi3Bの値である115200)とCOM番号を選択するとシリアル通信が開始されます。
baudrate:おわり
今回は、Raspberry Pi3Bをターゲットに、シリアルコンバーターによるUART接続方法について紹介しました。
ここで紹介した接続方法は、他のデバイスにも通用する方法ですので、都度参考にしてみてください。
ただし、今回のピン接続に加えて3.3v電源などの接続が必要になってくるかもしれません。それらの情報はそのデバイス のサポート情報を参照して下さい。
どうでもいいですが、私はよくGNDとPowerを間違えてシリアルコンバーターを燃やしています。
ショートしても破損するのはシリアルコンバーターだけかと思いますが、皆さんも気を付けて実施してください。
- 第1回 OpenWrt開発入門 イントロダクション
- 第2回 OpenWrt開発入門 ファームウェアイメージの作成とインストール
- 第3回 OpenWrt開発入門 UCIコマンドによるネットワーク・Wi-Fi設定
- 第4回 OpenWrt開発入門 LuCI(WebUI)によるネットワーク・Wi-Fi設定
- 第5回 OpenWrt開発入門 作ってみようパケットキャプチャソフト
- 第6回 OpenWrt開発入門 自作アプリのパッケージ作成とインストール
- 第7回 OpenWrt開発入門 パッケージマネージャーソフト(opkg)の使い方とリポジトリ設定
- 第8回 OpenWrt開発入門 Coffee Break
- 第9回 OpenWrt開発入門 UART接続によるコンソールログイン方法の紹介
参考文献
- /dev/ttyUSB0 not present in Ubuntu 22.04 https://askubuntu.com/questions/1403705/dev-ttyusb0-not-present-in-ubuntu-22-04
- Web Serial API Living document https://wicg.github.io/serial/#serial-interface