XBeeで通信する際の値の安定とポート
XBeeで通信する際に値を安定させるには十分なdelay()を挟むこと.
(Windowsだけかも.環境については下記に)XBeeのポート(not XBee SHIELD)はCOM5.
デバイスマネージャーを開くと分かりやすい.
問題
環境
共通
- Arduino Uno
- XBee SHIELD(恐らくこれ Arduino - ArduinoWirelessProtoShield)
2種類の環境
解決
1. XBeeのポートがどれか分からない
環境その2では分かりやすく /dev/ttyUSB0 と出て来たので問題なし.
環境その1ではArduino Unoは COM4 に (Arduino Uno) と表示があるから,SHIELDもあるのかと思いきや,見当たらなくて,どれがポートか分からなかった.
デバイスマネージャーを開くと USB Serial Port(COM5) と表示されて判別できた.
2. XBee SHIELDを載せるとシリアル/無線通信共に値が乱れる
値が乱れるスケッチと乱れないスケッチを下記に.
A0と5V, GNDを繋いで1023, 0になるかをシリアルモニタで確認する.
- 値が乱れるスケッチ
void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: /* char ch[100]; sprintf(ch, "%d", analogRead(A0)); Serial.println(ch); /**//* int val = analogRead(A0); Serial.println(val); /**/ Serial.println(analogRead(A0)); /**/ delay(100); }
- 値が乱れないスケッチ
void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: /* char ch[100]; sprintf(ch, "%d", analogRead(A0)); Serial.println(ch); /**/ int val = analogRead(A0); Serial.println(val); /**//* Serial.println(analogRead(A0)); /**/ delay(200); }
相違点
- analogRead(pin)の返却値を直接Serial.println()に流すか
- delay(ms)のms
analogRead()についてはよく分からず.
変数に格納するかどうかに関係なく,analogRead()を処理→Serial.println()の処理,のはずだけれど,組み込みだったらそのあたりがもしかしたら違うのかも?
また,通信でXBeeが値を使用していてバニッシュしているのかと思ったけれど,そうではなく,通信で何かしらのデータを加えていて,Arduinoだけの場合よりも通信データが増えてバッファオーバーフローしている可能性が濃厚.
だからdelay()を挟まなければ,いくつかのビットが消えて安定しているはずが,シリアルモニタでは不安定になってしまう.
sprintf(p, str, n)で文字列にすると安定した場合もあったけれど,それは幻想だった().
sprintf()の処理時間分だけdelay()が増えた感じになるからだと思われる.
* よく分からない,あっているかも分からない謎の計算 *
シリアル通信は9600bpsで行っている.
変数はbyte単位なので,
9600bps / 8bit = 1200 byte per second
Serial.println()では引数は文字列に変換されるので,最大1023の4桁(byte).
Serial.println()の改行を含めて,
1200 byte per second / (4 + 1) byte = 240回/秒
フレームレートが60fpsなら余裕そうだけど……?
結論
XBeeで通信する際に値を安定させるには十分なdelay()を挟むこと.