Raspberry Pi 5でUARTを使う方法

RaspberryPi
この記事は約5分で読めます。

こんにちは、JS2IIUです。UART(Universal Asynchronous Receiver/Transmitter)は、Raspberry Piでデバイスとシリアル通信を行うための一般的なプロトコルです。以下の手順でRaspberry Pi 5のUART機能を有効化し、通信を開始できます。

Raspberry Pi5 でUARTを使うには以下の手順で実施します。詳細は以下の記事を参照して下さい。

  • $ sudo raspi-configを実行してシリアル通信をEnableにする
  • /boot/firmware/config.txtに設定を追記する
  • /dev/ttyAMA0が使えるようになる
  • GPIOのGPIO14/15がTX/RXになる

raspi-configでシリアル通信をEnableにする

まず、Raspberry Piの設定ツールraspi-configを使用してシリアル通信を有効化します。

$ sudo raspi-config
  • メニューが表示されたら「Interface Options」を選択します。
  • 続いて「Serial Port」を選び、シリアルハードウェアを有効にします。
  • 「Would you like a login shell to be accessible over serial?」という質問には「No」を選びます。これは、シリアルポートがターミナル接続の代わりに、外部デバイスとの通信に使用されるようにするためです。
  • 「Would you like the serial port hardware to be enabled?」には「Yes」を選択し、シリアルポートを有効化します。

設定完了後、再起動を行い設定を反映します。

$ sudo reboot

/boot/firmware/config.txtに設定を追記する

次に、UARTの動作を確実にするために、/boot/firmware/config.txtファイルに以下の行を追記します。

enable_uart=1

この設定により、Raspberry PiのUARTが確実に有効化され、/dev/ttyAMA0が利用可能になります。

config.txtの編集後、再度Raspberry Piを再起動して設定を反映させます。

$ sudo reboot

/dev/ttyAMA0が使えるようになる

上記の手順により、UARTが有効化されると、/dev/ttyAMA0というデバイスファイルが利用可能になります。これを介してシリアル通信を行うことができます。デバイスファイルがあるか確認するときは以下のコマンドを実行します。

$ ls /dev/tty*

GPIOのGPIO14/15がTX/RXになる

Raspberry Pi 5では、以下のピンがUARTのTX(送信)およびRX(受信)として設定されています。

  • GPIO14 (TX) – データ送信用
  • GPIO15 (RX) – データ受信用

これらのピンに外部デバイスを接続して、UART通信を行います。接続時は、デバイスのTXピンとRaspberry PiのRXピン、デバイスのRXピンとRaspberry PiのTXピンを接続する必要があります。

GPIOの設定状況を見るにはpinoutコマンドを実行します。

$ pinout

Pythonでシリアル通信するサンプルプログラム

以下は、Pythonを用いてUARTを通じてデバイスとシリアル通信を行うサンプルプログラムです。このプログラムは、Raspberry Piと外部デバイス間で簡単な文字列メッセージの送受信を行います。

サンプルコード

まず、Pythonでのシリアル通信にはpyserialライブラリを使用します。インストールされていない場合は、以下のコマンドでインストールできます。

$ pip install pyserial

次に、UART通信を行うためのPythonコードです。

import serial
import time

# UART通信の設定
ser = serial.Serial(
    port='/dev/ttyAMA0',  # UARTデバイス
    baudrate=9600,        # 通信速度(ボーレート)
    timeout=1             # タイムアウト(秒)
)

# データ送信
def send_data(data):
    ser.write(data.encode('utf-8'))
    print(f"Sent: {data}")

# データ受信
def receive_data():
    if ser.in_waiting > 0:
        data = ser.readline().decode('utf-8').strip()
        print(f"Received: {data}")
        return data
    return None

try:
    while True:
        # 送信データを設定
        send_data("Hello, UART!")
        time.sleep(1)

        # 受信データがあれば表示
        received = receive_data()
        if received:
            print(f"Data received: {received}")

        time.sleep(1)

except KeyboardInterrupt:
    print("通信終了")

finally:
    ser.close()

コード解説

  1. serial.Serialの設定
    • port='/dev/ttyAMA0'と指定することで、Raspberry PiのUARTポートを使用します。baudrate=9600は、通信速度(ボーレート)で、通信相手と合わせる必要があります。
  2. send_data関数
    • 指定した文字列dataをUTF-8形式でエンコードし、ser.write()でUARTに送信します。
  3. receive_data関数
    • ser.in_waiting0より大きい場合、受信データがあることを示します。データがあれば、ser.readline()でデータを読み取り、UTF-8でデコードしてから表示します。
  4. 無限ループによる送受信の繰り返し
    • 送信と受信を1秒ごとに繰り返します。KeyboardInterrupt(Ctrl+C)で終了した場合、ser.close()でシリアルポートを閉じます。

参考文献

この設定により、Raspberry Pi 5でシリアル通信を簡単に始めることができます。

<PR>

コメント

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