Что делает разработчик в редкие часы досуга? Правильно, просматривает прайсы железячных магазинов. Выдалась свободная минутка и я решил полистать странички популярных интернет-магазинов — скукота, ничего интересного, всё это мы уже видели… и тут неожиданно мой взгляд падает на очередную Mega. Ба! да это не простая Мега, а совмещённая со всеми любимым ESP8266, да ещё заботливо снабжённая переключателями для совместной работы двух контроллеров — проводного (при помощи Ethernet Shield) со множеством GPIO и Wi-Fi для беспроводной связи.
Неплохо! Подумал я и вспомнил про AMS — туда же можно установить два сервера — проводной и беспроводной и связать их в одну систему — ESP8266 получит 54 цифровых и 16 аналоговых пинов, а Mega получит беспроводное управление по Wi-Fi и все плюшки ESP8266. Давненько мне не попадалась такая интересная плата.
— Здравствуйте! У вас есть плата Mega + ESP8266?
— Есть, но у нас только одна осталась.
— Почему только одна?
— Остальные разобрали.
— Зарезервируйте её, пожалуйста, для меня.
Пара слов о компании
Компания RobotDyn мне понравилась двумя вещами: первая — своими технологическими решениями. Тут не нужно далеко ходить, отличным примером является рассматриваемая плата Mega + ESP8266. Что-то ничего подобного я не встречал в наших (и не наших, но тут особо не искал) интернет-магазинах. И это не единственный пример, есть ещё вариант Uno + ESP8266 и на этом компания явно не собирается останавливаться, судя по всему нас ждёт ещё много интересных устройств.
И вторая — это её ценовая политика. Не буду здесь подробно останавливаться на этом вопросе, но скажу, что цены меня приятно удивили — девиз компании «Цены как на Aliexpress».
Я в двух словах описал бэкграунд на котором будут разворачиваться все последующие события, теперь переходим непосредственно к техническим деталям и описанию платы и работы с ней.
Сама плата
В общем-то обычная плата, мало чем отличающаяся от множества ей подобных, если бы не одна небольшая деталь, а именно, интегрированный в плату чип ESP8266EX. Это сразу переводит плату в разряд неординарных решений. Хочу обратить ваше внимание ещё на одну деталь — в плату интегрирован не стандартный модуль типа ESP-12, а именно чип и вся разводка сделана на самой плате, что прозрачно намекает на уровень разработчиков. Также хочу отметить, что на плате присутствует как напечатанная антенна, так и разъём для подключения внешней антенны, что во многих случаях может быть очень полезно.
На плате присутствуют штырьковые разъёмы для подключения к выводам ESP8266 и несколько переключателей о которых стоит сказать немного подробнее. Основная идея использования платы заключается в том, что при помощи переключателей можно по-разному сконфигурировать взаимодействие трёх её компонентов: чипа Atmega2560, чипа ESP8266EX и USB-TTL конвертера CH340G. Возможны как одиночные, так сложные соединения, которые позволяют организовать множество вариантов взаимодействия всех частей платы. Это открывает большие возможности по построению различных устройств, но подробнее об этом чуть позже.
Ещё хочется отметить приличную нагрузочную способность платы. Судя по надписям на ней, она способна обеспечить ток нагрузки 1,6 А по 5-вольтовому каналу и 1 А по 3,3-вольтовому. Что очень неплохо, особенно в совокупности.
Больше о плате сказать нечего, переходим к установке софта и её тестированию.
Тестирование платы
Поскольку плата интегрированная и на ней практически нет свободного места, да и разводка высокочастотной части ESP8266EX сделана на ней же, то поначалу возникли сомнения в корректной и беспроблемной работе всего этого хозяйства.
Забегая немного вперёд скажу, что несмотря на мои опасения, всё работает стабильно и так как и ожидалось. Подключаем переключателями на плате Atmega2560 к USB — получаем Arduino Mega, подключаем ESP8266EX к USB — получаем ESP8266, переключаем в режим соединения Atmega2560 с ESP8266EX получаем связь между чипами по последовательному интерфейсу. Всё работает ровно так, как описано в документации и именно так, как это интуитивно ожидается.
Огромный плюс этого решения в том, что разработчики позаботились о согласовании логических уровней сигналов всех компонентов системы. Тот, кто вручную пытался сконфигурировать модуль ESP8266 и корректно подключить все подтягивающие резисторы, меня поймёт. Здесь таких проблем нет, вся ваша работа сводится к щёлканью переключателями на плате в соответствии с инструкцией от производителя.
Нагрузочное тестирование
Как оттестировать плату? Можно загрузить какой-нибудь стандартный скетч, но это будет тест ни о чём. Такой вариант может нормально работать, а в боевых условиях система будет давать сбои. Поэтому в качестве жёсткого нагрузочного теста была выбрана работа обоих частей под управлением соответствующих версий Arduino Mega Server. Для Mega — Arduino Mega Server for Mega и для ESP8266 — Arduino Mega Server for ESP8266 в варианте M1.
Дистрибутив M1 был выбран в связи с тем, что на плате установлен всего 1 МБ флеш-памяти для ESP8266. Это, на мой взгляд, чуть ли не единственная промашка разработчиков — в будущих ревизиях платы я бы порекомендовал им ставить чипы памяти на 4 МБ. Разница в цене невелика, а возможностей при использовании версии с 4 МБ гораздо больше. Но поскольку есть версия AMS для систем с 1 МБ, то я не обратил особого внимания на этот момент и продолжил тестирование.
Что сказать? Включаем плату, заливаем софт и получаем два независимых сервера. Один проводной через Ethernet Shield и один беспроводной через Wi-Fi. Красота!
Отдельно хочется отметить, что даже добавление Ethernet Shield с картридером к этой и без того навороченной системе не вызвало никаких конфликтов и сбоев — всё просто заработало так, как и должно работать. И в некоторых случаях даже лучше, чем обычно — это первая плата на которой прошивка по воздуху ESP8266 проходила успешно в 100% случаев, на всех прочих платах и модулях время от времени наблюдаются сбои при такой перепрошивке.
И вот крутятся два сервера, нагружают плату, выполняют свои обязанности и… всё. Всё просто работает, даже сказать нечего, но это наверное самая лучшая похвала для любой технической системы.
Самое интересное
То, что я здесь описал интересно с чисто академической точки зрения: интересная плата, интересное техническое решение, но нас интересует конечно же её практическое применение. В чём же её практическая и прикладная изюминка?
В том, что одним переключением на плате можно соединить две её части (Mega и ESP) в одно целое и тем самым, во-первых, получить новое качество системы и, во-вторых, скомпенсировать врождённые недостатки каждой из отдельных её частей.
Начнем с ESP8266. Главным недостатком этого, в целом отличного, решения является катастрофическая нехватка выводов GPIO. Как говориться, раз, два и обчёлся. О чём думали разработчики этого чипа сказать трудно, но до выпуска ESP32 у них было немного больше времени подумать и в новом чипе они этот недостаток исправили. Но мы имеем дело именно с 8266.
Данная плата позволяет сделать ход конём и задействовать всю мощь Mega, а это, кроме всего прочего, 54 цифровых и 16 аналоговых выводов в ESP8266. То есть наш рахитичный ESP вдруг получает просто богатырские возможности по работе с датчиками, актуаторами и прочей периферией. Получается, так сказать, малыш ESP на стероидах.
Это только один из возможных вариантов использования платы, лежащий на поверхности.
Теперь посмотрим на Mega. Ей совсем не помешает беспроводной интерфейс и возможность взаимодействовать с Wi-Fi устройствами, что и может ей обеспечить интеграция с ESP частью системы. И при этом остаётся возможность параллельной работы по проводному Ethernet интерфейсу.
И это тоже только один из возможных вариантов применения этой платы, лежащий на поверхности.
Ну и различные варианты мостов: Ethernet – Wi-Fi, nRF24 – Ethernet, nRF24 – Wi-Fi, nRF24 (1) – nRF24 (2), nooLite – Wi-Fi, nooLite – Ethernet, nooLite (1) – nooLite (2) и т. д. и т. п. до бесконечности. Можно маршрутизировать сигналы с десятков подсистем с которыми работает Arduino Mega Server между двумя частями платы и интерфейсами, подключёнными к ним.
Даже не знаю, что сказать. Очень круто.
Технические подробности
Теперь немного о технических подробностях. Вы видите таблицу в которой представлены все возможные режимы работы платы и показаны все возможные положения переключателей на ней. Рассмотрим кратко каждый режим.
Arduino Mega 2560
Самый простой режим работы платы, в таблице он обозначен как режим 3. Если установить переключатели 3 и 4 в положение ON, а остальные в положение OFF, то мы получим обычную Arduino Mega 2560. Ничего интересного, ради этого не стоило покупать эту плату, можно было купить обычную Мега.
ESP8266
Тоже не очень интересный режим работы. В таблице он разделён на два подрежима, обозначенные как 1 (загрузка скетча в ESP) и 2 (режим соединения ESP с USB). Это все функционал стандартной ESP8266 и ради такого использования тоже не стоило покупать эту плату, можно было обойтись обычным модулем ESP.
Все независимы
Этот вариант под номером 6 мы тоже не рассматриваем, поскольку в нём все связи между частями платы разорваны и нам он точно ни для чего не может пригодиться.
Связь между Mega и ESP
В этом режиме, обозначенным как 5, связь установлена между Mega и ESP по последовательному интерфейсу, а связи с конвертером USB-TTL нет. На ESP задействован стандартный Serial, а на Mega не менее стандартный Serial3. Связь устойчиво и беспроблемно работает на скорости 115200. Это довольно специфичный режим работы, когда ни у одного контроллера нет связи по USB. И поэтому он нам тоже не очень интересен.
Связь между Mega и ESP и одновременно Mega и USB
А вот это то, что называется козырной режим. Мы получаем всё и сразу — связь Mega по USB и возможность заливать скетчи в Мегу и контролировать её работу по тому же USB, возможность связи между Mega и ESP и возможность при этом загружать скетчи в ESP8266 и контролировать её работу в USB интерфейсе… Меги! То есть полный фарш, прямо не отходя от кассы.
Это и есть единственный правильный режим работы из всех перечисленных в таблице. Запомните его выигрышный номер который равен четырём. В конфигурации переключателей на плате он также выглядит красиво — 1, 2, 3, 4 находятся в положении ON, остальные — OFF.
Внимательный читатель спросит: как это мы можем загружать скетчи в ESP8266, если USB порт занят подключением к Mega-части системы? И это правильный вопрос, ответ — никак. А почему же тогда вы пишите, что мы в этой конфигурации можем загружать скетчи в ESP8266? Потому, что Arduino Mega Server имеет возможность загружать скетчи по воздуху прямо из Arduino IDE нажатием пары кнопок, так что всё правильно — мы имеем полный фарш, работает всё и сразу.
Как же быть тем, кто хочет использовать плату без Arduino Mega Server? Вариантов всего два: либо постоянно щёлкать переключателями, либо добавлять в свои разработки возможность загрузки скетчей по воздуху. Мне лично больше нравится второй вариант.
Настройки Arduino IDE
Настройки Arduino IDE для Меги не вызывают каких-либо вопросов, там всё стандартно, а для ESP8266 приведу скриншот меню с установками под конкретную реализацию ESP-части на плате RobotDyn. У себя вы должны установить те же параметры, за исключением номера порта — в вашей системе он скорее всего будет иметь другое значение.
Arduino Mega Server для RobotDyn Mega + ESP8266
Для этой платы выпущена специальная двойная версия Arduino Mega Server, которая содержит сразу два сервера, оптимизированных специально под эту плату. Это внешняя сторона вопроса, оба эти сервера содержат стандартный функционал и могут использоваться для любых ваших проектов.
Вы можете использовать оба эти сервера независимо друг от друга на одной плате, а можете дописать нужную вам функциональность и использовать их в тандеме и в режиме моста между двумя сетями и любыми подключёнными к серверам интерфейсами.
В первой сборке Arduino Mega Server для платы RobotDyn Mega + ESP8266 находится тестовый пример взаимодействия двух контроллеров по Serial интерфейсу. Это демонстрация возможностей технологии на основе которой вы можете разрабатывать ваши собственные решения.
Теперь немного подробнее о разработке протокола взаимодействия двух контроллеров по Serial интерфейсу вообще и на этой плате в частности.
Разработка протокола
Что нам стоит дом построить? Нужно разработать протокол взаимодействия между двумя частями системы по Serial интерфейсу? — разработаем, тут главное чётко и правильно поставить задачу. Для демонстрации тандемной работы системы выведем индикаторы работы «партнёра» в приборную (dash) панель каждого сервера.
Немного о терминологии. Для Меги «партнёром» является ESP8266, для ESP8266, соответственно, Мега.
Когда партнёр работает — индикатор будет светиться зеленоватым цветом, когда не работает — красным и серым, когда состояние неопределённо. Это очень удобно — при работе будет сразу видно в каком состоянии находится альтер эго вашей системы.
Для практического решения этой задачи существует ровно миллион способов, мы выберем следующий: коммуникационные блоки обоих частей системы будут идентичными, взаимодействие будет происходить в полнодуплексном режиме, информационные блоки будут иметь простой и понятный формат:
?параметр=значение
или
?команда
Это просто тестовый пример для решения поставленной задачи, вы можете доработать этот протокол взаимодействия или написать собственный, подходящий для ваших задач. Но на уже реализованном протоколе можно не только контролировать состояние партнёра, но и применять его для множества других целей, например, передавать состояние пинов контроллера, состояние датчиков или посылать управляющие команды партнёру.
Конкретно в нашей системе команды будут выглядеть следующим образом:
?mega=1 — Мега посылает данные о своей работоспособности. Параметр «mega», значение «1».
?esp=1 — ESP8266 посылает данные о своей работоспособности. Параметр «esp», значение «1».
Итак, для примера рассмотрим реализацию протокола для Мега-части системы.
Стандартным образом инициализируем модуль AMS и хардверный Serial3 Меги на скорости 115200.
void robotdynInit() {
Serial3.begin(115200);
modulRobotdyn = MODUL_ENABLE;
started("RobotDyn", true);
}
Проверяем состояние порта Serial3 и в случае прихода данных от партнёра формируем строковую переменную serialReq, содержащую пришедшие данные или команды.
void checkSerial() {
while (Serial3.available() > 0) {
if (sFlag) {
serialReq = "";
sFlag = false;
}
char c = Serial3.read();
if (c == 10) {
sFlag = true;
parseSerialStr();
}
else if (c == 13) {
// skip
}
else {
if (serialReq.length() < MAX_SERIAL_REQ) {
serialReq += c;
}
} // if
} // while (Serial3.available() > 0)
} // checkSerial()
Парсим команды и данные и в случае прихода информации о состоянии партнёра принимаем меры в виде изменения состояния переменной esp.
void parseSerialCmd() {
String command, parameter;
if (serialReq.indexOf(F("?")) >= 0) {
int pBegin = serialReq.indexOf(F("?")) + 1;
if (serialReq.indexOf(F("=")) >= 0) {
int pParam = serialReq.indexOf(F("="));
command = serialReq.substring(pBegin, pParam);
parameter = serialReq.substring(pParam + 1);
} else {
command = serialReq.substring(pBegin);
parameter = "";
}
if (command != F("esp")) {
Serial.print(F("command/parameter: "));
Serial.print(command);
Serial.print(F("/"));
Serial.println(parameter);
}
if (command == F("esp")) {
if (parameter == F("1")) {
esp = 1;
espTimer = millis();
} else {
esp = 0;
}
}
} // if (request.indexOf(F("?")) >= 0)
} // parseSerialCmd()
Вы можете с лёгкостью добавить обработку любых других команд, изменив и дополнив соответствующий участок кода.
if (command == F("esp")) {
if (parameter == F("1")) {
esp = 1;
espTimer = millis();
} else {
esp = 0;
}
В случае использования в собственных проектах и парсинга множества команд и данных этот участок кода лучше оформить в виде соответствующих функций.
Осталось только рассмотреть стандартную функцию модуля AMS, отвечающую за его работу. Сначала проверяется состояние порта, затем каждые четыре секунды посылается команда партнёру о том, что Мега жива и работает и проверяется время, прошедшее с момента прихода последних данных от партнёра и если оно превышает 8 секунд, то делается вывод, что партнёр не работает.
void robotdynWork() {
checkSerial();
if (cycle4s) {
Serial3.println(F("?mega=1"));
if (millis() - espTimer > 8000) {
esp = 0;
}
}
}
Вот и вся магия. Правда, ничего сложного?
Полный код модуля, отвечающего за межсистемные коммуникации между Mega 2560 и ESP8266
/*
Modul RobotDyn
part of Arduino Mega Server project
*/
#ifdef ROBOTDYN_FEATURE
bool sFlag = true;
unsigned long espTimer = millis();
// Serial request
#define MAX_SERIAL_REQ 32
String serialReq = "";
void robotdynInit() {
Serial3.begin(115200);
modulRobotdyn = MODUL_ENABLE;
started("RobotDyn", true);
}
void printSerialStr() {
Serial.print("[");
Serial.print(serialReq);
Serial.println("]");
}
void parseSerialCmd() {
String command, parameter;
if (serialReq.indexOf(F("?")) >= 0) {
int pBegin = serialReq.indexOf(F("?")) + 1;
if (serialReq.indexOf(F("=")) >= 0) {
int pParam = serialReq.indexOf(F("="));
command = serialReq.substring(pBegin, pParam);
parameter = serialReq.substring(pParam + 1);
} else {
command = serialReq.substring(pBegin);
parameter = "";
}
// if (command != F("esp")) {
Serial.print(F("command/parameter: "));
Serial.print(command);
Serial.print(F("/"));
Serial.println(parameter);
//}
if (command == F("esp")) {
if (parameter == F("1")) {
esp = 1;
espTimer = millis();
} else {
esp = 0;
}
}
} // if (request.indexOf(F("?")) >= 0)
} // parseSerialCmd()
void parseSerialStr() {
if (serialReq[0] == '?') {
parseSerialCmd();
} else {
printSerialStr();
}
}
void checkSerial() {
while (Serial3.available() > 0) {
if (sFlag) {
serialReq = "";
sFlag = false;
}
char c = Serial3.read();
if (c == 10) {
sFlag = true;
parseSerialStr();
}
else if (c == 13) {
// skip
}
else {
if (serialReq.length() < MAX_SERIAL_REQ) {
serialReq += c;
}
} // if
} // while (Serial3.available() > 0)
} // checkSerial()
void robotdynWork() {
checkSerial();
if (cycle4s) {
Serial3.println(F("?mega=1"));
if (millis() - espTimer > 8000) {
esp = 0;
}
}
}
#endif // ROBOTDYN_FEATURE
Как выглядит вывод в Serial мониторе
В Serial мониторе Mega 2560 вывод, данные и команды c ESP-части системы выглядят совершенно также, как и его собственные. Для того, чтобы отличать вывод партнёра от вывода Меги, его данные заключаются в квадратные кавычки. В данном случае вы можете видеть перезагрузку ESP8266 и лог загрузки AMS в Serial мониторе Меги.
И лог работы собственно обмена командами между двумя частями системы по Serial интерфейсу. Вы видите вывод ESP8266 с информацией о декодировании данных о состоянии Меги в Serial интерфейсе самой Меги, заключённый в квадратные кавычки.
Красота в интерфейсе
Теперь немного о том, как всё это выглядит в интерфейсе Arduino Mega Server. Для начала приведу скриншоты обеих частей системы в работе.
Эллипсами обведены надписи, идентифицирующие контроллер и ту часть системы с которой вы работаете в данный момент. Кружками обведены индикаторы, которые показывают состояние партнёра. В данный момент всё в порядке, обе части системы нормально работают и нормально взаимодействуют между собой по внутреннему интерфейсу. Если что-то пойдёт не так, то вы узнаете об этом максимум через 8 секунд.
Что-то пошло не так. ESP8266 получила по воздуху апдейт прошивки и Мега-часть системы зафиксировала момент её перезагрузки. Через несколько секунд работа ESP-части системы возобновится и индикатор перестанет гореть красным цветом.
Для удобства, при наведении курсора мышки на индикатор состояния партнёра появляется подсказка и возможность кликнуть по нему и в отдельном окне откроется интерфейс второй части системы, в данном случае ESP-части. Это сделано для удобства, вы в любой момент можете одним кликом открыть интерфейс второй части системы.
Идеи для проектов
Теперь немного о том, что можно из всего этого сделать, обладая толикой фантазии. Обычная плата, совершенно неброская на первый взгляд, позволяет делать множество совершенно необычных и интересных вещей. Особенно это касается сочетания с Arduino Mega Server.
Итак, первое, что приходит в голову:
Проброс данных с датчиков между контроллерами. В обе стороны и в неограниченном количестве. Это одна система, обладающая достоинствами обеих своих частей, причём возможности не просто складываются, а наблюдается то, что называется синергетическим эффектом.
Мост между интерфейсами. Arduino Mega Server может работать со множеством интерфейсов и эта система позволяет как угодно маршрутизировать данные и команды между любыми подключёнными проводными и беспроводными интерфейсами.
Работа в одной сети, когда Мега посредством Ethernet Shield, а ESP8266 через Wi-Fi взаимодействуют с проводными и беспроводными устройствами в одной сети.
Работа в разных сетях, когда Мега подключена к проводной Ethernet, а ESP8266 через Wi-Fi к другой сети и система маршрутизирует команды и данные из одной сети в другую.
Вывод одной части системы в интерфейсе другой. Через Ethernet стандартными веб-приёмами или через внутреннее Serial соединение.
Отладка. Одна часть системы может выступать отладчиком и тестером другой части системы по вашей программе.
Сторожевой таймер. Каждый контроллер может выступать неким подобием сторожевого таймера (Watchdog) по отношению к другому.
Логирование сбоев. Каждый контроллер может вести логи работы своего партнёра, составлять статистику и докладывать о тревожных ситуациях.
База данных для ESP8266. При помощи этой системы можно организовать что-то вроде SQL базы данных на Меге для ESP8266. ESP занимается своей работой, а Мега выступает в качестве системы хранения данных (до 32 ГБ).
Перепрошивка друг друга. Контроллеры могут динамически перепрошивать друг друга в соответствии с заложенной логикой или по приходу внешней управляющей команды.
Подключение модулей. Контроллеры могут подключать различную периферию у которой есть проблемы с подключением к какой-нибудь одной части системы.
И так далее и тому подобное, я думаю пытливый читатель сможет самостоятельно придумать множество не менее интересных способов использования этой системы.
Заключение
На мой взгляд, это очень интересное решение и мы должны сказать компании RobotDyn большое спасибо за такую интересную плату. Я, по крайней мере, говорю это совершенно искренне.
Скачать дистрибутив Arduino Mega Server для RobotDyn Mega + ESP8266 и лично убедиться в справедливости всего, что здесь написано, вы можете на официальном сайте проекта Arduino Mega Server в разделе загрузок.