マイコン同士のUART通信

コンピュータ、組み込み

手軽で有名な通信方法として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
(右側)
GP0GP1
GP1GP0

スケッチ

スケッチの説明

マスター/スレーブ

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);
  } 
}

関連リンク

コメント

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