マイコン同士のIR UART通信

コンピュータ、組み込み

IR(赤外線)LEDとフォトトランジスタを入手しました。
UARTの出力と入力を赤外線に変えて無線通信をします。

やること

概要

Raspberry Pi Pico のUARTの信号をIR(赤外線)に変換し通信をします。
結果は[パソコン同士のUART通信]と同じですが、通信の過程にIRが含まれます。

パソコンから232Cでデータを受信します。
受け取った側は英文字列なら大文字/小文字の変換をして受信側へ送信します。

送信側はUARTのTX信号をIR LEDへ出力します。
受信側はフォトトランジスタで受光した信号をUART RXで受信します。

UARTから受け取ったデータは、そのままパソコンへ送信します。
双方同じスケッチを書き込むことで下図動作が完成します。

反対のパソコンからデータを送信した場合も同じ動作になります。

結果

UARTの通信ができました。
COM58(左側)から入力したデータ(赤枠)が、COM90(右側)赤枠点線のように大文字と小文字が入れ替わりました。数字は変化していません。

UARTの通信速度(Baudrate)は低速の300bpsまで落としています。

下の波形はBaudrateを変更して通信したときの波形です。送信側のTX(青)と受信側のRX(黄)をモニタしています。左側の波形は300bps、右は1200bpsです。

300bpsの波形 時間軸は5ms/Div
1200bpsの波形 時間軸は1ms/Div

受信の黄色の立下りに傾きが見えていて、1200bpsではボトムまで到達しきっていないように見えます。信号としてLoが成立していないようです。
1200bpsでは、下図のように文字化けが発生しました。

使用感

特別な用途としてのものではありません。
Baudrateも遅いので、大容量の転送にも向きません。
使用したLEDはレーザではないので、LEDとフォトトランジスタの位置関係が悪いと受光できないなど工夫が必要です。
実用性はいまいちですが、実験として工夫するという意味では楽しめます。

準備するもの

用意するもの

名称(型番)用途
Raspberry Pi Pico 2枚対向通信に使用
IR LED
2個
光ってもらいます
IR フォトトランジスタ
2個
受けてもらいます
ブレッドボード
400穴
部品の実装
抵抗 200Ω
2個
LEDの保護

配線

今回RP2040のUART0を使用します。
配線表は1セット分記載していますが、同じ配線を2セット分作ります。
IR LEDとフォトトランジスタが向かい合う位置関係になるように配線します。

Raspberry Pi Pico配線IR LED配線IR フォトトランジスタ
3.3VCollector(短ピン)
GND200Ω抵抗 + Cathode(短ピン)
GP0Anode(長ピン)
GP1Emitter(長ピン)

スケッチ

スケッチの説明

今回行う対向通信ではRaspberry Pi Picoを2枚使用しますが、どちらにもに同じスケッチを使用します。
UART Baudrateの変更があります。(スケッチ中にコメントあり)

パソコンからのデータ受信状態を監視し、データを受信したらUART0のTXから送信します。
UART0のRXのデータ受信状態を監視し、データを受信したらパソコンへ送信します。

スケッチ

//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 : 新規
// 2022/7/30 : IR UART用にBaudrateを 300bpsまで低下

#define UART0_TX   0               //SDAにはGP0を使用する
#define UART0_RX   1               //SCLにはGP1を使用する

uint32_t i = 0;

void setup() 
{

  Serial.begin(115200);           //パソコン側からの読み取りと書き込みに使用します。
                                  //このボーレートはIR通信とは関係ない。

  Serial1.setTX(UART0_TX);        //もう一方のRaspberry Pi Picoとの通信に使用します。
  Serial1.setRX(UART0_RX);
  Serial1.begin(300);             //UARTボーレートはここの値を変更する
}

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をコピーしました