Raspberry Pi 3B のUARTにシリアル接続

前提

今回は訳あって Raspberry Pi3 B を使用。
4でもないし、3Aでもなければ3B+でもない。

OSは Ubuntu 22.04 LTS

目的

外部からの通信を受けて、RPi3をあれこれと動かしたい。
最終的にはRS-485で制御コマンドを発行する「とある機械」からの通信を受けて、RPi3の中であれこれしたあとに、別の端末に制御コマンドを投げたり、データの蓄積、RPi3にnginxやapacheでも立てて「とある機械」のヘルスチェックなんかに使いたい。

用意したモノ

RPi3はTTLレベルのUARTでシリアル通信を行うので、下記のようなアダプタを用意。
PCのUSBに接続して、アダプタのTXDとRXD、GNDをRPi3のピンヘッダに接続すればシリアル通信が行えるようになる。
PCとRPi3が近いのならともかく、USBの延長ケーブルもあった方が便利かも知れない。
接続用の信号用ケーブルが付属はしているけれど、25cmほどなので。

USB to TTL UART アダプタ

ピンアサインの確認

RPi3のGPIOピンアサインは下記の通りで、UARTによるシリアル通信に使うのは
 6番:GND
 8番:GPIO14(TXD)
 10番:GPIO15(RXD)
の3つ。

GPIOに振られた番号とピン番号が一致しているわけではない。

ちょっと面倒な構成になっているUART

RPi4はもっと複雑、というかUARTの数が増えたんだけど、RPi3は2つ。

名称タイプNumber接続先デバイスGPIO
UART0PL011SecondaryBluetooth/dev/serial1 -> /dev/ttyAMA0なし
UART1miniUARTPrimaryシリアル(コンソール)/dev/serial0 -> /dev/ttyS08番、10番ピン

こんな感じで、しかもUbuntuの22.04ではSecondaryのUARTもデフォルトで有効化されていた。

そのため、USB-UARTアダプタをPCとRPi3の間に接続してやれば、すぐにPC側のターミナルソフトでRPi3のコンソールにアクセス出来る。

PC用のターミナルソフトと言えばTeraTermが定番だけど、やっぱりシリアルで繋げて起動時からのメッセージをログとして簡単に取れるってのは便利だね。

コンソール出力を切断して、シリアル通信を使う

使用するUARTがminiUARTのままで問題ない場合

今回は特に高速である必要もなく、それこそ9600bpsで問題ないし、FIFOバッファも要らないくらいなのでminiUARTのままで問題ない。

/boot/firmware/cmdline.txt を編集し、
console=serial0,115200 という部分を削除。

dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash

これだけでrebootすれば、目的とするシリアル通信が可能になる。
Bluetoothもそのまま使える。

でも、せっかくなら普通のUART使いたいし、Bluetoothも使いたい。という場合

/boot/firmware/cmdline.txt を編集し、console=serial0,115200 という部分を削除。というのは同じ。

その他、/boot/firmware/config.txt を少し編集して下記のようにする。

尚、この場合、core_freq=250 とあることからもわかるように、RPi3のコアクロックを低めに固定しちゃうので、パフォーマンスは落ちます。が、GPU使う目的じゃなければ問題ない。
(miniUARTのボーレートがGPUクロックに依存しているため)

そして、
UART0に繋がっていたBluetoothがUart1のminiUARTに、
UART1に繋がっていたGPIOがUART0に
繋がるので、ターミナルソフトで確認する際などは、デバイスの指定を間違えないよう。

名称タイプNumber接続先デバイスGPIO
UART0PL011Secondaryシリアル/dev/serial0 -> /dev/ttyAMA08番、10番ピン
UART1miniUARTPrimaryBluetooth/dev/serial1 -> /dev/ttyS0

この記事にコメントしてみる

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