XBeeのAPIモードでメッセージを送信する(PIC)

はじめに

以前、Xbeeの子機で読み取ったセンサー値を親機へ送信していたが、任意のメッセージを送信する方はやっていなかったなと思い、挑戦してみることにした。ArduinoかPICが選択肢としてはあるが、PICでの実装にも慣れてきたのでこちらでやってみる。

今回用意するもの

  • PIC16F628A
  • XBee S2C * 2

XBeeAPIモードでフレームを送信するには

XBeeで送受信するには、透過モードとAPIモードがあるので、後者でやってみることにする。
APIモードでメッセージをコーディネータに送信するには、PIC側でAPIフレームを作成する必要がある。最初XBeeのRXとPICのTXを繋ぐだけでシリアル通信が可能になるのかなと思ったが、ウンともスンとも言わなかった...

どうしたものかなと思い、digiのサイトを見に行ったら詳しく説明されていた。
送信フレームを作成してXBeeに送れば、あとはよしなにやってくれるらしい。

www.digi.com

APIフレームの作成

あとは送信フレームを作成すればいいだけなので、送信フレームがどんなフォーマットなのかを調べる。

www.digi.com

フレーム構造はわかったが、具体的にどういう風に値をセットすれば送信してくれるのかまではわからない。 が、そこもちゃんと説明しているページがあった。親切。

www.digi.com

この中の、フレーム作成の手順を参考にXCTUでフレームを作成してみる。
それをPICから送信してみると、XBeeの親機で正常に受信することが確認できた。 ここで作成するフレームはチェックサムも計算済なので、PICから送信するフレームの妥当性を検証する際にも大変役に立った。
※ ちなみに色々なフレームの種類を選択可能なので、XCTUのフレーム作成がベースになると思う。

www.digi.com

実装

こんな感じでAPIフレームを作成して送信すればOK

gist.github.com

回路図

電源とTX/RXを相互につないだだけのシンプルな構成。

f:id:kyonta1022:20211105222610p:plain

確認

送信されるフレームをXCTUで確認する。

f:id:kyonta1022:20211105223459p:plain

Receive Packet (API 1)

7E 00 19 90 00 13 A2 00 41 7D 50 31 24 A4 01 48 45 4C 4C 4F 20 31 36 46 36 32 38 41 90

Start delimiter: 7E
Length: 00 19 (25)
Frame type: 90 (Receive Packet)
64-bit source address: 00 13 A2 00 41 7D 50 31
16-bit source address: 24 A4
Receive options: 01
RF data (HEX): 48 45 4C 4C 4F 20 31 36 46 36 32 38 41
RF data (ASCII): HELLO 16F628A
Checksum: 90

実際に受信したパケットを何かの処理に利用する場合は、こちらにあるような実装を行えばいい。

kyonta1022.hatenablog.com

まとめ

最初、APIモードでフレーム送信している記事を色々見ていたのだが、ソースがなかったり個人ライブラリ前提だったりで、見てパッとできそうな記事に出会えなかったけど、digiのサイトにExampleがあったのは大変良かった。XBeeAPIモードで任意の文字列を送ってやりとりするのは、今後も多用しそう。