ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

ラズパイでUART通信を行う

前回、ラズパイでハードウェアを制御する方法の勉強をスタートしました。

masaeng.hatenablog.com

少し間が開いてしまいましたが、第二回目はUART通信です。
UARTはマイコンデバッグ用通信やデバイス間通信などによく使われていますね。ラズパイでUARTを使う方法を調べましたので、必要な時にすぐ使えるように整理しておきたいと思います。

UARTとは?

UARTはUniversal Asynchronous Receiver Transmitterの略で、非同期方式による通信です。UARTの信号線は送信用のTXDと受信用のRXDの2本です。

規格の詳細は割愛しますが、こちらのサイトに詳しく書かれています。

tri-s.world.coocan.jp

 

ラズパイとデバイスの接続

ラズパイでUARTを使用するにはデバイスと以下のように1対1で接続します。
ラズパイのUART端子は設定を変えることでGPIO14をTXDに, GPIO15をRXDに割り当てることができます。

   f:id:masashi_k:20190825225842p:plain

同じUARTに複数のデバイスを接続することはできませんので注意。

 

UARTを使うための設定

Rasbianのデフォルト設定ではラズパイでUARTを使うことはできません。
以下の2つの設定が必要となります。

①シリアルコンソールの設定

プログラムで使用するUARTは/dev/serial0ですが、デフォルトではOSの
シリアルコンソールが/dev/serial0を使用するようになっています。
(USBシリアル変換ケーブル経由でGPIO14,15とPCをつなぐことで
PCのターミナルソフトからラズパイにアクセスできる)

シリアルコンソールが/dev/serial0に接続しないように/boot/cmdline.txtに記載されている”console=serial0,115200”を削除する必要があります。 

f:id:masashi_k:20190825233940p:plain

②UARTの有効化

ラズパイに搭載されているSoC BCM2835は高機能なPL011 UARTと機能が限定されたmini UARTの2種類を搭載しています。デフォルトはPL011 UARTだけが有効でBluetoothモジュールに割り当てられているのでプログラムがUARTを使用することはできません。
/boot/config.txtに"enable_uart=1"を追記するとMini UARTがGPIO14,15に
マッピングされます。(図の(2))
さらに"enable_uart=1"の代わりに"dtoverlay=pi3-miniuart-bt", "core_freq=250"を追記するとPL011 UARTがGPIO14,15にマッピングされ、高機能なUART機能を使用可能になります。この時BluetoothモジュールはMiniUARTに接続されます。(図の(3))

f:id:masashi_k:20190825232040p:plain

 

UARTで通信を行うプログラム

ラズパイのpythonでUART通信を行うにはpySerialライブラリを使用します。Raspbian標準搭載されています。以下にサンプルコードを示します。

import serial
import binascii
ser = serial.Serial('/dev/serial0', 115200, timeout = 0.5)  #UART初期化

#コマンド送信
ser.write(b'\x22\x00\x00\x22') #4バイトのByte型でデータを送信
ser.write("hello")

#コマンドの結果を受信(4byte)
data = ser.read(4)
#コマンドの結果を受信
data = ser.readline()  #区切り文字0x0Aまでのデータを受信

#binデータで読み出されるので結果をhexに変換
data=binascii.b2a_hex(data)

ser.close() # ポートのクローズ

 

まとめ

ラズパイでデバイスとのUART通信を行う方法を記載しました。UARTのみをインターフェスにもつセンサーを使いたい場合は、この方法でセンサーデータを取得できると思います。今手元にデバイスがなく、実際に動作確認はできていませんが、機会があれば、動作結果を追記します。

 

参考サイト

qiita.com