この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
今回は、UART通信で下記の2つのことを実際に行ってみようと思います。
- コンソールでRaspberry Piを操作する
- WindowsとRaspbery Pi間で汎用通信を行う
汎用通信をするpythonのサンプルコードはUART通信をする際に、いつでも使えますので参考にしてください。
それでは実際に操作してみましょう。コンソールと汎用通信の切り替え方法は下記記事に記載しています。まだ、設定を行っていない方は、設定を行った後、本記事を読み進めてください。
ハードウェアの準備、接続
Raspberry PiのGPIOピンの電圧は3.3Vです。3.3Vでシリアル通信ができるものであれば、基本的には何でも接続できます。私はPL2303HXのチップセットが搭載されているUSB-TTLケーブル(3.3V)を購入しました。
購入したUSB-TTLケーブルのTx/Rx/GNDの線を下記のように接続します。
- USB-TTL GND(黒色) ⇔ ラズパイ GND(6番ピン)
- USB-TTL Rx(白色) ⇔ ラズパイ GPIO14(8番ピン)
- USB-TTL Tx(緑色) ⇔ ラズパイ GPIO15(10番ピン)
Check!
ドライバのインストール
配線が終わったら、WindowsにPL2303HXのドライバをインストールします。ネットの最新版を使うと私の環境だとうまく動きませんでした(ポートをオープンするとすぐエラーになり、接続が拒否される) 。
下記ページの修正ドライバを使うと問題なく動作しました。Windows 64bit or 32bitがありますので、環境に合わせてドライバをダウンロードし、インストールを行ってください。 ・Prolific USB-to-Serial Fix
UARTをコンソールとして使う
WindowsでTeratermを起動します。下記の手順でシリアルポートの設定を行ってから、Raspberry Piと接続します。
- 設定 ⇒ シリアルポートをクリックします。
- ポートはご自身の環境よって変わります。あとは、写真と同じ値に設定します。
- ファイル ⇒ 新しい接続をクリックします
- シリアル:ポートの項目で接続しているCOMポートを選択して、OKボタンをクリックします。
- Enterキーを1回押します。ユーザー名とパスワードを聞かれますので、入力します。 下記の画面が開き、コンソールとして使うことができます。
あとは、通常のコンソールと同じです。Raspberry PiをUART通信で操作できるようになります。
UARTを汎用ポートとして使う
pythonプログラムから、UARTで通信できることを確認します。
Rs232ctoolの準備
WindowsでRs232ctoolというソフトを使いますので、下記からダウンロードします。
https://www.vector.co.jp/soft/dl/winnt/hardware/se411276.html
Rs232ctoolの使い方(Windows側の操作説明)
上記でダウンロードしたファイル解凍して、Rs232cTool.exeを起動します。
- 接続 ⇒ 下記画面で、ポート名(環境に合わせて設定)とボーレート:115200を設定して、接続ボタンをクリックします。
- データ受信 ⇒ データを受信するとウインドウ下側に受信した文字が自動的に表示されます。
- データ送信 ⇒ 送信の項目に送信したい文字列を入力して、TEXT送信ボタンをクリックします。
注意事項
- データ送信時は、文字列の最後には必ず 改行コード:
を付けてください。
pythonのサンプルコード(Raspberry Pi側の操作説明)
下記がpythonのサンプルコードになります。エラー処理も入れてますので、少し長いですが、やっていることは簡単です。
- UARTの設定をして接続
- ターミナルで入力した文字をWindowsに送信
- Windowsからの文字を受信
- 2~3を繰り返す
import serial import traceback import time class UART: def __init__(self): # シリアル通信設定 # ボーレートはラズパイのデフォルト値:115200に設定 try: self.uartport = serial.Serial( port="/dev/ttyS0", baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=None, ) except serial.SerialException: print(traceback.format_exc()) # 受信バッファ、送信バッファクリア self.uartport.reset_input_buffer() self.uartport.reset_output_buffer() time.sleep(1) # データ送信関数 def send_serial(self, cmd): print("send data : {0}".format(cmd)) try: # 改行コードを必ずつけるために、1回削除して、送信時に再度付与する cmd = cmd.rstrip() # 改行コードを付与 文字列をバイナリに変換して送信 self.uartport.write((cmd + "\n").encode("utf-8")) except serial.SerialException: print(traceback.format_exc()) # データ受信関数 def receive_serial(self): try: rcvdata = self.uartport.readline() except serial.SerialException: print(traceback.format_exc()) # 受信したバイナリデータを文字列に変換 改行コードを削除 return rcvdata.decode("utf-8").rstrip() if __name__ == '__main__': uart = UART() while True: # ターミナルから入力された文字を取得 input_data = input("input data:") # ターミナルから入力された文字をWindowsに送信 uart.send_serial(input_data) # Windowsからデータ受信 data = uart.receive_serial() # 受信データを表示 print("recv data : {0}".format(data))
Raspberry Pi とWindowsで汎用通信をする
下記の手順で行います。
- Windows:Rs232ctoolで接続を行う
- ラズパイ:pythonプログラムを実行する
- ラズパイ:ターミナルで文字を入力する ⇒ Windows側に文字が表示される
- Windows:送信文字列を入力し、TEXT送信ボタンをクリックする ⇒ Raspberry Piの側に文字が表示される
- 3~4を繰り返す
Raspberry PiとWindowsでUART通信を使用して、文字列のやりとりが出来ました。今回はWindowsと通信を行いましたが、UARTで制御できるデバイスを接続すれば、デバイスをコマンドで制御できるようになります。Raspberry Piとpythonでいろいろなものを制御できるようになります。以上でUARTの説明を終わります。