【Python活用】Raspberry Pi と Windows を Tera Term で双方向通信する方法

ラズパイ

Raspberry Pi(ラズパイ)を使ったプロジェクトでは、PCとデータをやり取りすることがよくあります。

今回は ラズパイ3B と Windows10 を Tera Term で接続し、Pythonプログラムを使って双方向通信 を行う方法を解説します。

スポンサーリンク
スポンサーリンク

必要なもの

  • Raspberry Pi 3B(OS: Raspberry Pi OS)
    → Raspberry Pi OS のインストール方法
  • Windows 10 PC
  • microSDカード(OSインストール済み)
  • USB シリアル変換ケーブル(例: PL2303、CH340、FT232R など)
    →シリアル通信(USB-UART)の場合に必要
  • Tera Term(Windows用ターミナルソフト)
  • Python(ラズパイ標準で搭載)

方法A:TCPソケット(LAN経由)【おすすめ】

概要

Raspberry Pi 上の Python で TCPサーバ を起動(ポート例:5000)。Windows の Tera Term から TCP接続(Telnet/Raw) を張り、キーボード入力を送信、Pi 側が受け取り・処理して応答を返す構成です。

メリット

  • 追加ハードウェア不要
  • Tera Term の標準機能で接続可(「TCP/IP」→「Telnet」or「その他(Raw)」)
  • 複数接続にも拡張しやすい

ラズパイ側:Pythonサーバ(asyncio版)

ラズパイのターミナルで必要なら Python を確認(標準で3系あり)。以下の tcp_server.py を作成します。

# tcp_server.py
import asyncio
import datetime

HOST = "0.0.0.0"   # どこからの接続も受ける
PORT = 5000        # 任意の空きポート

WELCOME = (
    "Raspberry Pi TCP Server (UTF-8)\n"
    "Type something and press Enter. Commands: TIME, HELP, EXIT\n"
)

HELP = (
    "Commands:\n"
    "  TIME  : show server time\n"
    "  HELP  : show this help\n"
    "  EXIT  : close connection\n"
)

async def handle_client(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
    addr = writer.get_extra_info('peername')
    print(f"[INFO] Connected from {addr}")
    writer.write(WELCOME.encode("utf-8"))
    await writer.drain()

    try:
        while True:
            writer.write(b"> ")
            await writer.drain()

            data = await reader.readline()
            if not data:
                break

            text = data.decode("utf-8", errors="ignore").strip()
            print(f"[RECV] {addr}: {text}")

            if text.upper() == "EXIT":
                writer.write(b"Bye!\n")
                await writer.drain()
                break
            elif text.upper() == "TIME":
                now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                writer.write(f"{now}\n".encode("utf-8"))
            elif text.upper() == "HELP":
                writer.write(HELP.encode("utf-8"))
            else:
                # エコー(お好みで処理を差し替え)
                writer.write(f"Echo: {text}\n".encode("utf-8"))

            await writer.drain()

    except Exception as e:
        print(f"[ERROR] {addr}: {e}")

    finally:
        writer.close()
        await writer.wait_closed()
        print(f"[INFO] Disconnected {addr}")

async def main():
    server = await asyncio.start_server(handle_client, HOST, PORT)
    addr = ", ".join(str(s.getsockname()) for s in server.sockets)
    print(f"[START] Listening on {addr}")
    async with server:
        await server.serve_forever()

if __name__ == "__main__":
    asyncio.run(main())

起動

python3 tcp_server.py

起動したら Listening on ('0.0.0.0', 5000) のように表示されます。

注意:社内LANや公開ネットワーク上で使う場合は、ファイアウォール/ネットワークポリシーに注意。必要に応じて認証を追加してください(IP制限、簡易パスワード、SSHトンネリングなど)。

起動後の画面例

Windows 10 側:Tera Term の接続

Tera Tarmの接続画面
  1. Tera Term を起動
  2. TCP/IP」タブを選択
  3. 「ホスト」に ラズパイのIPアドレス を入力(例:192.168.1.23
  4. サービスは
  5. まずは Telnet でOK(Enterで送ると改行がLF/CRLFに変換されやすい)
  6. うまくいかない場合は その他(Raw) を選び、ポート番号 5000 を指定
  7. 接続後、画面に「WELCOME」が表示 → TIME, HELP, EXIT などを入力
「time」と入力後の応答

文字化け対策

  • Tera Term の文字コードUTF-8 に設定
    [メニュー] → 設定 → 端末 → 受信/送信で UTF-8 を選択
  • 改行コードは LF/CRLF の違いで振る舞いが変わる場合があります。うまく表示されない場合は Tera Term の「送信時の改行」を調整してください。

方法B:シリアル通信(USB-UART)【ネット不要】

概要

ラズパイの GPIO(UART:TXD/GPIO14, RXD/GPIO15, GND)と、Windows PC の USB-シリアル変換器(FTDI/CP2102/CH340 など)を配線。Pi 側の Python は pyserial で待ち受け、Windows 側は Tera Term で COMポート に接続します。

準備物

  • USB-シリアル変換器(TTL 3.3V レベル対応のもの)
    USBドライバーのインストール
  • ジャンパ線
  • (必要なら)はんだ・ブレッドボード

CP2102 USB-TTL UART 232 485ポート相互変換アダプター

安いのでおすすめです。ワイヤーも同封されています。

配線(重要)

  • 変換器 TXD → Pi の RXD(GPIO15, ピン10)
  • 変換器 RXD → Pi の TXD(GPIO14, ピン8)
  • 変換器 GND → Pi の GND(ピン6など)
  • 電圧は3.3Vレベル必須(5Vを Pi UART に入れない!)

ラズパイ側設定(UART有効化)

sudo raspi-config
# Interface Options → Serial
# 「シリアル経由のログインシェルを有効にしますか?」→ いいえ
# 「シリアルハードウェアを有効にしますか?」→ はい

再起動後、/dev/serial0(または /dev/ttyAMA0//dev/ttyS0)が使えます。

ラズパイ側:Python(pyserial)

pip3 install pyserial
# serial_echo.py
import serial

# 例: /dev/serial0 を 115200bps
PORT = "/dev/serial0"
BAUD = 115200

with serial.Serial(PORT, BAUD, timeout=1) as ser:
    print(f"[START] Serial open: {PORT} {BAUD}bps")
    ser.write(b"Raspberry Pi Serial Server (UTF-8)\n")
    ser.write(b"Type something. Commands: HELP, EXIT\n")
    while True:
        line = ser.readline()  # 改行まで受信
        if not line:
            continue
        text = line.decode("utf-8", errors="ignore").strip()
        print(f"[RECV] {text}")

        if text.upper() == "EXIT":
            ser.write(b"Bye!\n")
            break
        elif text.upper() == "HELP":
            ser.write(b"Commands: HELP, EXIT\n")
        else:
            ser.write(f"Echo: {text}\n".encode("utf-8"))

起動:

python3 serial_echo.py

Windows 側:Tera Term

  • シリアルを選択 → COMポート(USB変換器が割り当てた番号)を選ぶ
  • 速度(ボーレート)は 115200(スクリプトに合わせる)
  • 文字コード UTF-8 推奨
  • 接続するとラズパイからのウェルカムメッセージが見え、入力が反映されます

双方向通信のポイント(共通)

  • 文字コード:UTF-8 に統一すると扱いやすい(Tera Term 側も UTF-8)
  • 改行:Tera Term の「送信時の改行」(CR / LF / CR+LF)を調整
  • プロトコル:1行1メッセージ(\n終端)にすると実装が簡単
  • ログ:Tera Term のログ機能でテストログを保存可能([ファイル]→ログ)
  • セキュリティ(TCP):LAN越しは IP 制限や認証を検討

トラブルシュート

  • Tera Term で接続できない(TCP)
    • IPアドレス・ポートが正しいか(ifconfig/ip a
    • ラズパイでサーバが起動しているか(ps, netstat -tulnp
    • ルータ/Windows Defender ファイアウォールで遮断されていないか
  • 文字化けする
    • Tera Term を UTF-8 に変更
    • Python 側の encode("utf-8")/decode("utf-8") を確認
  • シリアルが開けない
    • ポート名・ボーレート一致
    • raspi-config で「シリアルシェルは無効」「ハードウェアは有効」になっているか
    • 配線 TX/RX が交差しているか、GND が共通か、電圧は3.3Vか

追加:Windows側も Pythonで通信したい場合

Tera Term の代わりに Windows 側から Python で話すサンプル(TCPクライアント)

# windows_client.py
import socket
import time
HOST = "***.***.*.**"  # ラズパイのIP
PORT = 5000

with socket.create_connection((HOST, PORT)) as s:
    print(s.recv(1024).decode("utf-8"), end="")
    s.sendall(b"TIME\n")
    time.sleep(3)
    print(s.recv(1024).decode("utf-8"), end="")
    s.sendall(b"EXIT\n")
    time.sleep(3)
    print(s.recv(1024).decode("utf-8"), end="")

まとめ

  • ラズパイとWindowsは UART(シリアル通信) を使えば簡単にデータ交換できる
  • Pythonの pyserial を使うとプログラム的に制御可能
  • Tera Termで簡単に確認でき、デバッグにも便利
タイトルとURLをコピーしました