Большая часть материалов в сети о коммуникации между модулями 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 — это программа от Digi, которая позволяет прошивать и настраивать XBee-модули. Нечто вроде Arduino IDE, только для XBee. Для продолжения работы скачайте и установите X-CTU.
Сначала прошьём первый модуль. Установите его в USB-Serial адаптер и с помощью mini-USB кабеля подключите адаптер к компьютеру.
По окончанию процесса этот модуль — готов. Он будет нашим координатором. Отключите кабель USB, извлеките модуль из адаптера.
Теперь необходимо проделать точно такие же шаги для второго модуля. За исключением пункта (4). На этот раз выберите прошивку «ZNET 2.5 ROUTER/END DEVICE AT».
По окончанию процесса прошивки мы получим модуль- конечное устройство.
Все доступные в X-CTU прошивки можно классифицировать по следующим признакам:
Программа X-CTU работает только под Windows. Те, кто работает в другой ОС или просто предпочитает окно терминала монструозным GUI, могут прошить модули из командной строки. Для этого:
ebl_files
вы увидите множество *.ebl
файлов. Это бинарные файлы прошивок. Вам нужно определить необходимые. $ 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
$ ./xbfwup /path/to/ebl_files/XB24-B_ZigBee_1047.ebl
$ ./xbfwup /path/to/ebl_files/XB24-B_ZigBee_1247.ebl
Всё, модули готовы.
Сделаем примитивное устройство на базе Arduino Uno, которое как и планировалось, будет периодически посылать время, прошедшее со времени старта через XBee.
Как прошивка Arduino, так и его общение с XBee происходит через Serial-UART, с использованием пинов 0 и 1. Поэтому прошить сам Arduino необходимо до установки на него XBee. В противном случае они будут мешать друг другу.
Итак, напишем и загрузим на Arduino такой скетч:
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.