Pico

【直結】RaspberryPi Pico MicroPythonでUARTを使う方法 【RaspberryPi2に接続編】

はじめに

RaspberryPi PicoでUARTを使う方法を解説します。言語はMicroPython、接続先にはRaspberryPi(UARTピン)を使います。

UARTより「RS232Cのシリアル通信」と呼んでいる方も多いかもしれません。通常のPCとつなぐこともできますが、USB-シリアル変換ケーブルなどが必要になるため、今回はRaspberryPiと接続して解説します。

RaspberryPiで、UARTを使う際の参考にもなると思うので、Pico / RaspberryPi でシリアル通信を使いたい方はぜひご覧ください。

環境

この記事は以下の環境で作成しています。

環境 バージョンなど 備考
RaspberryPi 2 Model B
OS RaspberryPi OS (bullseye) 32bit版です
RaspberryPi Pico
開発環境 Thonny Ver.3.3.13

RaspberryPi Picoとの接続

PicoとRaspberryPiの「TxD」「RxD」「GND」を以下のように接続します。

PicoとRaspberryPiの接続方法を説明する画像

RaspberryPi Pico RaspberryPi 2
ピン番号  内容  ピン番号  内容
1 UART0 TxD 10 RxD
2 UART0 RxD 8 TxD
3 GND 6 GND

TxDは「口」に相当する「送信専用」のピンで、RxDは「耳」に相当する「受信専用」のピンです。そのため、お互いのTxD(口)とRxD(耳)がつながるように配線してください。

Picoピンアサイン(Pin-Out)

RaspberryPi Picoのピンアサイン(pinout)の画像

Pico公式サイトより引用

RaspberryPi ピンアサイン(Pin-Out)

RaspberryPiのピンアサインを説明する図

RaspberryPi 公式のGitHubより引用

使用する部品 

今回使用する部品は以下の通りです。

RaspberryPi Pico

【後継品】RaspberryPi 4 (4GBモデル)

ジャンプワイヤ (オス-メス タイプ)

Pico(ブレッドボード)とPi2をつなぐので、以下のオスーメスタイプがおすすめです。

プログラム概要

今回のプログラムの概要は以下の通りです。RaspberryPi側はプログラムではなく、端末上のコマンドでデータを入出力します。

  • UARTを初期設定する
  • Picoから送信する
  • Picoで受信する

実行結果

後述するプログラムの実行結果です。Pico – RaspberryPi間でUARTの通信を行うとことができます。

Picoからの送信

送信時の実行結果です。Picoから送信されたデータ「12345」がRaspberryPiの端末上に表示されています。(Pico側には送信成功時のエコーバックが表示されています)

Picoから送信したデータを説明する画像
Picoからデータ送信・エコーバックの受信
RaspsberryPiで受信したデータを説明する画像
RaspberryPiの端末で受信データを表示

Picoでの受信

受信時の実行結果です。RaspberryPiの端末から入力されたデータが「ABCDE」がThonny上に表示されています。

RaspberryPiが送信するデータを説見えする画像
RaspberryPiの端末からデータを送信
Picoでデータを受信

RaspberryPiのUART(シリアル)設定

RaspberryPiでは、デフォルトでUARTの機能が無効化されています。初めてUARTの機能を使う場合は、こちらの記事を参考に「シリアル通信の有効化」を行ってください。

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

from machine import Pin, I2C, UART
import time

# UARTの初期化です。
# UARTの番号とボーレートを指定します。
uart = UART(0, 9600)
#uart = UART(0, 115200)

# init関数はエラーになるので使用できません。
#uart.init(115200,bits=8, parity=None, stop=1 )

#
# データの送信処理です
# 注意:末尾に「\r」をつけないと、データが送信されません。
#
uart.write("12345\r")
print("write done")

#
# データの受信処理です
# 1byteずつ読み込んで表示しています。
#
print("read start")

for i in range(1000):
    buf = uart.read(1)
    print(buf)
    
    time.sleep_ms(1000)
    

コードのポイント

UARTを初期設定する

UARTのコンストラクタで、「UARTの番号」「ボーレート」を設定します。

「UARTの番号」にはピンアサイン(PinOut)の記載に従って、使用しているピンのUARTの番号(UART0 or 1)を指定します。

「ボーレート」には、通信相手と同じ数値を設定します。今回はRasberryPi側の初期設定に合わせて「9600」に設定しています。「115200」などよく使われる値も使用できます。

# UARTの初期化です。
# UARTの番号とボーレートを指定します。
uart = UART(0, 9600)
#uart = UART(0, 115200)

# init関数はエラーになるので使用できません。
#uart.init(115200,bits=8, parity=None, stop=1 )

init関数は構文エラーになるので、Picoでは使えないようです。

公式リファレンスのPico(RP2040)の項目にも、コンストラクタでピンを指定する方法しか記載がありませんでした。

Picoから送信する

RaspberryPiに「12345」の文字列を送ります。Write関数では、「\r」をつけないとデータが送信されないので注意してください。

#
# データの送信処理です
# 注意:末尾に「\r」をつけないと、データが送信されません。
#
uart.write("12345\r")
print("write done")

RaspberryPi側では、以下のコマンドで受信データを表示してください。

cat /dev/ttyAMA0

Picoで受信する

RaspberryPiから受信したデータを1byteずつ表示します。RaspberryPiの端末から、以下のコマンドでデータをPicoに送信してください。

echo "ABCDE" > /dev/ttyAMA0

#
# データの受信処理です
# 1byteずつ読み込んで表示しています。
#
print("read start")

for i in range(1000):
    buf = uart.read(1)
    print(buf)
    
    time.sleep_ms(1000)
    

まとめ

RaspberryPi Pico / RaspberryPi でUART(RS232Cのシリアル通信)を使う方法について解説しました。

PicoとRaspberryPiをつなぐ方法は、意外とネットに情報が少ない印象だったので記事にまとめてみました。参考になればうれしいです。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index