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

Arduino:Примеры/Series2 Sleep

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

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

Контакты:

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


Введение и выведение XBee-модуля из режима ожидания[1]

Этот пример показывает, как при помощи библиотеки XBee настроить Arduino на введение и выведение XBee-модуля из режима ожидания.

Код

  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 2 (ZigBee), но он
  27. также поддерживает режим ожидания XBee-модуля типа Series 1. Этот
  28. пример демонстрирует, как работать с контактом для режима ожидания,
  29. который есть у XBee-модуля. То есть, по сути, он позволяет плате
  30. Arduino вводить и выводить XBee-модуль из режима ожидания. В этом
  31. примере конечное устрйство подключено к Arduino.
  32.  
  33. Режим ожидания у конечного устройства должен быть выставлен на «1»
  34. (SM=1) – это активирует режим ожидания. На координаторе нужно задать
  35. SP=AF0 (28 секунд). Благодаря этому координатор будет буфферизировать
  36. все пакеты в течение 28 секунд – пока конечное устройство будет
  37. находиться в режиме ожидания. «Проснувшись», конечное устройство
  38. опросит координатора и получит приготовленный для него пакет.
  39.  
  40. Примечание: Для коммуникации с Arduino я использую библиотеку
  41. SoftSerial, потому что библиотека Serial уже используется самим XBee.
  42.  
  43. Как это работает:
  44.  
  45. Когда вы отправляете «1», Arduino включает у XBee-модуля режим
  46. ожидания. Когда вы отправляете «2», XBee-модуль выходит из режима ожидания. Когда вы отправляете «3», Arduino отправляет произвольный
  47. TX-пакет.
  48.  
  49. Разумеется, если XBee-модуль находится в режиме ожидания, TX-пакет
  50. доставлен не будет. Чтобы отправлять эти команды, подключите монитор
  51. порта в IDE Arduino к конвертеру USB-Serial.
  52.  
  53. Подключите светодиод к 13-ому контакту XB-модуля (он называется
  54. «Status»). Он будет загораться, когда XBee-модуль будет выходить из
  55. режима ожидания, и потухать, когда модуль будет входить в режим
  56. ожидания.
  57.  
  58. Подключите координатор к компьютеру и отправляйте TX-пакет каждые 28
  59. секунд. Кроме того, у вас должна быть возможность проверять, что
  60. конечное устройство, вышедшее из режима ожидания, получило присланный
  61. вами пакет.
  62.  
  63. Не забудьте также подключить все устройства к общей «земле»: XBee,
  64. Arduino и конвертер USB-Serial.
  65. */
  66.  
  67. // Создаем объект XBee:
  68. XBee xbee = XBee();
  69.  
  70. // Создаем произвольную полезную нагрузку (она особого смысла не несет):
  71. uint8_t payload[] = { 0, 0 };
  72.  
  73. // Адрес (SH + SL) удаленного XBee-модуля:
  74. XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x403e0f30);
  75. ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
  76. ZBTxStatusResponse txStatus = ZBTxStatusResponse();
  77. ZBRxResponse rx = ZBRxResponse();
  78.  
  79. // Примечание: Чтобы XBee-модуль вошел в режим ожидания, ему не
  80. // обязательно нужно 3,3 вольта. Для этого достаточно незамкнутой
  81. // цепи. Но, разумеется, ему нужно 0 вольт, чтобы выйти из режима
  82. // ожидания. Подключите 7-ой цифровой контакт Arduino к 9-ому контакту
  83. // на XBee-модуле (это контакт для режима ожидания) при помощи
  84. // делителя напряжения. Я использую для этого резистор на 10 кОм.
  85. uint8_t sleepPin = 7;
  86.  
  87. // SoftSerial RX: Подключаем 8-ой цифровой контакт Arduino к
  88. // TX-контакту на конвертере USB-Serial. Примечание: Лично я использую
  89. // USB BUB от Modern Device (выставлен на 5 вольт). Вы можете
  90. // использовать 3,3-вольтовый конвертер USB-Serial с делителем
  91. // напряжения на RX (TX не требуется, потому что Arduino устойчива к
  92. // 3,3 вольтам).
  93. uint8_t ssRX = 8;
  94. // SoftSerial TX: Подключаем 9-ый цифровой контакт Arduino к RX на
  95. // конвертере USB-Serial:
  96. uint8_t ssTX = 9;
  97.  
  98. SoftwareSerial nss(ssRX, ssTX);
  99.  
  100. void setup() {
  101.   pinMode(sleepPin, OUTPUT);
  102.   // Переключаем на LOW (выход из режима ожидания):
  103.   digitalWrite(sleepPin, LOW);
  104.  
  105.   // запускаем коммуникацию XBee:
  106.   Serial.begin(9600);
  107.   xbee.setSerial(Serial);
  108.   // Запускаем коммуникацию SoftSerial:
  109.   nss.begin(9600);
  110. }
  111.  
  112. void sendPacket() {
  113.  
  114.     nss.println("Sending a packet");  //  "Отправка пакета"
  115.      
  116.     xbee.send(zbTx);
  117.    
  118.     // После отправки TX-запроса 5 секунд ждем ответа о статусе.
  119.     if (xbee.readPacket(5000)) {
  120.         // Получили ответ!
  121.  
  122.         // Должен быть статус «znet tx»:
  123.         if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
  124.            xbee.getResponse().getZBTxStatusResponse(txStatus);
  125.                
  126.            // Получаем подтверждение о доставке пакета (пятый байт):
  127.            if (txStatus.getDeliveryStatus() == SUCCESS) {
  128.             // Успешно. Ура!
  129.                 nss.println("packet was delivered");  //  "Пакет доставлен"
  130.            } else {
  131.             // Удаленный XBee-модуль не получил наш пакет. Он включен?
  132.                 nss.println("packet delivery failed");  //  "Пакет не доставлен"
  133.            }
  134.         } else if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
  135.                 // Что-то получили!
  136.             xbee.getResponse().getZBRxResponse(rx);
  137.                 // Показываем полезную нагрузку. Допустим, это текст.
  138.                 for (uint8_t i = 0; i < rx.getDataLength(); i++) {
  139.                         nss.println(rx.getData(i));
  140.                 }
  141.         }      
  142.     } else {
  143.       // Локальный XBee-модуль в режиме ожидания:
  144.        nss.println("no response -- is local xbee sleeping?");  //  "Ответа нет – локальный модуль в режиме ожидания?"
  145.     }  
  146. }
  147.  
  148. void loop() {  
  149.   if (nss.available()) {
  150.     int cmd = nss.read();
  151.    
  152.     // ASCII-код для «1» - это «49»:
  153.     if (cmd == 49) {   // 1 (ASCII)
  154.       // Вводим XBee-модуль в режим ожидания:
  155.       digitalWrite(sleepPin, HIGH);
  156.       nss.println("sleeping xbee");  //  "XBee-модуль переходит в режим ожидания"
  157.     } else if (cmd == 50) {  // ASCII-код для «2» - это «50»:
  158.       digitalWrite(sleepPin, LOW);
  159.       nss.println("waking xbee");  //  "XBee-модуль выходит из режима ожидания"
  160.     } else if (cmd == 51) {  // ASCII-код для «3» - это «51»:
  161.  
  162.       // Отправляем пакет:
  163.       sendPacket();
  164.     } else {
  165.        nss.println("I didn't understand");  //  "Я не понимаю"
  166.     }
  167.   }
  168.  
  169.   readPacket();
  170. }
  171.  
  172. // Включаясь, XBee-модуль отсылает модему статус «0» (аппаратный
  173. // сброс), а затем «2» (присоединение к сети) – при условии, что он
  174. // правильно настроен. Выходя из режима ожидания, XBee-модуль отсылает
  175. // модему статус «2» (присоединение к сети).
  176.  
  177. void readPacket() {
  178.   xbee.readPacket();
  179.  
  180.     if (xbee.getResponse().isAvailable()) {
  181.         // Что-то получили... Показываем пакет при помощи NSS:
  182.         nss.print("API=");
  183.         nss.print(xbee.getResponse().getApiId(), HEX);
  184.         nss.print(",frame=");
  185.        
  186.         // Показываем данные, находящиеся в секции «frame data» API-фрейма:
  187.         for (int i = 0; i < xbee.getResponse().getFrameDataLength(); i++) {
  188.           nss.print(xbee.getResponse().getFrameData()[i], HEX);
  189.           nss.print(" ");
  190.         }
  191.        
  192.         nss.println("");
  193.     } else if (xbee.getResponse().isError()) {
  194.      nss.print("XBee error. error code is");   //  "Ошибка XBee-моодуля. Код ошибки: "
  195.      nss.println(xbee.getResponse().getErrorCode(), DEC);
  196.     }
  197. }

См.также

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

  1. github.com - Series2_Sleep.pde