Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Raspberry PiでUART(シリアル)通信:Pythonプログラムとコンソールの使い方

uart python

この記事の内容は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!

USB-TTLケーブルの電源の線(赤色)は、Raspberry PiのGPIOピンに接続する必要はありません。電源はパソコンのUSB(5V)から供給されます。

ドライバのインストール

配線が終わったら、WindowsにPL2303HXのドライバをインストールします。ネットの最新版を使うと私の環境だとうまく動きませんでした(ポートをオープンするとすぐエラーになり、接続が拒否される) 。

下記ページの修正ドライバを使うと問題なく動作しました。Windows 64bit or 32bitがありますので、環境に合わせてドライバをダウンロードし、インストールを行ってください。 ・Prolific USB-to-Serial Fix

UARTをコンソールとして使う

WindowsでTeratermを起動します。下記の手順でシリアルポートの設定を行ってから、Raspberry Piと接続します。

  • 設定 ⇒ シリアルポートをクリックします。

teraterm serialport

  • ポートはご自身の環境よって変わります。あとは、写真と同じ値に設定します。

teraterm serialport setting

  • ファイル ⇒ 新しい接続をクリックします

teraterm connect

  • シリアル:ポートの項目で接続しているCOMポートを選択して、OKボタンをクリックします。

teraterm connect com port

  • Enterキーを1回押します。ユーザー名とパスワードを聞かれますので、入力します。 下記の画面が開き、コンソールとして使うことができます。

teraterm console

あとは、通常のコンソールと同じです。Raspberry PiをUART通信で操作できるようになります。

UARTを汎用ポートとして使う

pythonプログラムから、UARTで通信できることを確認します。

Rs232ctoolの準備

WindowsでRs232ctoolというソフトを使いますので、下記からダウンロードします。

https://www.vector.co.jp/soft/dl/winnt/hardware/se411276.html

Rs232ctoolの使い方(Windows側の操作説明)

上記でダウンロードしたファイル解凍して、Rs232cTool.exeを起動します。

rs232c tool

  • 接続 ⇒ 下記画面で、ポート名(環境に合わせて設定)とボーレート:115200を設定して、接続ボタンをクリックします。
  • データ受信 ⇒ データを受信するとウインドウ下側に受信した文字が自動的に表示されます。
  • データ送信 ⇒ 送信の項目に送信したい文字列を入力して、TEXT送信ボタンをクリックします。

注意事項

  • データ送信時は、文字列の最後には必ず 改行コード: を付けてください。

pythonのサンプルコード(Raspberry Pi側の操作説明)

下記がpythonのサンプルコードになります。エラー処理も入れてますので、少し長いですが、やっていることは簡単です。

  1. UARTの設定をして接続
  2. ターミナルで入力した文字をWindowsに送信
  3. Windowsからの文字を受信
  4. 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で汎用通信をする

下記の手順で行います。

  1. Windows:Rs232ctoolで接続を行う
  2. ラズパイ:pythonプログラムを実行する
  3. ラズパイ:ターミナルで文字を入力する ⇒ Windows側に文字が表示される
  4. Windows:送信文字列を入力し、TEXT送信ボタンをクリックする ⇒ Raspberry Piの側に文字が表示される
  5. 3~4を繰り返す

Raspberry PiとWindowsでUART通信を使用して、文字列のやりとりが出来ました。今回はWindowsと通信を行いましたが、UARTで制御できるデバイスを接続すれば、デバイスをコマンドで制御できるようになります。Raspberry Piとpythonでいろいろなものを制御できるようになります。以上でUARTの説明を終わります。