J'ai fait une configuration qui se compose de 3 Zigbee, 2 routeurs (Zigbee S2C) et 1 coordinateur (Zigbee S2). Les routeurs sont chacun connectés à arduino nano qui collecte les données de 2 FSR et d'un IMU (type de trame: demande de transmission zigbee et taille de paquet 46 octets) et l'envoie au coordinateur attaché à un UND arduino. Tous les Xbees sont en mode API 2 et travaillent à un débit de 115200 bauds. J'utilise une bibliothèque appelée "Simple Zigbee Library" pour envoyer toutes les données collectées au Coordinateur. La collecte et l'envoi des données fonctionne bien, sauf qu'il y a des paquets perdus dans le chemin. Les données de l'échantillon de nano à une fréquence d'environ 25Hz indépendamment. Le coordinateur essaie de lire les données envoyées par les zigbees (en utilisant la bibliothèque bien sûr) dans chaque boucle, mais malheureusement, il semble recevoir seulement environ 40-45 échantillons. (Devrait avoir été 25 * 2 = 50 échantillons au total du 2 xbees). Quelqu'un peut-il suggérer pourquoi cela se produit? J'ai besoin de moins de perte de données que possible pour que mon installation atteigne son objectif. Toute forme d'aide est appréciée. P.S: Il peut être important de mentionner que le coordinateur lit les données seulement à partir d'une xbee dans chaque boucle.Pourquoi les paquets de données sont-ils manquants dans l'installation de Zigbee arduino?
Merci.
void setup()
{
// Start the serial ports ...
Serial.begin(115200);
while(!Serial){;} // Wait for serial port (for Leonardo only).
xbeeSerial.begin(115200);
// ... and set the serial port for the XBee radio.
xbee.setSerial(xbeeSerial);
// Set a non-zero frame id to receive Status packets.
xbee.setAcknowledgement(true);
}
void loop()
{
// While data is waiting in the XBee serial port ...
while(xbee.available())
{
// ... read the data.
xbee.read();
// If a complete message is available, display the contents
if(xbee.isComplete()){
Serial.print("\nIncoming Message: ");
printPacket(xbee.getIncomingPacketObject());
}
}
delay(10); // Small delay for stability
// That's it! The coordinator is ready to go.
}
// Function for printing the complete contents of a packet //
void printPacket(SimpleZigBeePacket & p)
{
//Serial.print(START, HEX);
//Serial.print(' ');
//Serial.print(p.getLengthMSB(), HEX);
//Serial.print(' ');
//Serial.print(p.getLengthLSB(), HEX);
//Serial.print(' ');
// Frame Type and Frame ID are stored in Frame Data
uint8_t checksum = 0;
for(int i=10; i<p.getFrameLength(); i++){
Serial.print(p.getFrameData(i), HEX);
Serial.print(' ');
checksum += p.getFrameData(i);
}
// Calculate checksum based on summation of frame bytes
checksum = 0xff - checksum;
Serial.print(checksum, HEX);
Serial.println();
}
avez-vous considéré * collision de paquets * et * corruption de données *? Le protocole de communication est-il suffisamment avancé pour gérer ces situations? –
Ce lien indique que: La radio utilisée par ces modules (couche MAC & PHY) est définie par la norme IEEE 802.15.4 qui spécifie l'utilisation de l'accès multiple Carrier sense avec prévention des collisions ou abrégée CSMA/CA.http://electronics.stackexchange.com/questions/36932/xbee-how-does-it-deal-with-collisions – Aniket
Super, mais j'avais en tête quelque chose de plus haut niveau que ça.* CSMA/CA * peut et ne pourra définitivement pas prévenir les * collisions * dans les bonnes circonstances, bien qu'il soit définitivement préférable de ne pas le faire. Le * protocole de niveau supérieur * doit exiger que chaque paquet soit * accusé de réception *, et forcer l'envoi d'un paquet si aucun * ACK * n'est reçu dans un * timeout * donné. La dernière fois que j'ai travaillé avec * ZigBee *, même si j'admettais que je n'utilisais pas * Arduino *, j'ai dû le faire moi-même. –