2台のArduinoでシリアル通信(UART通信)により親機から子機にデータ送信

複数台のArduinoでシリアル通信 Arduino

はじめに

多数のデバイスを操作するため,複数台のArduinoを使い,Arduino同士を通信させたくなることがあります。

この記事では,2台のArduino UNOを使ってシリアル通信 (の一種であるUART通信) で親機から子機に 1 バイト(0~255)の値を送ってみます。

準備

配線

配線はシンプルであるため,配線図は省略します。

Arduino同士の接続

Arduino Uno のデジタルピンD0にRX,デジタルピンD1にはTXとボードに記載されています。

親機のD0を子機のD1に,親あ機のD1を子機のD0に接続します。

Arduinoとサーボモータの接続

親機のデジタルピンD5, D6 および子機のデジタルピンD7, D8 に4台のサーボモータを接続します。サーボモータの電源は外部から供給します。

スケッチ

スケッチは こちらのサイト様 を参考にさせていただきました。

また,サーボモータの動くスピードを調整できる VarSpeedServo.h というライブラリを使用しています。

【親機(送信)側スケッチ】

#include <VarSpeedServo.h>

VarSpeedServo myservo1;
VarSpeedServo myservo2;

uint8_t flg = 11;

void setup(){
  myservo1.attach(5);
  myservo2.attach(6);
  Serial.begin(9600);
}

void loop(){

  if(flg == 11){ 
    myservo1.write(180, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete
    myservo1.write(0, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete    

    //delay(5000);
    flg = 12;
    Serial.write(255);    //header data '255'
    Serial.write(flg);
    Serial.print("flg=");
    Serial.println(flg);

    delay(4500);
    flg = 13;
    Serial.write(255);    //header data '255'
    Serial.write(flg);
    Serial.print("flg=");
    Serial.println(flg);

  }else if(flg == 13){
    myservo2.write(180, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete
    myservo2.write(0, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete

    //delay(5000);
    flg = 14;
    Serial.write(255);    //header data '255'
    Serial.write(flg);
    Serial.print("flg=");
    Serial.println(flg);

    delay(4500);
    flg = 11;
    Serial.write(255);    //header data '255'
    Serial.write(flg);
    Serial.print("flg=");
    Serial.println(flg);

  }
}

【子機(受信)側スケッチ】

#include <VarSpeedServo.h>

VarSpeedServo myservo3;
VarSpeedServo myservo4;

void setup(){
  myservo3.attach(7);
  myservo4.attach(8);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()){
    uint8_t data=Serial.read();           // 1バイト読み込み変数dataに格納
    Serial.print("data=");
    Serial.println(data);
    if(data==0xFF){  // dataが255ならば以下の処理
      uint8_t flg=Serial.read();
      Serial.print("flg=");
      Serial.println(flg);
      if(flg == 12){ 
        myservo4.write(180, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete
        myservo4.write(0, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete
      }else if(flg == 14){
        myservo3.write(180, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete
        myservo3.write(0, 30, true);        //write(X, V, true); move to X degrees, use a speed of V, wait until move is complete
      }
    }
  }
  delay(10);
}

if文で flg の値に応じて条件分岐させ,動かすサーボモータを変えています。ただ,今の書き方では子機の動作が終わるのを子機からの動作完了信号を親機が受けるのではなくdelayで待っているだけなので,条件分岐するまでもないです。

ゆくゆくは双方向通信(※)をやりたい(今回もやろうとしたのですがうまくいかなかった)ので,条件分岐させる今の書き方を残しています。

(※)やりたいのは,「親機側のServo1を動かす。完了後,子機に完了を知らせる」→「子機側のServo3を動かす。完了後,親機に完了を知らせる」→「親機側のServo3を動かす。完了後,子機に完了を知らせる。」→・・・ という動作です。

動作確認

このスケッチで動かしてみた結果が以下となります。

最後に

2台のArduino UNOを使ってシリアル通信で親機から子機に 1 バイト(0~255)の値を送信できることを確認しました。今後は双方向通信をやってみたいと思います。

コメント

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