Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/RemoteAtCommand

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Отправка AT-команд на удаленный XBee-модуль[1]

Этот пример показывает, как при помощи библиотеки XBee управлять удаленным XBee-модулем. Скетч отправляет ему две AT-команды, настраивая на сбор данных с I/O линии.

Код

  1. /**
  2.  * Автор – Эндрю Рэпп (Andrew Rapp). 2009 год, все права защищены.
  3.  *
  4.  * Этот файл – часть библиотеки XBee-Arduino.
  5.  *
  6.  * Библиотека XBee для Arduino – это бесплатное ПО: его можно
  7.  * распространять и/или модифицировать согласно условиям Универсальной
  8.  * общественной лицензии GNU, изданной Фондом свободного ПО – будь то
  9.  * 3-тья или более поздняя версия этой лицензии (на ваш выбор).
  10.  *
  11.  * Библиотека XBee-Arduino распространяется бесплатно в надежде на то,
  12.  * что окажется полезной, но БЕЗО ВСЯКОЙ ГАРАНТИИ; включая даже
  13.  * обязательную гарантию на КОММЕРЧЕСКОЕ КАЧЕСТВО и ПРИГОДНОСТЬ
  14.  * КОНКРЕТНОЙ ЦЕЛИ. Более подробно читайте в Универсальной
  15.  * общественной лицензии GNU.
  16.  *
  17.  * Вы должны получить копию Универсальной общественной лицензии GNU
  18.  * вместе с библиотекой XBee-Arduino. Если не получили, ее можно найти
  19.  * на http://www.gnu.org/licenses/.
  20.  */
  21.  
  22. #include <XBee.h>
  23. #include <SoftwareSerial.h>
  24.  
  25. /*
  26. Этот пример – для XBee-модуля Series 1 (с прошивкой 10C8 или новее)
  27. или Series 2. XBee-модуль отправляет две AT-команды на удаленный
  28. XBee-модуль, чтобы настроить его на сбор данных с I/O линии.
  29.  
  30. Чтобы видеть информацию об XBee-коммуникации, этот пример использует
  31. библиотеку SoftSerial. Я использую плату Modern Device USB BUB
  32. (http://moderndevice.com/connect) и просматриваю выдачу при помощи
  33. монитора порта в IDE Arduino.
  34. */
  35.  
  36. // Задаем TX и RX контакты для SoftSerial.
  37. // Подключаем 8-ой контакт Arduino к TX-контакту конвертера USB-Serial:
  38. uint8_t ssRX = 8;
  39. // Подключаем 9-ый контакт Arduino к RX-контакту конвертера USB-Serial:
  40. uint8_t ssTX = 9;
  41. // Не забудьте подключить все устройства к общей «земле»: XBee, Arduino и конвертер USB-Serial
  42. SoftwareSerial nss(ssRX, ssTX);
  43.  
  44. XBee xbee = XBee();
  45.  
  46. // Включаем сбор порций данных на I/O линии:
  47. uint8_t irCmd[] = {'I','R'};
  48. // Задаем частоту сбора на 65 секунд (0xffff/1000)
  49. uint8_t irValue[] = { 0xff, 0xff };
  50.  
  51. // Делаем DIO0 (20-ый контакт) входным аналоговым контактом:
  52. uint8_t d0Cmd[] = { 'D', '0' };
  53. uint8_t d0Value[] = { 0x2 };
  54.  
  55. // Адрес (SH + SL) удаленного XBee-модуля:
  56. XBeeAddress64 remoteAddress = XBeeAddress64(0x0013a200, 0x400a3e02);
  57. // Создаем удаленный AT-запрос с командой IR:
  58. RemoteAtCommandRequest remoteAtRequest = RemoteAtCommandRequest(remoteAddress, irCmd, irValue, sizeof(irValue));
  59.  
  60. // Создаем объект для ответа на удаленную AT-команду:
  61. RemoteAtCommandResponse remoteAtResponse = RemoteAtCommandResponse();
  62.  
  63. void setup() {
  64.   Serial.begin(9600);
  65.   xbee.begin(Serial);
  66.   // Запускаем коммуникацию SoftSerial:
  67.   nss.begin(9600);
  68.  
  69.  // После включения питания XBee-модулям требуется несколько секунд,
  70.  // чтобы запуститься и подключиться к сети. Все пакеты, отправленные
  71.  // XBee-модулю в течение этого времени, будут проигнорированы.
  72.  // XBee-модули типа Series 2 при запуске отправляют модему пакет
  73.  // с информацией о статусе.
  74.  
  75.  // Лично у меня на возвращение статусного пакета уходит около четырех
  76.  // секунд. Кроме того, по моему опыту, ассоциация модулей типа
  77.  // Series 1 выполняется чуть дольше. Разумеется, если XBee-модуль был
  78.  // запущен раньше скетча, то никакой задержки не требуется, но если
  79.  // обе команды не выполняются, попробуйте увеличить задержку.
  80.  
  81.  delay(5000);
  82. }
  83.  
  84. void loop() {
  85.   sendRemoteAtCommand();
  86.  
  87.   // Теперь снова используем тот же объект для команды DIO0:
  88.   remoteAtRequest.setCommand(d0Cmd);
  89.   remoteAtRequest.setCommandValue(d0Value);
  90.   remoteAtRequest.setCommandValueLength(sizeof(d0Value));
  91.  
  92.   sendRemoteAtCommand();
  93.  
  94.   // Очищаем задающее значение, чтобы этот объект можно было снова
  95.   // использовать для запроса:
  96.   remoteAtRequest.clearCommandValue();
  97.  
  98.   // Готово!
  99.   while (1) {};
  100. }
  101.  
  102. void sendRemoteAtCommand() {
  103.   nss.println("Sending command to the XBee");  //  "Отправка команды XBee-модулю"
  104.  
  105.   // Отправляем команду:
  106.   xbee.send(remoteAtRequest);
  107.  
  108.   // Ждем 5 секунд ответа о статусе:
  109.   if (xbee.readPacket(5000)) {
  110.     // Получили ответ!
  111.  
  112.     // Проверка на получение ответа:
  113.     if (xbee.getResponse().getApiId() == REMOTE_AT_COMMAND_RESPONSE) {
  114.       xbee.getResponse().getRemoteAtCommandResponse(remoteAtResponse);
  115.  
  116.       if (remoteAtResponse.isOk()) {
  117.         nss.print("Command [");  //  "Команда ["
  118.         nss.print(remoteAtResponse.getCommand()[0]);
  119.         nss.print(remoteAtResponse.getCommand()[1]);
  120.         nss.println("] was successful!");  //  "] была выполнена успешно!"
  121.  
  122.         if (remoteAtResponse.getValueLength() > 0) {
  123.           nss.print("Command value length is ");    //  "Размер значения, полученного командой - "
  124.           nss.println(remoteAtResponse.getValueLength(), DEC);
  125.  
  126.           nss.print("Command value: ");  //  "Значение, полученное командой: "
  127.          
  128.           for (int i = 0; i < remoteAtResponse.getValueLength(); i++) {
  129.             nss.print(remoteAtResponse.getValue()[i], HEX);
  130.             nss.print(" ");
  131.           }
  132.  
  133.           nss.println("");
  134.         }
  135.       } else {
  136.         nss.print("Command returned error code: ");  //  "Код ошибки, возвращенный командой: "
  137.         nss.println(remoteAtResponse.getStatus(), HEX);
  138.       }
  139.     } else {
  140.       nss.print("Expected Remote AT response but got ");  //  "Ожидался AT-ответ, но получили "
  141.       nss.print(xbee.getResponse().getApiId(), HEX);
  142.     }    
  143.   } else if (xbee.getResponse().isError()) {
  144.     nss.print("Error reading packet.  Error code: ");     //  "Ошибка при чтении пакета. Код ошибки: "
  145.     nss.println(xbee.getResponse().getErrorCode());
  146.   } else {
  147.     nss.print("No response from radio");  //  "XBee-модуль не отвечает"
  148.   }
  149. }

См.также

Внешние ссылки

  1. github.com - RemoteAtCommand.pde