XbeeでPC-Arduino間1対1通信を行う

PCとArduinoにそれぞれXbeeを繋ぎ、通信を行います。
初めてXbeeに触ったので、セットアップ方法をまとめてみました。

# Xbeeとは
Digi Internatinal社製の、ZigBee規格対応無線モジュールです。
低い消費電力で稼働でき、複数台との同時接続・送受信を行うことができます。
![Xbee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/b02dd30a-5304-6ae2-5da8-a969f1b0e145.png)

# 材料
- [Arduino UNO](http://akizukidenshi.com/catalog/g/gM-07385/) × 1
- Xbee ZB × 2（私は[2SCタイプ](http://akizukidenshi.com/catalog/g/gM-10072/)を使用しました）
- [Xbee USB インターフェースボードキット](http://akizukidenshi.com/catalog/g/gK-06188/) × 1
- [Xbee用2.54mmピッチ変換基板](http://akizukidenshi.com/catalog/g/gP-05060/) × 1
- [BME280使用　温湿度・気圧センサー](http://akizukidenshi.com/catalog/g/gK-09421/) × 1
- ブレッドボード
- ジャンパーワイヤ
- モバイルバッテリー

# 環境
- MacOS High Sierra 10.13.6
- Arduino IDE 1.8.5
- XCTU 6.4.3

# 基本動作
## 設定
①PC側と②Arduino側、それぞれのXbeeの設定を行っていきます。

### ①PC側Xbeeの設定（1/2）
USBインターフェースボードに①PC側Xbeeを嵌め込み、PCと繋ぎます。
XCTUを開いて、左上のAdd Devicesボタンをクリックします。
<img width="1025" alt="AddDevices.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/ee2637a9-59f7-cec8-fdd8-d5908b724e23.png">
すると、次のような画面が出ますので、Xbeeが接続されているポートを選んでFinishを押します。
<img width="1023" alt="PortSelect.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/c38316a3-c7d9-c94c-5bbf-2e72b4d3c6b3.png">
検索しているようなポップアップが出た後、下のような画面になります。
接続されているデバイスをクリックします。
<img width="1025" alt="DeviceList.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/cd87ac17-3c04-a1fe-212c-6683cda46dc7.png">
右に項目が表示されます。
<img width="1021" alt="スクリーンショット 2019-08-06 13.15.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/5348daa8-ccd8-f3b1-8da3-922316d8e201.png">

今回は、▼Networking下の一部の項目を書き換えましょう。

| 項目名 | 項目正式名称 | 変更前 | 変更後 |
|:----------------:|:-----------------:|:------------------:|:------------------:|
| ID | PAN ID | 0 | 7<br>（なんでもいいです） |
| CE | Coordinate Enable | Disabled[0] | Enabled[1] |

書き換えたら、上のWriteボタンを押すと変更が反映されます。
ReadやUpdateボタンではないので注意してください。
<img width="376" alt="Write.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/37655feb-c206-7a8e-527e-85c1b6c0cc65.png">
Writeが終了すると、左側のアイコンがRからCという表記に変わっていると思います。
<img width="539" alt="CE.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/28088570-7c02-8933-74b9-2f51efb6321a.png">


また、▼AddressingのSH（Serial Number High）とSL（Serial Number Low）の値をメモに控えておいてください。
USBケーブルを抜いてから①PC側Xbeeを外します。
後でもう一度設定が必要になります。

### ②Arduino側Xbeeの設定
USBインターフェースボードに②Arduino側Xbeeを嵌め込み、PCと繋ぎます。
右側に項目を出すまでは先ほどと同じなので、割愛します。
下の表の項目を書き換えてください。

▼Networking(今回CEは変更しません)

| 項目名 | 項目名正式名称 | 変更前 | 変更後 |
|:-:|:-:|:-:|:-:|
| ID | PAN ID  |  0 |  7<br>（①と合わせてください） |
▼Addressing

| 項目名 | 項目名正式名称 | 変更前 | 変更後 |
|:-:|:-:|:-:|:-:|
|  DH | Destination Address High  |  0 |  ①のSH<br>（13A200になると思います） |
|  DL | Destination Address Low  | 0  | ①のSL  |

書き換えたら、Writeで反映させます。
また、先程と同じように、SHとSLをメモに控えましょう。

②Arduino側Xbeeの設定はこれで終了です。
USBインターフェースボードから外し、2.54mmピッチ基板に差し込んでおいてください。

### ①PC側Xbeeの設定（2/2）
①PC側Xbeeをもう一度USBインターフェースに嵌め込み、DHとDLを書き換えます。
▼Addressing

| 項目名 | 項目名正式名称 | 変更前 | 変更後 |
|:-:|:-:|:-:|:-:|
|  DH | Destination Address High  |  0 |  ②のSH<br>（13A200になると思います） |
|  DL | Destination Address Low  | 0  | ②のSL  |

この2つを書き換えたら、Writeで反映させます。
これで①PC側Xbeeの設定も終了です。
①PC側XbeeはそのままUSBインターフェースボードに差し込んだままにしておいてください。

## Arduinoプログラム書き込み
Arduino UNOをPCに繋ぎ、以下のプログラムを書き込みます。
5文字受信したら受信内容を返すプログラムです。

```c:xbee_test.ino
void setup() {
  Serial.begin(9600);
}

void loop() {
  char receiveData[5];
  if (Serial.available() > 5) {
    Serial.readBytes(receiveData, 5);
    Serial.println("");
    Serial.print("Receive data:");
    Serial.println(receiveData);
  }
}
```
書き込みが終了したら、UNOはPCから外してモバイルバッテリーに繋ぎます。

## 配線
配線をします。
①PC側XbeeはUSBインターフェースボードに載っていれば大丈夫なので、
Arduino UNOと、2.54mmピッチ変換基板に載った②Arduino側Xbeeの配線をします。
![MicrosoftTeams-image (50).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/b4134528-b5d2-c412-1029-a0a667d6659a.jpeg)

| Arduino UNO | ②Arduino側Xbee |
|:-:|:-:|
|  3.3V |  VCC(1) |
|  RX(D0) | TX(2) |
|  TX(D1) | RX(3) |
|  GND |  GND(10) |
配線ができたら、モバイルバッテリーの電源を入れてUNOとXbeeを起動させます。

## 通信テスト
①PC側XbeeをPCに繋ぎ、XCTUで右上のコンソールボタンをクリックします。
その後、Closeという表示になれば接続完了です。
<img width="846" alt="Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/426b3ef7-4027-7b93-6c62-84a172ba5aa9.png">
右側がこのような画面に切り替わりますので、左上のOpenというボタンを押します。
<img width="697" alt="Open.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/235a8450-406b-15fb-1263-0e252bd033d0.png">
<img width="713" alt="Close.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/2b63f8c0-5017-d6a8-257e-34ce3dc5d8f4.png">
Console log内に文字を入力すると、レスポンスが返ってきます。
青字が送信した文字列、赤字が受信した文字列です。
これで基本的な接続ができました。
<img width="707" alt="スクリーンショット 2019-08-07 15.58.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/b42add9c-e3ed-441e-8ac5-3ff3d8456ef3.png">

# Arduinoに繋がれたセンサーのデータをPCで受信する
温湿度・気圧センサーBME280で、現在の室温、湿度、気圧を測定してXbee経由で受信します。

## Arduinoプログラム書き込み
SparkfunのBME280のライブラリをダウンロードし、Arduino IDEにインクルードしておきます。
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library

Arduino UNOに以下のプログラムを書き込みます。
5秒ごとに室温、湿度、気圧を送信するプログラムです。
※UNOとXbeeのTX,RXを繋いでいると書き込みができないので、書き込む際には一瞬ジャンパーワイヤを外してください！

```c:BME280_info.ino
#include <Wire.h>
#include "SparkFunBME280.h"

BME280 sensor;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  sensor.beginI2C();  // I2C通信開始
}

void loop() {
  // 温度
  Serial.print("Temperature: ");
  Serial.print(sensor.readTempC(), 2);

  // 湿度
  Serial.print(" Degree, Humidity: ");
  Serial.print(sensor.readFloatHumidity(), 2);

  // 気圧
  Serial.print(" Percent, Pressure: ");
  Serial.print(sensor.readFloatPressure() / 100.0, 1);
  Serial.println(" hPa");

  delay(5000);
}
```
書き込み後はXbeeのTX,RXピンを繋ぎ直し、モバイルバッテリーから電源を取るようにしてください。

## 配線
配線をします。
I2C通信を使用するため、BME280のJ1,J2,J3は全てはんだジャンパーをしておいてください。
![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/e7a60c02-73a1-3fa1-9841-6025152cb1d8.png)

| Arduino UNO | BME280 |
|:-:|:-:|
| 3.3V  | VDD  |
| GND  | GND  |
| -  |  CSB |
| SDA  | SDI  |
|  3.3V | SDO  |
|  SCL | SCK  |


## 通信テスト
先程の要領で①PC側XbeeをPCに繋ぎ、XCTUでコンソールを開きます。
このように、5秒ごとに室温、湿度、気圧を受信します。
<img width="704" alt="スクリーンショット 2019-08-07 16.51.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/c5a09520-bc74-11d3-0ba7-04099a8e1fef.png">

# まとめ
簡単に扱えるので、複数台構成のちょっとしたシステムを作って試すのにとても良さそうです。
今後、複数台での使用方法も調べていきたいと思います。