Arduino間通信をXBeeで行う

ここでは2台のArduino間通信にXBeeを用いる方法を記します. 今回は1台のArduinoに取り付けられたスイッチが押されたら,もう1台のArduinoに取り付けられたLEDが光る,言うなれば"遠隔LEDスイッチプロジェクト"の作成を通して紹介したいと思います.

準備と概要

今回使用したものはこちら.
  • XBee S2 2台
  • Arduino UNO 2台
  • 有ればXBeeシールド 2台
  • 無ければブレッドボード
  • ジャンパワイヤー
  • プッシュスイッチ
  • LEDと220Ωくらいの抵抗を1つづつ
まずはXBeeのセットアップを行います. セットアップに関しては次の記録を参照ください. XBeeに触る セットアップが完了すれば,2台のXBeeは1対のシリアル通信ケーブルと同じ働きをしてくれるようになります. 例えば,2台のArduino間通信に有線のシリアル通信ケーブルを使用しているとします. このように…
これを次のように置き換えることが出来ます.
XBeeはシリアルケーブルと等価なので,Arduinoで利用しているスケッチ(プログラムコード)は有線の時と全く同じものが使えます. 変わったことは無線化されたこと(付け加えるならば通信の遅延も少し)だけです. それでは詳細を見て行きましょう.

ハードウェア

目標は1台のArduinoのスイッチを押すと,もう1台のArduinoのLEDが光ることです. そこで,2台のArduinoをそれぞれ"スイッチ側Arduino","LED側Arduino"と呼ぶことにします. 配線はシンプルでスイッチとLED,そしてXBeeをそれぞれのArduinoに取り付けるだけです. もし,Seeed StudioのXBeeシールドを使用している場合,ピンヘッダは次の位置にセットします.
後は,スイッチとLEDそれぞれを各ピンとGND間に配置すれば配線は完了です. 下にシールドを用いない場合の配線図を示します. シールドを使用している場合,XBeeから伸びる配線は無視してください. なお,XBeeはどちらがコーディネーター,ルーターでも構いません.

スイッチ側Arduino

XBeeの電源には3.3Vを使用します. 誤って5Vを印加しないよう注意しましょう. XBeeのDOUT(Tx)をArduinoのRxに,DIN(Rx)をTxに接続します. 使用しているスイッチはタクタイルスイッチです. 押している間だけ導通状態となります. プルアップ抵抗はArduino内蔵のものを使用するため,別途用意する必要はありません. プルアップの詳細については後述します.

LED側Arduino

XBeeまわりの配線はスイッチ側と同じです. LEDの電流制限抵抗"R"には220Ωを使用しました. 抵抗とLEDを直列に繋いだものをD3ピンに接続しています.

ソフトウェア

XBeeを使うメリットはシリアル通信を勝手に無線化してくれるところです. そのためArduinoのスケッチは有線(ケーブル使用)時とXBee使用時で全く同じものが利用出来ます. 以下,スケッチを載せますがアップロードする際に注意点があります. 注意点は本章最後に書いてあります.

スイッチ側Arduino

XBee_Switch-side.ino

int BUTTON = 2;

void setup() {
  pinMode(BUTTON, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  // PULLUPされているのでBUTTONが押されるとLOWになる
  if (digitalRead(BUTTON) == LOW) { // BUTTONが押された!
    Serial.print('T'); // 文字'T'を送信
    delay(10); // シリアル通信があふれないよう
  }
}
スイッチ(BUTTON)が押されたら(LOWになったら)文字'T'を送信することにします. 送信にはSerial.printを用います. XBeeは有線(ケーブル)と比べ送受信に時間がかかるため,シリアル通信があふれないようdelayでループの速さを抑制しています.

INPUT_PULLUPについて

pinModeのモード設定をINPUT_PULLUPとすることで,Arduinoに内蔵のプルアップ抵抗を使用することが出来るようになります. これによりスイッチを使ったArduinoプロジェクトに必要な部品点数を減らすことが出来ます. 注意点はボタンを押した時(導通時)がLOWとなる点です. 詳細については公式サイトまたはスイッチサイエンス マガジンの記事をどうぞ.

LED側Arduino

XBee_LED-side.ino

int LED = 3;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) { // データの受信を確認
    if (Serial.read() == 'T') { // 文字'T'を受信した場合
      digitalWrite(LED, HIGH); // LEDを点灯
      delay(1000) // そのまま1秒保持
      digitalWrite(LED, LOW); // LED消灯
    }
  }
}
Serial.availableで受信したデータ量を単位:バイトで得られます. 受信したデータ量が0バイトを超えたら受信データを読み取る処理に入ります(最初のif文). シリアルデータの受信にはSerial.readを用います. もし,受信した文字が'T'ならばLEDを点灯させます(スイッチが押された時に送信される文字のため). LEDは1秒間点灯した後,消灯します.

スケッチをアップロードする時の注意点

Arduinoにスケッチをアップロードする時はXBeeのDOUT(Tx)とDIN(Rx)に繋がる配線を一旦外しましょう(Seeed StudioのXBeeシールドの場合,ジャンパピンを一旦取り外しましょう). シールドを使用している場合はシールドごと外しても良いでしょう. このシリアル通信線を外さないと,USBケーブルを通ってきたスケッチのバイナリコードがXBeeにも入り込み,混乱を起こしてしまいます(アップロードエラーの原因となります). スケッチをアップロードする時だけは必ずXBeeとのシリアル通信を切断しましょう.
以上"遠隔LEDスイッチプロジェクト"の完成です. スイッチを押すと,LEDが1秒間光るはずです. XBeeとシリアル通信の相性の良さが伺えます. 今回はスイッチを使用しましたが,CdSセルのように明るさを検知するものや,ガスを検知するセンサーを使用しても面白いでしょう. また,LEDでは無くDCブザーを取り付け,音を鳴らすのも良いでしょう. Serial.readで受け取ったデータに応じて,任意のデータをSerial.printで返信させることも可能なので,Arduino同士が自律的にメッセージ(シリアルデータ)をやりとりすることも出来ます. この様に,XBeeを使えば様々なプロジェクトを無線化出来ます.
4425221404420755216 http://www.storange.jp/2017/05/arduinoxbee.html http://www.storange.jp/2017/05/arduinoxbee.html Arduino間通信をXBeeで行う 2017-05-01T10:30:00+09:00 http://www.storange.jp/2017/05/arduinoxbee.html Hideyuki Tabata 200 200 72 72