2017-02-19 1 views
1

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?

As can be seen under the "Source" heading of this image of data received by the coordinator, "19" and "106" are the addresses of the routers and there are data packets dropped intermittently

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(); 
} 
+0

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? –

+0

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

+0

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. –

Répondre

0

Bien que vous prétendez être en utilisant 115,200bps, le code affiché montre l'ouverture des ports série à 9600 bauds, certainement pas assez rapide pour 2500 octets/seconde (50 paquets/seconde * 45 octets/paquet * 110% pour frais généraux) reçu de XBee et jeté par printPacket()). Rappelez-vous que 802.15.4 est toujours à 250 kbps en direct, et la configuration du port série du module XBee est juste pour les communications locales avec l'hôte.

Assurez-vous que vos routeurs envoient des paquets monodiffusion (et non diffusés) pour limiter le trafic radio.

Vous devez vérifier que l'envoi fonctionne avant de dépanner le code sur le coordinateur. Mettez à jour le code sur vos routeurs pour voir si vous obtenez un paquet d'état de transmission réussi pour chaque paquet envoyé. Viser 50Hz semble un peu trop - vous essayez d'envoyer 45 octets (est-ce la taille totale de l'image API?) Toutes les 20ms.

Utilisez-vous un port série matériel sur l'Arduino pour le module XBee et Serial.print()? Combien de temps chaque appel à printPacket() prend-il? Si vous réduisez le code printPacket() au strict minimum (le dernier octet de l'adresse de l'expéditeur et l'ID de trame de 1 octet), voyez-vous tous les paquets arriver (une indication que vous passez trop de temps à vider les paquets).

+0

merci de répondre @tomlogic J'utilise un taux de bauds de 115200 pour tous les trois arduino. L'erreur dans le code d'exemple a été rectifiée. L'envoi fonctionne car j'obtiens des messages d'accusé de réception pour les deux routeurs. Mais certains paquets ne sont pas reconnus. Se produit dans environ 2 sur 10 des paquets. (Dans les deux xbees). 50 Hz n'est pas obligatoire, mais le plus haut est le mieux pour moi. J'utilise le logiciel série sur tous les 3 xbees. Même lorsque je réduis le code de printPacket au strict minimum, tous les paquets ne passent pas. – Aniket

+0

Vous imprimez toujours beaucoup d'informations sur chaque paquet reçu (100 caractères * 50 messages = 50kbps d'un maximum de 115,2kbps) - réduisez-le à quelques octets seulement pour les tests. Vous pourriez passer autant de temps à imprimer des paquets que vous êtes en retard. Quelle est la taille des tampons série sur l'Arduino? Pouvez-vous utiliser l'établissement de liaison matérielle (CTS/RTS) pour empêcher les dépassements de tampon? – tomlogic

+0

J'ai réduit le code aux données minimales (8 octets) nécessaires. La taille du tampon série est de 64 octets pour les arduino. J'ai essayé d'augmenter la taille de tampon de l'ONU en utilisant la méthode montrée dans http://www.hobbytronics.co.uk/arduino-serial-buffer-size, mais il perd encore des octets de données. Des idées sur quoi d'autre peut être essayé? – Aniket

0

Je suis préoccupé par le code que vous utilisez en boucle. Je ne connais pas les profondeurs internes de fonctionnement de l'Arduino, mais est-ce que 10ms retardent le blocage des autres codes du traitement des données? Que faire si vous simplifiez:

void loop() 
{ 
    xbee.read(); 
    // Process any complete frames. 
    while (xbee.isComplete()){ 
     Serial.print("\nIncoming Message: "); 
     printPacket(xbee.getIncomingPacketObject()); 
    } 
} 

Mais avant d'aller trop loin, vous devriez isoler le problème serait en connectant le coordinateur à un émulateur de terminal sur un PC pour surveiller la fréquence d'image. Si toutes les images arrivent, il y a un problème sur le coordinateur. Si ce n'est pas le cas, commencez par utiliser le code de votre routeur.

+0

J'ai supprimé le retard dans le code pour le coordinateur, réduit la taille du paquet à 8 octets de charge utile (plus tôt il était de 45, la taille totale des paquets est d'environ 15 octets) même alors il semble tomber obstinément des points de données. La sortie montrée dans le lien dans la publication originale a été prise en utilisant un émulateur de terminal sur un PC connecté à l'Uno avec un bouclier Xbee. Lorsque je connecte directement le coordinateur au PC à l'aide de Xbee Explorer, le charabia s'affiche. C'est peut-être parce que je suis en mode API. Mais je ne peux pas comprendre pourquoi cela ne fonctionne pas. J'en ai besoin pour ma thèse. Toute aide est appréciée. – Aniket

+0

Vous aurez besoin d'afficher les données en hexadécimal pour le comprendre. Surveillez 0x7E comme le début du caractère de trame, suivi par une longueur de deux octets et le type de trame. Comme je l'ai dit, vous devez d'abord confirmer que vous envoyez réellement les données des routeurs avant de passer plus de temps à dépanner le coordinateur. La solution la plus simple consiste à réduire votre taux de rafraîchissement jusqu'à ce que vous obteniez des communications fiables. – tomlogic

+0

Dans un projet de surveillance sur lequel j'ai travaillé, les terminaux ont capturé des données pendant 5 minutes, puis envoyé un seul paquet avec les lectures minimum, maximum et moyenne sur cette fenêtre de 5 minutes. Peut-être que quelque chose de similaire fonctionnerait pour votre projet. – tomlogic