LoginSignup
0
1
この記事誰得? 私しか得しないニッチな技術で記事投稿!

SoftwareSerialを複数使いするならMultiUARTライブラリーを使え!!

Last updated at Posted at 2023-07-08

Arduino UNOの複数使いを考えていて
CANかRS485でつなぐのが理想だと思いますが
部品増えるのが面倒なのでSoftwareSerialの複数使いを試してみた

WS000418.png

プログラムして試してみると
WRITEは3つとも行うが
READは1つしかできない
色々試してみたが解決せず
ChatGPTに聞いてもダメ
次に
FacebookグループのArduinoファンに書き込みしてみた
https://www.facebook.com/groups/1547944695219684
すると早速コメントが2つついた
1つはElegoo製のArduinoボードを使うと良いよって記事の紹介
https://burariweb.info/electronic-work/arduino-learning/arduino-software-serial.html?fbclid=IwAR2FyxVfcnv3DARzlA9AH2T4w-ViGQSuUBsogZj6wfCZnMn9rEHuQAatrB0#i-6

もう一つはMultiUARTライブラリーについて書いてるGitHubの紹介
https://github.com/askn37/MultiUART?fbclid=IwAR39XSGLSpPVSvyCaKQMv0IzJT-iLSLIIBCRu3D4XBmgcnhUwk7AnaVl0Hk

ボード買うのは金も時間もかかるので
最終手段としてGitHubで紹介している
MultiUARTライブラリーを試すことにした

注意事項

MultiUARTのReadmeにかいてある注意事項を抜粋

1.ただし4つのUARTが、必ずしも同時に、完全に、扱えるとは限らない。
  MCUの処理能力(CPUクロックや割込頻度)によっては受信データの欠落が発生しうる。
  合算帯域は 38400 を超えるべきではない。

2.ボーレートのより高い UARTデバイスには優先的に begin() を発行して利用開始することが望ましい。
  ただし stopListening() と listen() を繰り返したのちの、優先保証はされない。

3.指定可能なボーレート
  begin() に指定できるボーレートは、通常の使用範囲では 9600(bps)が最大である。
  実用上の最小値は 768(bps)で、その間には 19200 の約数が指定できる。

ボーレートの値は下記の13種類
9600 6400 4800 3840 3200 2400 1920 1600 1280 1200 960 800 768

 
 ※HOさんのアドバイスにより追記

導入までの手順

1.README.mdファイル内にある
  Arduino IDE への導入部分のClick hereをクリックし
  ZIPアーカイブをダウンロードする。
2.ライブラリマネージャで読み込む
 ※ライブラリーの管理で検索しても出てきませんでした。
3.スケッチ

プログラム

3つのシリアルのピンは
SPI,I2C,INT0,INT1を追加で使うことを想定して下記の通りにした

MultiUART mySerial1(4, 5); // RX, TX
MultiUART mySerial2(6, 7); // RX, TX
MultiUART mySerial3(8, 9); // RX, TX

ポートレートは最大9600と書いてたのですべて9600にした

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // Set baud rate for SoftwareSerial ports
  mySerial1.begin(9600);
  mySerial2.begin(9600);
  mySerial3.begin(9600);

実際に試したプログラムも備忘録として残します。

#include <MultiUART.h>

MultiUART mySerial1(4, 5); // RX, TX
MultiUART mySerial2(6, 7); // RX, TX
MultiUART mySerial3(8, 9); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // Set baud rate for SoftwareSerial ports
  mySerial1.begin(9600);
  mySerial2.begin(9600);
  mySerial3.begin(9600);
}

void loop() // run over and over
{
  // Check if there is any data available on the main serial port
  if (Serial.available()) {
    // Read the data
    char data = Serial.read();

    // Write the same data to the three SoftwareSerial ports
    mySerial1.write(data);
    mySerial2.write(data);
    mySerial3.write(data);
  }

  // Check if data is available to read from the SoftwareSerial ports
  // and print to the main serial monitor
  if (mySerial1.available()) {
    char data1 = mySerial1.read();
    Serial.print("Data on MultiUART1: ");
    Serial.println(data1);
  }

  if (mySerial2.available()) {
    char data2 = mySerial2.read();
    Serial.print("Data on MultiUART2: ");
    Serial.println(data2);
  }

  if (mySerial3.available()) {
    char data3 = mySerial3.read();
    Serial.print("Data on MultiUART3: ");
    Serial.println(data3);
  }
}

動作テスト

動作テストは同じボードを2つ、PC2台を用意して
すべての組み合わせを行った
結果3つのシリアルポートで読み込めた

WS000416.png

最後に

最近はChatGPT4でプログラムもしていて
今回の件も聞いてみても答えは出なかった
先人の知恵を借りることになりました。
早めにあきらめてArduinoファンで聞いたことで
沼にはまる直前で回避できました。(ちょっとはまってたかも?)
教えていただいたKAさんに感謝です。
viva緩いつながり

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1