Загрузка кода Arduino, OTA, через подключенный ESP8266-12E с запущенным Esp-Link

1. Краткое предварительное введение

Я развертываю небольшую сеть из трех MEGA, соединенных шиной RS-485. К каждой MEGA подключается до 16 кнопок (настенных) и два реле-модуля (2 x 8-SSR; расположены рядом с MEGA). Цель состоит в том, чтобы управлять освещением всего дома (иначе: "включение" реле "R1" при нажатии кнопки "PB1").

На данный момент все работает нормально: MEGA могут «транслировать» события по BUS, и каждый узел способен правильно реагировать как на локально сгенерированные события, так и на события, поступающие из BUS.

Вышеупомянутая система работает уже пару недель и... Я начинаю бороться с "обновлением" кода: имея около 40 кнопок и 35 реле, распределенных по трем узлам, шансы "высоки", что некоторые требуется «настройка» (также известная как «метод проб и ошибок»).

Все становится еще хуже, когда... вы начинаете наслаждаться мощью системы (иначе: "Привет! Как насчет того, чтобы выключить ВСЕ освещение на первом этаже, нажав и удерживая кнопку PB1 ?"). Это, очевидно, требует «заплатки» к коду и связанной с этим «загрузки» MEGA. И так далее: МНОГО загрузок :-(

При наличии нескольких модулей ESP8266-12E я решил изучить возможность их использования в качестве своего рода «шлюза WiFi»: доступ к ним через WiFi; отправив им новый код; просим их любезно "залить" код на собственную MEGA, которая физически подключена через USART.

Как упоминалось во многих местах (включая комментарий к этому другому вопросу), я решил протестировать прошивка ESP-Link.

Поскольку у меня возникли проблемы с подключением MEGA к ESP, я обращаюсь к сообществу :-)

2. Задействованное оборудование

Что касается Arduino, то я использую обычную MEGA (китайскую, кстати), так что здесь я не буду вдаваться в подробности, потому что в этом нет ничего особенного.

Что касается ESP8266, строго говоря, я НЕ использую обычный ESP8266-12E, а отладочную плату. На самом деле, я использую Lolin NodeMCU v3, это, которое вы можете увидеть ниже:

Lolin NodeMCU v3

Я планирую подключить НАПРЯМУЮ USART ESP к USART MEGA. Это вызывает некоторые проблемы, описанные ниже.

3. Проблемы с напряжением GPIO

Одна из самых первых проблем, которую я рассмотрел, связана с напряжением GPIO. Хотя совершенно ясно, что:

  • Вывод GPIO на MEGA рассчитаны на 5 В и поэтому:

    • передатчик на стороне MEGA будет посылать ток 5 В;
    • RX на стороне MEGA ожидает получить ток 5 В;
  • Контакты GPIO на ESP8266-12E основаны на напряжении 3,3 В и поэтому:

    • TX на стороне ESP посылает ток 3,3 В;
    • RX на стороне ESP ожидает получить ток 3,3 В;

Я до сих пор НЕ могу понять, является ли это - в моем случае - реальной проблемой. Я говорю это, потому что:

1 — Передача данных с ESP на MEGA НЕ должна быть проблемой, так как сигнал HIGH/3,3 В, поступающий на MEGA, все равно должен распознаваться как HIGH от MEGA, поскольку он выше 2,5. В;

2 — Передача данных с MEGA на ESP МОГУТ быть проблемой, если пины на ESP НЕ устойчивы к напряжению 5 В

Что касается пункта 2) я тщательно обыскал все вокруг и нашел много противоречивых утверждений. В конце концов, я хотел бы «довериться» статье Hackaday: «Спросите Hackaday: является ли ESP8266 5V терпимым?» как в нескольких комментариях сообщается о различных полуофициальных заявлениях (например, сообщение от технического директора Expressif, отправленное из учетной записи Facebook, или сообщение от «внутреннего» Espressif) утверждая, что: «Да! Пины GPIO на ESP8266-12E устойчивы к напряжению 5 В»). Итак, я снова решил: "Хорошо! Отпусти меня! Давайте соединим их, напрямую, без переключателя уровней". И да: я знаю, что при таком решении я несколько рискую и... могу что-то "сжечь", особенно на стороне ESP.

Итак, вот мой:

Вопрос 1: Насколько я «смел» при прямом подключении TX/RX ESP8266 к RX/TX MEGA? Не могли бы вы предложить это? И почему?

4. Проблемы с землей

Работая над своей шиной RS-485, я понял, что очень важно иметь "общие точки соприкосновения" между моими MEGA. Это звучит понятно... в противном случае НЕ не существует общей ссылки для оценки одного и того же сигнала на разных устройствах.

Итак, теперь, когда у меня есть ДВА оборудования, и я подаю им ПИТАНИЕ через два разных источника (MEGA, напрямую подключенный к моему ПК, ESP, подключенный к другому ПК), мне интересно, :

Вопрос 2. Нужно ли соединять контакт GND на MEGA с контактом GND на ESP? Нужны ли двум платам для правильной работы общий/общий GND?

5. Строка RESET на MEGA

Чтобы инициировать прошивку нового скетча на стороне Arduino, ESP необходимо СБРОСИТЬ его. Для этого ESP нужно подключить к линии RESET MEGA. Вывод RESET четко показан на MEGA, поэтому подключение очень простое.

Тем не менее, после некоторых предварительных тестов... мне кажется, что ESP НЕВОЗМОЖНО сбросить MEGA.

Это привело к:

Вопрос 3. Способен ли выходной контакт ESP8266-12E (работающий при напряжении 3,3 В) правильно обрабатывать контакт RESET Arduino?

Я также спрашиваю, потому что, основываясь на официальной документации MEGA, я прочитал:

Reset PIN: Bring this line LOW to reset the microcontroller. 
Typically used to add a reset button to shields which block 
the one on the board.

6. Физические соединения

В официальной документации ESP-Link я прочитал о потенциальных проблемах ( к Arduino) с помощью ESP, так как сразу после перезагрузки ESP он отправляет на TX некоторые отладочные сообщения. Благодаря соединениям USART такие символы, передаваемые ESP на MEGA, принимаются MEGA. Мне непонятно, ПОЧЕМУ это может быть проблемой. Во всяком случае, в той же документации сказано: "... Если вам нужно избежать этого, вы можете настроить esp-link для замены контактов uart..."

Итак, в конце концов я соединил два устройства в соответствии с официальной документацией, поменяв местами контакты USART:

  • GPIO13: подключение к TX микроконтроллера
  • GPIO15: подключитесь к RX микроконтроллера и используйте раскрывающийся список, чтобы обеспечить правильную загрузку.
  • GPIO12: подключиться к RESET микроконтроллера
  • GPIO14: подключение к ISP микроконтроллера LPC/ARM (не используется с Arduino/AVR)
  • GPIO0: либо подтягивающий резистор 1–10 кОм до 3,3 В, либо зеленый светодиод "conn" через резистор 1–2,2 кОм до 3,3 В (указывает состояние Wi-Fi)
  • GPIO2: либо подтягивающий резистор 1–10 кОм до 3,3 В, либо желтый светодиод "ser" через резистор 1–2,2 кОм до 3,3 В (указывает на последовательную активность)

Поскольку мне (в настоящее время) не нужна обратная связь от светодиодов, я не использовал GPIO0 и GPIO2. Кроме того, поскольку у меня нет ARM, я не использовал GPIO14.

С помощью этого сопоставления я получил следующее соединение:

7. Результаты (...и проблемы)

Чтобы проверить, что происходит, я загрузил в Arduino простой скетч, который каждую секунду включает и выключает внутренний светодиод и выводит на консоль увеличивающийся счетчик. Вот оно:

unsigned long counter;

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  counter = 0;
}


void loop() {
  Serial.print("[");Serial.print(counter);Serial.print("] ");
  Serial.println("on");
  digitalWrite(13, HIGH);
  delay(1000);         
  Serial.print("[");Serial.print(counter);Serial.print("] ");
  Serial.println("off");
  digitalWrite(13, LOW);
  delay(1000);
  counter++;
}

Итак, из вывода консоли я вижу, правильно ли работает Arduino и перезагружается ли он.

На стороне ESP-Link я настроил контакт, как показано ниже:

С учетом всего вышеперечисленного, насколько я знаю, я экспериментировал со следующим:

  • Если я подключу ТОЛЬКО линию RESET и TX/MEGA к D7/GPIO13/ESP, я смогу успешно сбросить Arduino из веб-интерфейса ESP-Link и смогу увидеть «консоль» MEGA (я могу убедитесь в успешном сбросе, как счетчик в консоли Arduino, перезапустите);
  • Применить выше:

    • когда MEGA получает питание через полное USB-подключение от ПК;
    • когда MEGA подключена к ПК через USB-кабель только для питания;
    • когда MEGA питается от USB-блока питания, но в этом случае ТОЛЬКО при наличии общего заземления между ESP и MEGA
  • Как только я подключаю D8/GPIO15/ESP к RX/MEGA, все работает, но до следующего сброса. Если я «сбросил» Arduino через веб-интерфейс ESP-Link, он сбрасывался, но... никогда не загружался (я уверен, что «мигание» никогда не начнется).

Итак, последний вопрос:

Вопрос 4. Что не так с испытательным стендом выше? Почему D8/GPIO15/ESP прерывают процесс загрузки на MEGA? Я поменял местами контакт UART именно для того, чтобы избежать этого... насколько я понял...

Извините, что так длинно, но... я думаю, что детали имеют значение :-)

, 👍3

Обсуждение

у вас есть точки соприкосновения между платами? GPIO 4+5 ESP — это единственные контакты, которые имеют низкий уровень во время сброса + по умолчанию при загрузке; вы можете использовать эти два, чтобы избежать проблем с «загрузочным шумом». Вы можете использовать реле / МОП-транзистор для сброса мега без общих электрических соединений., @dandavis

@dandavis: Что касается «общего заземления», проблема с загрузкой (Arduino НЕ загружается должным образом после «сброса», когда ESP / TX подключен к Arduino / RX) сохраняется даже при общем заземлении. Что касается «реле / MOSFET» для перезапуска Arduino, обратите внимание, что это не нужно: я проверил, что ESP, безусловно, может перезагрузить Arduino. Проблема в том, что после перезагрузки Arduino «зависает» в процессе загрузки и никогда не запускает скетч. Как только я отключаю Arduino/RX и снова перезагружаю его (через ESP), процесс загрузки регулярно завершается. В настоящее время я изучаю проблемы, связанные с загрузчиком, даже оценивая его «обновление»., @Damiano Verzulli


1 ответ


1

Я успешно использовал прошивку ESP-link с esp-01 и Arduino Pro Mini.

Что касается ESP-01 и Pro Mini, вы можете узнать больше на моем запись в блоге. Я подключил GPIO 0 ESP-01 к выводу сброса Pro Mini, и Pro Mini можно сбросить с помощью веб-интерфейса ESP-Link. Я стараюсь использовать одинаковый уровень напряжения для обоих микроконтроллеров и одного источника питания. В моем примере Pro Mini управляет ESP-01 и, конечно же, разделяет общую основу.

Чтобы ответить на ваши вопросы.

  1. Я стараюсь этого не делать, так как ESP заявляет, что все контакты GPIO совместимы только с 3,3 В.

  2. Да, оба контроллера должны иметь общее заземление.

  3. Насколько я понимаю, RESET — это выходной контакт. При подключении к ESP8266 существует вероятность повреждения ESP.

  4. Не уверен, что ваша проводка правильная. Вы можете сослаться на мою схему подключения ESP и Arduino Pro Mini. В вашем случае я порекомендую переключатель уровня, чтобы предотвратить повреждение вашего ESP.

,