うたカモ技術ブログ

Linux OpenWrt ネットワーク

【第 9 回】 OpenWrt開発入門   UART接続によるコンソールログイン方法の紹介

post:     update: 

今回はUART接続について紹介します。

OpenWrtデバイスを使用しているときに発生する最大の問題は、設定ミスによるネットワークの通信断です。

これは高確率で、ユーザーインタフェース(UI)をネットワーク通信のみで提供するOpenWrtデバイスの文鎮化(Brick)を招きます。

できれば、ネットワークトラブルによる文鎮化の発生を意識せずに、OpenWrtデバイスを自由に操作したいものです。

そんな要望に応えるのがシリアルコンバーター(USB to TTL)によるUART接続です。

ここでは本連載記事で使用したRaspberry Pi3Bをターゲットに、ホストPCとUART接続してみます。

これによって、Raspberry Pi3BのGPIOピンとホストPCに接続したシリアルコンバーターの通信路(※)を利用したOpenWrtコンソールのログインが実現できます。 (※Jumperケーブル(信号線)を使用した物理的な通信路です。)

それでは、行ってみます。

目次

実施環境と補足事項について

この記事は以下の環境で実施した結果を元に作成しています。

なお、この記事ではホスト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を間違えてシリアルコンバーターを燃やしています。

ショートしても破損するのはシリアルコンバーターだけかと思いますが、皆さんも気を付けて実施してください。

参考文献