Тестирование пользовательской инфраструктуры IoT путем управления светодиодом: RIOT (RealTime Internet of Things)
RIOT, Realtime Internet of Things, представляет собой настраиваемую структуру, предназначенную для простого использования ESP8266 с микроконтроллерами. В этом проекте мы продемонстрируем простоту RIOT путем управления светодиодом с помощью сетевого компьютера.
Краткое введение в RIOT
RIOT (Realtime Internet of Things) - это бесплатный программный пакет (некоммерческий), который я создал, что очень простое использование ESP8266 с микроконтроллерами.
Модуль ESP8266 является очень ярким и недооцененным модулем Wi-Fi, который может превратить любой последовательный порт (будь то на микроконтроллер или старый компьютер Z80) в устройство с поддержкой Интернета. Тем не менее, команды ESP8266 AT могут быть особенно сложными и, если не правильно закодированы, могут привести к блокировкам.
Рамка RIOT предоставляет несколько функций, которые делают ESP8266 легким. Во-первых, он содержит интерпретатор для ввода данных и выхода из ESP8266. Во-вторых, он обеспечивает простые и простые в использовании функции, позволяющие почти мгновенно получить доступ к микроконтроллеру Wi-Fi. В-третьих, код использует ROM-память как можно больше, так что микросхемы с очень малой ОЗУ (например, 256 байт ОЗУ) могут быть подключены к Интернету. RIOT также имеет серверный пакет, который написан на VB.net (для простоты), который не может быть проще использовать в проекте.
В этом проекте мы рассмотрим, как использовать RIOT с любым устройством PIC18 (этот проект будет специально использовать PIC18F25K20) и использовать компьютер для включения и выключения светодиода.
Примечание: RIOT теперь называется RIOTOUS и может быть найден на //www.riotousframework.com
Предпосылки
Для правильной работы RIOT на стороне клиента необходимо использовать определенную версию AT и SDK. Версия AT должна быть 1.1.0.0, а версия SDK должна быть 1.5.4. Более ранние версии имеют ошибки при закрытии соединений, а более поздние версии имеют либо отсутствующий, либо ошибочный код.
Чтобы найти требования к клиентской стороне RIOT, нажмите здесь.
Для компиляции проекта вам понадобятся
- Microchip IDE 8.92
- Компилятор Microchip C18
- Visual Studio Express 2012
Чтобы узнать, как перепрограммировать прошивку в ESP8266:
- AAC обновите прошивку в своем модуле Wi-Fi ESP8266
- Все инструменты и файлы, предварительно настроенные для AT 1.1.0.0 и SDK 1.5.4, можно найти здесь (загружаемый.zip-файл)
Схема

Схема клиента. нажмите, чтобы увеличить
Посмотрите, насколько простой RIOT? Ну, вы еще этого не увидите, потому что это всего лишь аппаратный уровень! Тем не менее, он демонстрирует, насколько удивительно простые аппаратные требования для модуля ESP8266 ESP01!
Во-первых, вся схема работает на 3, 3 В, что очень легко сделать с регулятором AMS1117. Пакет SOT-223 может быть спаян на 2, 54 мм плинтусе с успехом, поэтому простая схема регулирования мощности может быть построена на отдельной плате.
Во-вторых, используются три светодиода: D1 указывает, есть ли соединение Wi-Fi, D2 указывает, есть ли активное соединение с сервером, а D3 - это светодиод, который мы будем контролировать через сетевой компьютер.
В-третьих, вы, возможно, заметили, что мы будем отключать внутренний генератор, что не очень точно и, следовательно, не является оптимальным выбором для связи UART. Тем не менее, процент ошибок в UART очень низок и поэтому может быть проигнорирован для нашей простой схемы (на практике все же проблемы возникли из-за несоответствия скорости передачи данных UART).
Последний - это коннектор программирования PicKit3. Эта часть зависит от вас; вы можете использовать любой программист PIC, который вам подходит. Не забудьте правильно подключить его.
Создание сервера RIOT
С построенной схемой и готовой к программированию, мы получим простой сервер RIOT. Сервер RIOT специально разработан для максимально простой связи между устройствами и компьютерами. Одна особенность, которая немного странна в отношении сервера RIOT, заключается в том, что он не обменивается данными с использованием IP-адреса на одном порту. Вместо этого он назначает порт для подключения устройства.
Чтобы устройство RIOT подключилось к серверу RIOT, сначала необходимо попросить подключиться к некоторому глобальному порту (по умолчанию 333). Сервер RIOT немедленно ответит номером порта для связи устройства и закрытия соединения. На этом этапе устройство RIOT затем снова подключится к новому номеру порта, и вся связь будет осуществляться через порт. Обратите внимание, что это применимо только при подключении к серверу RIOT. Другими словами, устройство RIOT все еще может подключаться к другим серверам и веб-сайтам, но сервер RIOT предоставляет простые функции и простой протокол обмена сообщениями, который обрабатывается инфраструктурой RIOT. Когда вы отправляете сообщения на сервер RIOT, программное обеспечение RIOT будет автоматически добавьте необходимые бит в это сообщение для полной транзакции.
Еще одна особенность рамок RIOT - это наблюдение с помощью контрольной группы. Каждый так часто сервер будет проверять устройство, чтобы проверить, все ли подключено устройство, и если после нескольких секунд ответа не будет, сервер закроет соединение и освободит порт. Опять же, программное обеспечение автоматически обрабатывает это, если используется структура RIOT. Любые сообщения, отправленные на сервер RIOT, сбросят таймер зондирования сторожевого таймера.
Чтобы это сработало, вы можете либо использовать готовый исполняемый файл (который требует инфраструктуру.net), либо самостоятельно скомпилировать проект VB. Исполняемый файл хорош для целей тестирования, но в противном случае лучше создать собственный сервер (используя классы VB RIOT).
Прежде чем вы сможете использовать сервер RIOT, в файле Server.vb необходимо изменить один фрагмент кода. Строку 114 необходимо изменить так, чтобы IP-адрес был локальным IP-адресом. Неправильный IP-адрес приведет к сбою программы (помните, что RIOT все еще в первые дни, поэтому дайте ему время расти!).
Private serverAddress Как IPAddress = IPAddress. Parse ("xxx.xxx.xxx.xxx")
С этим изменилось время поиска кода для сервера. Есть три кнопки, текстовое поле и таймер. Кнопки включили сервер, включили светодиод и выключили светодиод. Текстовое поле используется для просмотра количества текущих подключений. Таймер - это тикер, который позволяет нам выполнять проверки на сервере так часто (здесь, 10 раз в секунду).
Еще одна вещь, на которую нужно обратить внимание, - это идентификатор клиента. Не забудьте установить уникальный идентификатор клиентского устройства (в программном обеспечении на стороне клиента) в 0, чтобы мы могли получить доступ к клиенту по идентификатору, а не по порту.
Первая задача - создать экземпляр сервера и запустить его. Это делается с использованием этого раздела кода, который не требует пояснений:

На этом этапе вы можете увидеть, как RIOT пытается использовать как можно более наглядные функции. Обратите внимание, что таймер также запускается здесь! Для сервера, который должен быть надежным, попробуйте и поймайте - чтобы исключения не останавливали программу - может быть лучший подход.
Вторая задача - показать, сколько активных подключений есть. Это не является жизненно важным для работы сервера - это просто позволяет нам визуально знать, правильно ли подключено устройство RIOT к серверу!

Третья задача - включить и выключить светодиод. Это делается путем отправки строки «LEDON» клиенту RIOT для включения светодиода или отправки «LEDOFF», чтобы выключить светодиод. Обратите внимание, что строка должна быть преобразована в массив байтов перед отправкой.


Код клиента RIOT
Код для клиентской стороны RIOT написан на C с использованием MPLAB IDE 8.92. Существует несколько причин использовать эту устаревшую среду IDE и даже более старый компилятор C18. Суть в том, что меня не впечатлила новая версия (MPLAB X IDE версии 3.40). Я обнаружил, что более новая среда IDE работает медленнее, и я бы неоднократно получал отключения и неудачные чтения. У меня был намного лучший опыт работы с более старой MPLAB IDE 8.92.
Чтобы заставить RIOT работать на чипе PIC18, есть несколько требований:
- UART должен быть настроен для работы с RIOT.
- Прерывание для приема UART необходимо, чтобы при получении байта RIOT обновлялся.
- Код инициализации необходим. Имейте в виду, что весь необходимый код можно найти в файлах проекта, но будет обсуждаться только основной код, связанный с RIOT. Код, такой как конфигурация осциллятора и регистры направления порта, не будет отображаться или описываться.
Примечание. Все ресурсы для этого проекта доступны бесплатно. Вы можете использовать их вместо внесения необходимых изменений, описанных ниже, если вы используете PIC18F25K20
Во-первых, IoT_ClientFramework.c нуждается в редактировании нескольких частей. В приведенном ниже коде показано, как три функции uartSend (), uartInit () и delay20ms () должны искать, чтобы этот проект работал правильно:

С определенными функциями UART RIOT следующим шагом будет включение процедуры обслуживания прерываний, которая запускается при приеме UART. Когда это произойдет, uartGet (uart byte) нужно вызывать перед internet_update (), так что RIOT берет байт и обрабатывает его.

Теперь, когда у нас есть запрограммированная процедура прерывания (и регистры, зависящие от прерываний, настроенные правильно, как указано в setup.h), пришло время запустить RIOT!
Первая функция для вызова - internet_init (). Это префикс RIOT для сброса переменных и передачи его в известное состояние.
Как только это будет сделано, пришло время подключиться к сети Wi-Fi, вызвав функцию internet_connectToWifi («SSID», «PASSWORD»). Очевидно, вы установили SSID и PASSWORD в учетные данные своей собственной сети. Этот код (как и многие функции RIOT) вернет либо true (1), либо false (0), чтобы указать, был ли запрос успешным. В случае этого кода вызов функции помещается внутри цикла while, так что запрос на соединение повторяется до тех пор, пока RIOT не будет успешно подключен к Интернету.

Следующая задача - подключиться к нашему серверу, который выполняется путем вызова internet_connectToRIOTServer («IP», «PORT»). Эта функция отличается от internet_connectToServer («IP», «PORT»), поскольку сервер RIOT динамически маршрутизирует соединения через уникальные порты, а функция соединения с сервером RIOT автоматически подключается к серверу с новым портом.
Эта функция помещается в цикл while, чтобы гарантировать, что RIOT продолжает пытаться подключиться, пока не найдет сервер и не будет успешно подключен. После подключения к серверу мы назначаем уникальный идентификатор нашему устройству. Хотя это не важно в нашем проекте, оно полезно для отправки данных клиентам и из них по ID.
Когда устройства подключаются к серверу RIOT, они помещаются в массив объектов в самом нижнем свободном слоте. Это означает, что устройство может быть размещено в любом месте массива. Использование идентификаторов означает, что если устройство повторно подключается и размещается в другом месте, неизменный идентификатор предотвращает сообщения, поступающие на неправильный клиент.
Помните, что на сервере есть две функции для отправки данных: один - отправлять данные по положению в массиве (например, отправлять данные клиенту 0, который является первым клиентом, который подключен), а вторая функция - отправлять данные по ID. В настоящее время идентификатор представляет собой 8-битное число, предоставляющее 256 возможностей. В будущем, однако, это может измениться как нечто похожее на MAC-адреса. MAC-адрес ESP8266 может быть даже реализован как идентификатор.
Поскольку мы используем идентификационный номер 0 на сервере, мы должны использовать тот же идентификационный номер на нашем клиенте. Это легко сделать с помощью функции internet_setdeviceID (0).

Последний фрагмент кода - наш основной цикл, который бесконечно петли. Все, что нужно сделать, это проверить новые данные и, как только новые данные будут доступны, обработать его. В этом случае новые данные сравниваются с константными буферами (строками), чтобы увидеть, равен ли поток данных «LEDON» и «LEDOFF». Затем, в зависимости от сообщения, светодиод (D3) либо выключен, либо включен.

BOM
Часть | Справочник по схемам | Количество |
PIC18F25K20 | IC1 | 1 |
AMS1117 3.3V Регулятор | IC2 | 1 |
ESP8266 ESP-01 | ESP8266 | 1 |
Резистор 1K | R2, R3, R4 | 3 |
5.6K резистор | R1 | 1 |
СВЕТОДИОД | D1, D2, D3 | 3 |
Конденсатор 100nF | C1, C3, C4, C5 | 2 |
Конденсатор 10uF | С2 | 1 |
Конденсатор 22uF | C3 | 1 |
строительство
Макет схемы довольно прост, но регулятор 3.3V, используемый здесь, не является прототипом. Несмотря на то, что в упаковке с отверстиями имеются регуляторы 3, 3 В, AMS1117 дешев, а в моей мастерской доступен только регулятор 3, 3 В (потому что я отказываюсь хранить два типа компонентов, которые делают то же самое).
Чтобы преобразовать AMS1117 в пакет, совместимый с макетами, вы можете использовать небольшой кусочек стримера и 3-контактный разъем. Также не забудьте отрезать вкладку, чтобы медные полосы не соприкасались с вкладкой.

Преобразование AMS1117 для макетирования макета

Готовый проект
Проект в действии
Вот видео, в котором клиент RIOT подключается к сети Wi-Fi, подключается к серверу RIOT, а затем управляет белым светодиодом с помощью сервера.
Вывод
RIOT демонстрирует, как даже младшие микроконтроллеры могут быть подключены к Интернету. Хотя в этом проекте не было продемонстрировано, тест с RIOT на PIC16F628 с использованием компилятора XC был выполнен и был успешным.
В то время как RIOT находится в зачаточном состоянии, со временем будет добавлено больше функций, и могут появиться различные реализации, чтобы все больше и больше устройств могли запускать RIOT. Следующий проект будет включать в себя передачу клиентом данных на сервер в виде базового регистратора данных.
Попробуйте этот проект сами! Получить спецификацию.
RIOT: светодиодный управляющий код