はじめに
RaspberryPi PicoでUARTを使う方法を解説します。言語はMicroPython、接続先にはRaspberryPi(ラズパイ)のUARTピンを使います。
UARTより「RS232Cのシリアル通信」と呼んでいる方も多いかもしれません。通常のPCとつなぐこともできますが、USB-シリアル変換ケーブルなどが必要になるため、今回はRaspberryPiと接続して解説します。
RaspberryPiで、UARTを使う際の参考にもなると思うので、Pico / RaspberryPi でシリアル通信を使いたい方はぜひご覧ください。
~ この記事の内容 / Contents ~
環境
この記事は以下の環境で作成しています。
環境 | バージョンなど | 備考 |
RaspberryPi | 2 Model B | |
OS | RaspberryPi OS (bullseye) | 32bit版です |
RaspberryPi Pico | — | |
開発環境 | Thonny Ver.3.3.13 |
RaspberryPi Picoとの接続
PicoとRaspberryPiの「TxD」「RxD」「GND」を以下のように接続します。
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)
※ Pico公式サイトより引用
RaspberryPi ピンアサイン(Pin-Out)
※ RaspberryPi 公式のGitHubより引用
使用する部品
今回使用する部品は以下の通りです。
RaspberryPi 4 (8GBモデル)
スイッチやLEDをつなげて使うなら、価格が下がった「RaspberryPi4」がおすすめです。
ジャンプワイヤ (オス-メス タイプ)
RaspberryPiで使う場合は、以下のオスーメスタイプがおすすめです。
エネループ
使い捨ての乾電池もいいですが、エネループなら4本充電時の電気代が約1円。モーター・ポンプなどの電池が消耗しやすい実験・工作におすすめです。
※ はじめて使う方は充電器とのセットがおすすめです
電池ボックス
電源に使用する乾電池用のボックスとスナップです。記事では単4を使っていますが、容量の大きい単3タイプをお勧めします。単3でも単4でも電圧は変わりません。
プログラム概要
今回のプログラムの概要は以下の通りです。RaspberryPi側はプログラムではなく、端末上のコマンドでデータを入出力します。
- UARTを初期設定する
- Picoから送信する
- Picoで受信する
実行結果
後述するプログラムの実行結果です。Pico – RaspberryPi間でUARTの通信を行うとことができます。
Picoからの送信
送信時の実行結果です。Picoから送信されたデータ「12345」がRaspberryPiの端末上に表示されています。(Pico側には送信成功時のエコーバックが表示されています)
Picoでの受信
受信時の実行結果です。RaspberryPiの端末から入力されたデータが「ABCDE」がThonny上に表示されています。
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をつなぐ方法は、意外とネットに情報が少ない印象だったので記事にまとめてみました。参考になればうれしいです。
お知らせ
MicroPythonのプログラミングガイドブックが遂に発売!
「MicroPython」の本が遂にでました。
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!。
内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。
全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。
Pico/Pico W関連のおすすめ本
RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。
[…] 【直結】RaspberryPi Pico MicroPythonでUARTを使う方法 【RaspberryPi2に接続編】 […]