2017-02-19 5 views
1

Я сделал установку, состоящую из 3 маршрутизаторов Zigbee, 2 маршрутизаторов (Zigbee S2C) и 1 координатора (Zigbee S2). Каждый маршрутизатор подключается к arduino nano, который собирает данные из 2 FSR и IMU (тип кадра: запрос передачи zigbee и размер пакета 46 байтов) и отправляет его координатору, прикрепленному к arduino UNO. Все Xbees находятся в режиме API 2 и работают со скоростью в 115200. Я использую библиотеку под названием «Simple Zigbee Library», чтобы отправить все собранные данные Координатору. Сбор и отправка данных прекрасно работает, за исключением того, что пакеты потеряны. Данные образца нано на частоте около 25 Гц независимо. Координатор пытается прочитать данные, отправляемые от зигбеков (используя библиотеку, конечно) в каждом цикле, но, к сожалению, он, кажется, получает только около 40-45 выборок. (Должно быть 25 * 2 = 50 выборок всего из 2 xbees). Кто-нибудь может предположить, почему это происходит. Мне нужно как можно меньше потери данных для моей установки, чтобы достичь ее мотива. Любая помощь приветствуется.Почему пакеты данных отсутствуют в настройке Zigbee arduino?

P.S: Возможно, важно отметить, что координатор считывает данные только с одного xbee в каждом цикле.

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

Спасибо.

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

Вы считаете * столкновение * и * повреждение данных *? Является ли протокол связи достаточным для обработки этих ситуаций? –

+0

Эта ссылка говорит, что: Радио, используемое этими модулями (уровень MAC и PHY), определяется стандартом IEEE 802.15.4, который определяет использование множественного доступа с поддержкой Carrier с предотвращением столкновений или сокращенно CSMA/CA.http://electronics.stackexchange.com/questions/36932/xbee-how-does-it-deal-with-collisions – Aniket

+0

Отлично, но я имел в виду нечто более высокое, чем это.* CSMA/CA * может и окончательно не сможет предотвратить * столкновения * при правильных обстоятельствах, хотя это, безусловно, лучше иметь его, чем нет. Протокол * более высокого уровня * должен требовать, чтобы каждый пакет был * подтвержден * и принудительно отправлял пакет, если в течение * таймаута * не принимается * ACK *. В прошлый раз я работал с * ZigBee *, хотя я признаю, что не использовал * Arduino *, я должен был реализовать это сам. –

ответ

0

Хотя вы утверждаете использовать 115200 бит, размещенном код показывает открытие последовательных портов со скоростью 9600 бод, безусловно, не достаточно быстро для 2500 байт/секунду (50 пакетов/секунду * 45 байт/пакетов * 110% для накладных расходов), полученных от XBee и сбрасываемых printPacket()). Помните, что 802.15.4 всегда 250 кбит/с по воздуху, а конфигурация последовательного порта модуля XBee предназначена только для локальной связи с хостом.

Убедитесь, что ваши маршрутизаторы отправляют одноадресные (а не широковещательные) пакеты, чтобы поддерживать радиопередачу.

Вы должны убедиться, что отправка работает до устранения неполадок кода координатора. Обновите код на маршрутизаторах, чтобы узнать, есть ли у вас успешный пакет состояния передачи для каждого отправленного пакета. Наведение на 50 Гц кажется немного большим - вы пытаетесь отправить 45 байт (это полный размер рамки API?) Каждые 20 мс.

Вы используете аппаратный последовательный порт на Arduino для модуля XBee и Serial.print()? Сколько времени занимает каждый звонок до printPacket()? Если вы уменьшите код в printPacket() до минимального минимума (последний байт адреса отправителя и 1-байтовый идентификатор кадра), видите ли вы, что все пакеты проходят (указание, что вы тратите слишком много времени на сброс пакетов).

+0

спасибо за ответ @tomlogic Я использую скорость в бодах 115200 для всех трех ардуино. Ошибка в примере кода была исправлена. Посылка работает, поскольку я получаю сообщения подтверждения для обоих маршрутизаторов. Но некоторые из пакетов не признаются. Происходит примерно в 2 из 10 пакетов. (В обоих xbees). 50 Гц не является обязательным, но чем выше, тем лучше для меня. Я использую серию программного обеспечения на всех 3 xbees. Даже когда я уменьшаю код в printPacket до минимума, все пакеты не проходят. – Aniket

+0

Вы все еще печатаете много информации о каждом полученном пакете (100 символов * 50 сообщений = 50 кбит/с с максимальным размером 115,2 кбит/с) - уменьшите его до нескольких байтов для тестирования. Вы можете тратить столько времени на печать пакетов, которые вы отстаете. Насколько велики серийные буферы на Arduino? Можете ли вы использовать аппаратное квитирование (CTS/RTS) для предотвращения переполнения буфера? – tomlogic

+0

Я отменил код до минимальных минимальных данных (8 байт), что необходимо. Размер последовательного буфера составляет 64 байта для ардуино. Я попытался увеличить размер буфера UNO, используя метод, показанный в http://www.hobbytronics.co.uk/arduino-serial-buffer-size, но он по-прежнему теряет байты данных. Любые идеи о том, что еще можно попробовать? – Aniket

0

Я занимаюсь кодом, который вы используете в цикле. Я не знаю глубоких внутренних аспектов того, как работает Arduino, но делает ли это задержка в 10 мс блокировать другой код от обработки данных? Что делать, если вы облегчите его:

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

Но прежде, чем идти слишком далеко, вы должны изолировать проблему бы, подключив к координатору эмулятор терминала на ПК, чтобы контролировать частоту кадров. Если все кадры прибывают, то у координатора возникает проблема. Если они этого не сделают, сначала выполните работу с кодом маршрутизатора.

+0

Я удалил задержку в коде для координатора, урезал размер пакета до 8 байтов полезной нагрузки (раньше это было 45, общий размер пакета - около 15 байт), даже тогда он просто кажется упрямым падением данных. Выход, показанный в ссылке в исходном сообщении, был взят с использованием эмулятора терминала на ПК, подключенном к Uno с экраном Xbee. Когда я напрямую подключаю Координатор к ПК с помощью Xbee Explorer, я получаю тарабарщину. Возможно, это связано с тем, что я работаю в режиме API. Но я просто не могу понять, почему он не работает. Мне нужно это для моей диссертации. Любая помощь приветствуется. – Aniket

+0

Вам нужно будет просмотреть данные как hex, чтобы понять это. Следите за '0x7E' как начало символа кадра, за которым следует двухбайтная длина и тип кадра. Как я уже сказал, вам нужно сначала подтвердить, что вы действительно отправляете данные с маршрутизаторов, прежде чем тратить больше времени на устранение неполадок координатора. Самым простым решением может быть снижение частоты обновления до тех пор, пока вы не получите надежную связь. – tomlogic

+0

В одном проекте мониторинга, над которым я работал, конечные устройства захватывали данные в течение 5 минут, а затем отправляли один пакет с минимальным, максимальным и средним показателем за это 5-минутное окно. Возможно, что-то подобное сработает для вашего проекта. – tomlogic

Смежные вопросы