手軽で有名な通信方法としてUARTがあります。
今回はUARTでマイコン同士の双方向通信をしてみます。
やること
やること
Raspberry Pi Pico 同士でUART通信をします。
パソコンから232Cでデータを受信します。
受け取った側は英文字列なら大文字/小文字の変換をして受信側へ送信します。
UARTからデータを受信した場合は、そのままパソコンへ送信します。
双方同じスケッチを書き込むことで下図動作が完成します。
反対のパソコンからデータを送信した場合も同じ動作になります。

結果
パソコンからの通信にはTeratermを使用します。
TeratermをRaspberryPi pico 2枚分起動します。
今回左側はCOM16, 右側はCOM50で認識されました。
入力したデータがわかるようにローカルエコーはONにしています。
COM16(左側)から入力したデータ(赤枠)が、COM50(右側)赤枠点線のように大文字と小文字が入れ替わりました。数字は変化していません。
次にCOM50(右側)から入力したデータ(青枠)が、COM16(左側)の青枠点線のように大文字と小文字が入れ替わりました。数字は変化していません。

注意
どちらのRaspberryPi picoにもUSBから電源を供給します。
スケッチ書き込み時や、動作確認では2枚分のCOM番号が表示されるので、COM番号を間違
えないようによく確認して作業してください。
使用感
UART通信は1対1でおこないます。
評価マイコン基板では使えるUARTのポート数は多くないので、大きなシステムをつくるのは難しいです。
大量のデータ送受信にも不向きですが、通信自体はシンプルでトラブルが起きた時の対処はしやすい。
通信の基礎を抑えるためにも一度は触れておきたい技術です。
準備するもの
用意するもの
使うMCUボード | 用途 |
Raspberry Pi Pico 2枚 | USB対抗通信に使用 |
配線
今回RP2040のUART0を使用します。
マスター側のTX0にはGP0, RX0にはGP1を使用します。
スレーブ側のTX0にはGP1, RX0にはGP0を使用します。
※UARTの対向通信の場合、TXとRXはクロスで接続するので、ピン配置をよく確認してください。
Raspberry Pi Pico (左側) | 配線 | Raspberry Pi Pico (右側) |
GP0 | 青 | GP1 |
GP1 | 黄 | GP0 |

スケッチ
スケッチの説明
マスター/スレーブ
UART通信の場合、マスターとスレーブの関係はありません。
今回行う対向通信では、同じスケッチを使用します。
パソコンからのデータ受信状態を監視し、データを受信したらUART0からスレーブへスルーします。
スケッチ
//Programing by たまねぎ
//【スケッチの説明】
//RP2040 CPU搭載基板で使用できます。
//
//Raspberry Pi pico 同士でUART通信を行います。
//◆◆本スケッチは送信側、受信側共通です。◆◆
//
//パスコンからの読み取り文字を受信側にスルーします。
//送信側から読み取った文字をパソコンへスルーします。
//
//【準備】
//・Raspberry Pi pico を2枚用意します。
//UARTはUART0を使用します。
//送信側のRaspberry Pi pico のUART0 TX にGP0, UART0 RXにGP1を使用します。
//受信側のRaspberry Pi pico には、送信側の配線がクロスするように配線します。
//
//Raspberry Pi pico の送信側と受信側に本スケッチを書き込みます。
//
//【バージョン情報】
// 2022/7/9 : 新規
#define UART0_TX 0 //SDAにはGP0を使用する
#define UART0_RX 1 //SCLにはGP1を使用する
uint32_t i = 0;
void setup()
{
Serial.begin(115200); //パソコン側からの読み取りと書き込みに使用します。
Serial1.setTX(UART0_TX); //もう一方のRaspberry Pi Picoとの通信に使用します。
Serial1.setRX(UART0_RX);
Serial1.begin(115200);
}
void loop()
{
char buf = 0;
//<<送信側としての処理>>
//パソコンからの受信処理と受信側への送信
if(Serial.available() == true)
{
buf = Serial.read();
//ASCコード上で、0b1000 0000ビットが0の時、0b0111 0000 のいずれかが 1なら英文字(正確ではありません。)
if(((buf & 0x80) != 0x80) && ((buf & 0x40) == 0x40))
{
//ASCコード上で 0b0010 0000 のビットを反転させることで、大文字と小文字を入れ替える。
buf = buf ^ 0x20;
}
//受信側へデータを送信する。
Serial1.write(buf);
}
//<<受信側としての処理>>
//送信側からの受信処理と、パソコンへの送信
if(Serial1.available() == true)
{
buf = Serial1.read();
Serial.write(buf);
}
}
コメント