2016年3月11日金曜日

ArduinoのSerial通信を複数ポートで行う方法と注意点


分かったらスッキリだったので、情報を共有します。

目的

ArduinoNANOやArduinoUnoなど、複数のハードウェアシリアルのポートをを持たないArduinoで、複数ポートでシリアル通信がしたい。

方法

同時に通信しないのであれば、SoftwareSerialを使って実現できます。

注意点

SoftwareSerialは複数同時にデータ受信状態になれない

シリアル通信を複数同時に受信状態にしたい場合は、ArduinoMEGAなどのハードウェアシリアルのポートを複数持つArduinoを使う必要があります。

SoftwareSerialを複数利用する場合、データを受信する前にlisten()を呼ぶ必要がある

listen()でデータを受信するシリアルを切り替えます。
#include <SoftwareSerial.h>

SoftwareSerial soft_serial_1(8, 9);  // rx, tx
SoftwareSerial soft_serial_2(10,11); // rx, tx

uint8_t buff[256];

void setup() {
  soft_serial_1.begin(4800);
  soft_serial_2.begin(9600);
}

void loop() {
  int i;
  int received_data_size = 0;

  // switch to listen soft_serial_1
  soft_serial_1.listen();

  soft_serial_1.println("send me data.");
  for (i = 0; i < 255; i++){
    if (soft_serial_1.available()) {
      buff[received_data_size] = soft_serial_1.read();
      received_data_size++;
    }
  }

  // switch to listen soft_serial_2
  soft_serial_2.listen();
  soft_serial_2.print("I received ");
  soft_serial_2.print(received_data_size);
  soft_serial_2.println(" bytes");
  for (int i = 0; i < received_data_size; i++){
     soft_serial_2.print(buff[i], HEX);
     soft_serial_2.print(" ");
  }
  soft_serial_2.println();

  delay(2000);
}

以上です。
この方法で事足りるのであればMegaを使わなくても3つ以上のシリアルポートを使えます。

参考

Arduino Uno with Multiple Software Serial Devices

参考商品

安いPro Micro
5個セット2500円位です。
SparkFunが作ったArduino Leonardoとの互換機なので、Leonardoとして使えます。
別途microBケーブルが必要です。

安いArduinoNANO
5個セットで1600円位です。
本家と違うシリアル通信モジュールを使っているため、ドライバの設定に苦労するかもしれません。
そういう苦労をしたくない場合は、Pro Microがおすすめです。
不良品である可能性がまあまああるため、利用する場合は1個ではなく複数購入をお勧めします。
別途miniBケーブルが必要です。

安いArduinoMEGA
ケーブルがついて2900円位です。
日本のAmazonで在庫を管理している形式だったので、注文した翌日に届きました。

更新情報

20161130
begin() end()を度々呼び出すのではなく、データ受信前にlisten()を呼ぶ形式に変更しました。
rx, txの設定が逆だったので、修正しました。

2017.10.25
参考商品にProMicroを追加しました。

2018.1.27
文章の組み立て方が気になる部分があったので、修正しました。

2020.03.10
言い回しが気になった文章を更新しました。

0 件のコメント :