Настройка пары модулей XBee Series 2 для коммуникации друг с другом

Большая часть материалов в сети о коммуникации между модулями XBee относится к их первому поколению: «Series 1» или просто «S1». Но они всё сильнее вытесняются новой, более совершенной линейкой второго поколения «Series 2» или просто «S2».

При попытке сконфигурировать S2 точно так же, как и S1, ошибка возникает при попытке установить параметр MY. Так например, команда ATMY=1111 вернёт ошибку. В модулях второго поколения этот параметр стал доступным только для чтения.

Разные поколения можно отличить по маркировке. Компания-производитель XBee была переименована из MaxStream в Digi. Если на модуле используется название MaxStream — это XBee Series 1. Если же используется название Digi, на модуле сразу указано поколение:

Также определить поколение можно по серийному номеру на обратной стороне. Если первая буква после XB24- (или XB24P- для мощной pro-версии) — это «A», вы держите в руках XBee Series 1, в противном случае — XBee Series 2.

В этой статье описывается процесс настройки двух модулей XBee S2 для коммуникации друг с другом. Один будет установлен на Arduino Uno и периодически отправлять время, прошедшее с момента старта платформы; другой будет установлен на XBee-USB адаптер соединённый с компьютером и принимать значения.

Что понадобится

Прошивка по ролям

При построении сети любого размера на XBee Series 2 в ней должен быть один координатор и сколько угодно роутеров и конечных устройств. Это похоже на ситуацию с сотовой связью: один телефон не может звонить напрямую на другой, сигнал обязан пройти через вышку. У нас сеть с всего двумя участниками, поэтому сделаем один модуль координатором, а другой — конечным устройством.

Невозможно простой командой изменить роль XBee-модуля. Для каждой роли существует своя прошивка, которую необходимо в него загрузить. Это аналогично процессу прошивки Arduino новым скетчем, с той лишь разницей, что используется другой инструментарий, а сам скетч уже скомпилирован производителем.

Прошивка через X-CTU

X-CTU — это программа от Digi, которая позволяет прошивать и настраивать XBee-модули. Нечто вроде Arduino IDE, только для XBee. Для продолжения работы скачайте и установите X-CTU.

Сначала прошьём первый модуль. Установите его в USB-Serial адаптер и с помощью mini-USB кабеля подключите адаптер к компьютеру.

  1. Запустите X-CTU
  2. На вкладке «PC Settings» выберите COM-порт, соответствующий адаптеру. Если не уверены какой именно, нажмите кнопку «Test / Query».
  3. Далее, перейдите на вкладку «Modem Configuration». Нажмите кнопку «Download new versions», чтобы скачать самые свежие версии прошивок.
  4. Выберите «XB24-B» в поле «Modem» для базовой версии или «XBP24-B» для pro-версии. Выберите «ZNET 2.5 COORDINATOR AT» в поле «Function Set». Эти 2 поля вместе определяют модель XBee, семейство прошивок и роль; подробнее о них — далее.
  5. Запомните значение «ID» в дереве настроек — для модулей одной сети оно должно быть одинаковым. Можете установить его в собственное, произвольное значение.
  6. Установите галочку «Always update firmware» и нажмите кнопку «Write». Это запустит процесс перепрошивки

По окончанию процесса этот модуль — готов. Он будет нашим координатором. Отключите кабель USB, извлеките модуль из адаптера.

Теперь необходимо проделать точно такие же шаги для второго модуля. За исключением пункта (4). На этот раз выберите прошивку «ZNET 2.5 ROUTER/END DEVICE AT».

По окончанию процесса прошивки мы получим модуль- конечное устройство.

Разновидности прошивок

Все доступные в X-CTU прошивки можно классифицировать по следующим признакам:

  1. Семейство: Zigbee, ZNet 2.5 и ещё дюжина других. Оно определяет набор доступных возможностей. Семейство имеет значение при создании сложных сетей с специфичными требованиями. С модулями XBee Series 2 совместимы семейства Zigbee, обозначаемое как XB24-ZB и ZNet 2.5, обозначаемое как XB24-B. Вы можете выбрать любое из них; главное, чтобы он совпадали на обоих устройствах. В этой статье используется ZNet 2.5.
  2. Роль: Coordinator, Router, End Device. Она определяет назначение устройства в сети. Как уже говорилось, в сети должен быть один координатор и сколько угодно роутеров и конечных устройств.
  3. Способ взаимодействия с модулем: AT, API, PH, Analog IO, Digital IO. Он определяет каким образом можно командовать модулем: возможно использовать стандартные модемные AT-команды, а можно использовать собственный протокол (API). Способ важен, если вы планируете менять настройки модуля на лету: изменять собственный адрес, адрес получателя, режим энергосбережения и т.д. AT-команды просто применять, их можно посылать стандартными инструментами; API-команды быстрее, но требуют реализации протокола.

Прошивка без X-CTU

Программа X-CTU работает только под Windows. Те, кто работает в другой ОС или просто предпочитает окно терминала монструозным GUI, могут прошить модули из командной строки. Для этого:

  1. Скачайте и распакуйте последнюю версию прошивок для XBee.
  2. Внутри директории ebl_files вы увидите множество *.ebl файлов. Это бинарные файлы прошивок. Вам нужно определить необходимые.
    • В префиксе кодируется модель модуля: XB24 — это базовый XBee, XBP24 — это XBee-Pro.
    • Далее кодируется семейство. B_ZigBee — это ZNet 2.5, ZB — это Zigbee.
    • Затем следуют 4 цифры. Например, 1647. Последние две (47) определяют версию (в смысле новизны) прошивки. Первые две (16) определяют роль и способ взаимодействия: для «Coordinator AT» — это 10 (например 1047), для «Router/End Device AT» — это 12 (например 1247).
  3. Джошуа Ройс создал утилиту для загрузки прошивок на модули XBee. Её необходимо собрать:
    $ git clone https://github.com/roysjosh/xbee-comm.git
    $ cd xbee-comm/
    $ cc -I src/lib/ src/bin/xbfwup.c src/lib/*.c -o xbfwup
  4. Установите один из модулей в XBee-USB адаптер и подключите его кабелем к компьютеру. Прошьём его в роли координатора:
    $ ./xbfwup /path/to/ebl_files/XB24-B_ZigBee_1047.ebl
  5. Отключите кабель, замените модуль на следующий, включите обратно. Будем прошивать второй модуль в роли конечного устройства:
    $ ./xbfwup /path/to/ebl_files/XB24-B_ZigBee_1247.ebl

Всё, модули готовы.

Создание Arduino-XBee устройства

Сделаем примитивное устройство на базе Arduino Uno, которое как и планировалось, будет периодически посылать время, прошедшее со времени старта через XBee.

Как прошивка Arduino, так и его общение с XBee происходит через Serial-UART, с использованием пинов 0 и 1. Поэтому прошить сам Arduino необходимо до установки на него XBee. В противном случае они будут мешать друг другу.

Итак, напишем и загрузим на Arduino такой скетч:

beep-xbee.pde
void setup()
{
    // По умолчанию общаемся с XBee на скорости
    // 9600 бод
    Serial.begin(9600);
}
 
void loop()
{
    // Отправляем время с момента включения
    Serial.println(millis());
    // Делаем паузу
    delay(1000);
}

Далее, установим IO Shield поверх Arduino Uno и уже в него установим модуль XBee. Подводим питание. Всё, устройство вещает.

Приём данных

Поскольку второй модуль в нашем случае установлен в XBee-USB адаптер, а тот в свою очередь соединён с компьютером, мы можем сразу увидеть идёт ли передача данных. Для этого достаточно считать данные, получаемые модулем по serial-протоколу. Подойдёт любой serial-терминал: либо вкладка «Terminal» в X-CTU, либо Serial Monitor в Arduino IDE, либо picocom/minicom/screen в командной строке. Запускаем и наблюдаем за получением данных!

Адресация

Как вы заметили, мы ни коим образом не указывали адресата сообщения. В семействе прошивок ZNet 2.5 по умолчанию осуществляется broadcast. То есть, отправленное сообщение будет получено всеми устройствами единой сети. Для передачи данных конкретному устройству, используются настройки NI (Node Identifier) и DN (Destination Node). Отправитель должен иметь DN равный NI получателя. Само значение может быть произвольным алфавитно-цифровым идентификатором. И в случае работы через AT-команты может быть установлено через любой serial-терминал. Например, для получателя:

+++           // переходим в командный режим
OK            // ...модуль не против
ATNI=roger13  // устанавливаем имя
OK
ATWR          // сохраняем настройки в постоянную память
OK
ATCN          // выходим из командного режима
OK

Для отправителя:

+++
OK
ATDN=roger13  // устанавливаем адресата
OK
ATWR
OK
ATCN
OK

После такой настройки общение будет осуществляться в режиме точка-точка. Эта пара настроек служит заменой параметру MY (ATMY), используемому в первом поколении модулей XBee.