🍓

Raspberry Pi と USB シリアル変換アダプタでシリアル通信 2024年版 - Linux 使いになりたい人向け

2024/02/06に公開

はじめに

この記事は Raspberry Pi と USB シリアル変換アダプタでシリアル通信をする方法について説明しています。Linux 使いになりたい人向けの内容で書いてあり、対象者は次の人です。

  • USB シリアル変換アダプタでシリアル通信をする方法に興味がある
  • Raspberry Pi を持っていて使ったことがある
  • Raspberry Pi OS や Raspbian をインストールして使ったことがある
  • Linux が使えるようになりたい

Raspberry Pi OS や Raspbian のインストール方法については説明していません。シリアル通信のために必要なものや設定について説明しています。

筆者は Linux 使いで、基本的に Linux 環境で動作確認をしています。ここで紹介しているようなちょっとしたことを少しずつ知ることを毎日続けることで Linux の機能を少しずつ理解することができるようになりました。Linux が使えるようになりたいと思っている人向けに、記事を公開しています。

環境について

ここでは「シリアル通信用パソコン(Raspberry Pi 4B)の USB コネクタ - USB シリアル変換アダプター - シリアル通信先用のデバイス(Raspberry Pi WH)」という接続環境を用意します。

/images/20240204_rpi_serial/rpi_serial_uart.png
接続環境

シリアル通信用パソコン

シリアル通信用パソコンとしては、Raspberry Pi 4B を使います。

/images/20240204_rpi_serial/pi4b.png
Raspberry Pi 4B

USB コネクタへ USB シリアル変換アダプタを接続して、それを経由してシリアル通信先用のデバイスと通信します。なお、Raspberry Pi 4B 以外のラズパイでも良いですし、Linux マシンや macOS マシンで screen コマンドが使えるマシンでも大丈夫です。

Windows マシンだと、VirtualBox + 拡張パッケージ で動作する Ubuntu で USB パススルーを使えば、ここで説明している screen コマンドを使って通信できるはずです。ただ、これについて説明すると長くなるので、ここでは紹介しません。そこそこハードルが高いはずです。

screen コマンドでなくても良いのなら、TeraTerm などのシリアル通信ができるターミナルアプリで通信できます。接続方法は同じで、「USB コネクタ - USB シリアル変換アダプタ - シリアル通信先用のデバイス」と接続します。

使用する USB シリアル変換アダプタ

使用する USB シリアル変換アダプタについては、手元にあった FTDI USBシリアル変換アダプターを使います。

/images/20240204_rpi_serial/serial_usb_adapter.png
FTDI USBシリアル変換アダプター

ラズパイの GPIO は 3.3V なので、ジャンパーは 3.3V へ設定しています。少し値段が安い下記でも大丈夫なはずです。

シリアル通信先のデバイス

シリアル通信先のデバイスとしては、Raspberry Pi Zero WH を使います。

/images/20240204_rpi_serial/pizero_w_uart_pin.png
Raspberry Pi Zero WH

Raspberry Pi Zero WH の GND、GPIO14、GPIO15 へ USB シリアル変換アダプタからケーブル線を接続します。他の Raspberry Pi シリーズでも良いです。

ラズパイを使う理由

もともとは、BUFFALO の無線 LAN 機能つきブロードバンドルーターとシリアル通信をしようと思って、Raspberry Pi 4B を取り出してきて、シリアル通信の方法を確認していました。動作確認するには、確実に動作するものを使っておくと、実際にブロードバンドルーターへ接続したときにトラブルとなっても問題の切り分けがしやすくなるので、Raspberry Pi Zero WH を使うことにしました。

ブロードバンドルーター以外にも、シリアル通信ができる組み込みデバイスというのが世の中にはそれなりにあるので、そういったハードウェアに興味のある人はシリアル通信ができる環境を用意していることが多いと思います。

なお、自分が普段使っているパソコンでも USB シリアル変換アダプタを使ったシリアル通信はできるのですが、基本的には Raspberry Pi を使うようにしています。

ケーブルを接続するときに何かミスをして普段使っているパソコンが故障したら嫌ですし、作業をしているときに何か問題が起きて、パソコンの環境に影響があったりするのも嫌だと思っています。

その点、Raspberry Pi なら、故障しても数千円で済みますし、OS を入れ替えれば良い程度の環境破壊なら、大したことがありません。接続したいデバイスが組み込み系 Linux を採用している場合も多いというのもあります。ということで、自分はシリアル通信をするときは、できるだけ Raspberry Pi を使うようにしています。

動作確認用の Pi Zero W の用意

最初に Pi Zero W を用意します。ここではホスト名を pizero とします。使用した OS の情報を紹介しておきます。Raspberry Pi OS では /boot/issue.txt/etc/os-release のファイルを確認すると、OS の情報がわかります。

pi@pizero:~ $ cat /boot/issue.txt 
Raspberry Pi reference 2021-03-04
(略)
pi@pizero:~ $ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

コマンドの実行結果から、2021-03-04 版の Raspbian で、ベースが Debian 10 でした。Raspberry Pi の最近の公式 OS は Raspberry Pi OS と呼ばれていますが、当時は Raspbian という名前だったのでした。

Raspberry Pi のシリアルコンソールについて

Raspberry Pi ではシリアル通信でコンソール画面を使って、Raspbian や Raspberry Pi OS を操作することができます。このシリアル通信で使用するコンソールをシリアルコンソールと呼び、Raspbian や Raspberry Pi OS では UART 機能を提供する GPIO や Bluetooth デバイスで有効化することができます。

Raspbian や Raspberry Pi OS でシリアルコンソールを使う場合は、UART(ユニバーサル非同期受信送信機、Universal Asynchronous Receiver/Transmitter)を使います。Raspberry Pi の UART については、Raspberry Pi Documentation ー Configuration ー Configuring UARTs に詳しい説明があります。

Raspbian や Raspberry Pi OS で GPIO の UART によるシリアルコンソールを使うには、/boot/config.txtenable_uart=1 の設定が必要です。

pi@pizero:~ $ cat /boot/config.txt | grep uart
enable_uart=1

また、シリアルコンソールが有効となっているデバイスファイルは /boot/cmdline.txt を確認すればわかります。こちらは Raspbian でも Raspbery Pi OS でも同じです。

pi@pizero:~ $ cat /boot/cmdline.txt
console=serial0,115200 console=tty1 root=(略)

この例だと console=serial0 となっているので /dev/serial0 でシリアルコンソールが使えるようになっています。なお、この /dev/serial0 と対応するデバイスが実際に存在しないと使えないので、ls コマンドで確認します。

pi@pizero:~ $ ls -l /dev/serial*
lrwxrwxrwx 1 root root 5  2月  3 18:07 /dev/serial0 -> ttyS0
lrwxrwxrwx 1 root root 7  2月  3 18:07 /dev/serial1 -> ttyAMA0

この例だと、/dev/ttyS0 に対応するデバイスでシリアルコンソールが使えるということがわかります。Raspberry Pi Zero W/WH では、これは GPIO ピンに対応します。UART を有効にすると、GPIO 14 を RX(受信)、GPIO 15 を TX(送信)で使用します。

raspi-config による設定

/boot/config.txt/boot/cmdline.txt を直接編集してから Raspberry Pi Zero W/WH を再起動することでシリアルコンソールを使うことができますが、公式に用意されている設定方法として raspi-config コマンドを使う方法があるので、そちらについても説明しておきます。

sudo raspi-config

表示される設定画面で「3 Interface Options」-「P6 Serial Port」と選択すると「Would you like a login shell to be accessible over serial?」と聞かれるので「Yes」とすれば良いです。「Finish」すると、再起動を促されるので、そのまま再起動します。これで、/dev/serial* のファイルが次のようになります。

pi@pizero:~ $ ls -l /dev/serial*
lrwxrwxrwx 1 root root 5  2月  3 18:07 /dev/serial0 -> ttyS0
lrwxrwxrwx 1 root root 7  2月  3 18:07 /dev/serial1 -> ttyAMA0

ちなみに、シリアルコンソールを有効化する前は次のようになっていたはずです。

pi@pizero:~ $ ls -l /dev/serial*
lrwxrwxrwx 1 root root 7  2月  3 18:06 /dev/serial1 -> ttyAMA0

以上で Raspberry Pi Zero W の GPIO を使ってシリアルコンソールと通信ができるようになりました。これで Raspberry Pi Zero W の準備はおしまいです。

Raspberry Pi の UART について

参考までに Raspberry Pi の UART について調べたので説明を書きました。歴史的な経緯といろいろな Raspberry Pi のハードウェアへ対応するために複雑なものとなっているようです。興味のない人は「Raspberry Pi 4B の用意」へ進んでください。

Raspberry Pi Zero W/WH、Raspberry Pi 1/2/3 では UART 対応のデバイスが2つ用意されていて、UART0、UART1 という名前がついています。Raspberry Pi 4 では UART0 から UART5 まで、6つ用意されています。Raspberry Pi で実装されている UART 対応のデバイスのタイプには PL011(16550互換)と mini UART の2種類があります。mini UART は PL011 よりも機能が少ないものになります。

先程紹介した Raspberry Pi の公式ドキュメントの Raspberry Pi Documentation ー Configuration ー Configuring UARTs によると、Raspberry Pi で Pi 5 以外で Bluetooth デバイスを搭載しているモデルでは、UART0 と Bluetooth デバイスが接続、UART1 と GPIO デバイスが接続されています。

名前 接続先 タイプ
UART0 Bluetooth PL011
UART1 GPIO mini UART

UART1 は PL011 よりも機能が制限されている mini UART タイプになります。

ちなみに、Bluetooth デバイスを搭載されていないモデルでは UART0 と GPIO デバイスが接続されています。

名前 接続先 タイプ
UART0 GPIO PL011

USB タイプの Bluetooth デバイスを追加すると、UART1 が Bluetooth デバイスと接続して使えるようになります。

さて、ここで、Raspberry Pi で UART に関係するデバイスファイルとしては次のものがあります。

デバイスファイル 説明
/dev/ttyS0 mini UART
/dev/ttyAMA0 PL011 (UART0)

前の方で説明した通り、/dev/serial0/dev/serial1/dev/ttyS0/dev/ttyAMA0 へのシンボリックリンクとなります。今回の例で示した設定内容だと、Bluetooth デバイスが搭載されているモデルでは /dev/serial0/dev/ttyS0 へのシンボリックリンクとなり、GPIO ピンと接続することでシリアルコンソールが使えるようになります。

Raspberry Pi 4B の用意

次に Raspberry Pi 4B を用意します。ここではホスト名を pi4b8gb とします。screen コマンドを使うので、apt コマンドでインストールします。

sudo apt -y install screen

Raspberry Pi 4B では 2023-12-05 版の Raspberry Pi OS を使いました。こちらは以上で準備はおしまいです。

FTDI USBシリアル変換アダプターによる接続

ここでは、FTDI USBシリアル変換アダプターによる接続方法について説明します。記事の最初の方にあった接続図を再掲します。

/images/20240204_rpi_serial/rpi_serial_uart.png
接続環境

FTDI USBシリアル変換アダプターの各端子を Raspberry Pi Zero W に接続します。

FTDI USB シリアル変換アダプター Raspberry Pi Zero W
GND (6番ピン) GND ( 6番ピン)
RX (2番ピン) GPIO14 UART TXD0 ( 8番ピン)
TX (3番ピン) GPIO15 UART RXD0 (10番ピン)

次に、FTDI USBシリアル変換アダプターの micro USB コネクタと Raspberry Pi 4B の USB コネクタを USB ケーブルで接続します。

これで Raspberry Pi OS に USB 用のシリアル通信で使用するターミナル用のデバイスファイルが用意されるので、そのデバイスファイル名を確認します。

pi@pi4b8gb:~ $ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0  2月  3 20:17 /dev/ttyUSB0

Ubuntu など、通常の Linux では、USB によるシリアル通信には dialout グループに所属しているユーザーが使えるようになっています。Raspberry Pi OS では、初期から用意されている pi ユーザーが最初から dialout グループに所属しているので、それをそのまま使えば大丈夫です。所属していない場合は、usermod コマンドで登録できます。

sudo usermod -aG dialout $USER

シリアルコンソールの利用

Raspberry Pi 4B から Raspberry Pi Zero W のシリアルコンソールを使うには、ターミナルアプリで screen コマンドを次のように実行します。

screen /dev/ttyUSB0 115200

これで、Raspberry Pi Zero W の pizero のログイン画面が表示されます。ユーザー名へ「pi」、パスワードへ「pi のパスワード」を入力するとログインができ、Raspbian の操作ができるようになります。

ちなみに、screen のデフォルト設定では Ctrl+a d(Ctrl と a を同時に入力後に d を入力)とするとプロセスのデタッチがされて、通常のターミナルに戻ります。デタッチなので、screen のプロセスは継続しています。

継続している screen のプロセスへ再接続して作業を再開するには、-x オプションを使います。

screen -x

screen を終了するには screen -X -S <プロセスID> kill とします。プロセス ID は、screen ls コマンドで表示される一覧のフォーマットが pid.tty.host となっているため、そこからわかります。

pi@pi4b8gb:~ $ screen -ls
There is a screen on:
    2938.pts-1.pi4b8gb  (2024年02月03日 16時45分39秒)   (Detached)
1 Socket in /run/screen/S-pi.

この例だと、pid が 2938、tty が pts-1、host が pi4b8gb に対応します。pid の 2938 を指定して、screen コマンドを終了します。

pi@pi4b8gb:~ $ screen -X -S 2938 kill

確認のために screen -ls コマンドを実行すると screen の表示がされずにメッセージが表示されます。

pi@pi4b8gb:~ $ screen -ls
No Sockets found in /run/screen/S-pi.

なお、デタッチしながら screen を終了するには、Ctrl+a k(Ctrl と a を同時に入力後に k と入力)または、Ctrl+a :quit (Ctrl と a を同時に入力後に :quit と入力)とします。

Discussion