XBeeで通信する際の値の安定とポート

XBeeで通信する際に値を安定させるには十分なdelay()を挟むこと.

Windowsだけかも.環境については下記に)XBeeのポート(not XBee SHIELD)はCOM5.
デバイスマネージャーを開くと分かりやすい.

 

問題

  1. XBeeのポートがどれか分からない
  2. XBee SHIELDを載せるとシリアル/無線通信共に値が乱れる

 

環境

 

解決

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()を挟むこと.

XBeeのポート(not XBee SHIELD)はCOM5(デバイスマネージャーを開いて確認).