ESP01, подключенный к Arduino, не может читать данные из UART при подключении к внешнему источнику питания.

У меня есть Arduino Uno, подключенный к модулю NodeMCU ESP01, обменивающийся данными через последовательные контакты. NodeMCU питается от вывода 3,3 В Arduino. Моя идея состоит в том, что ESP01 получает сообщения MQTT, отправляет их на Arduino через последовательный порт и ждет ответа Arduino, а затем публикует сообщения MQTT обратно.

Если я подключаю Arduino от USB моего компьютера, все работает нормально.

Если я использую внешний источник питания 12 В/1 А, ESP01 может публиковать и получать «стандартные» сообщения MQTT (то есть он не отправляет сообщения на Arduino и не ожидает ответа). Он просто получает и напрямую отвечает (без участия Arduino).

Проблема возникает, если ESP необходимо запросить результат у Arduino.

Arduino может читать и писать (я вижу правильный текст в консоли) в последовательный порт, но у NodeMCU ESP01 возникают проблемы с публикацией сообщений MQTT. Иногда он ничего не публикует (вероятно, ESP не может прочитать то, что Arduino отправляет по последовательному порту), иногда публикует уничтоженные символы (случайный текст).

Похоже, что ток, необходимый модулю ESP, недостаточно велик, но для меня это не имеет смысла, поскольку внешний источник питания должен обеспечивать больший ток, чем USB. Есть идеи?

Это моя схема:

Код:

В моем ESP01 у меня есть следующий прослушиватель MQTT onMessage. Если тема представляет собой запрос для Arduino (тема проверяется функцией handleQuery), то тема отправляется UART на Arduino, который прослушивает определенные строки в функции loop. Когда Arduino получает строку, он выполняет некоторую логику и записывает ответ обратно в ESP через UART (Serial.print()).

После того как ESP отправляет сообщение в Arduino, он устанавливает прослушиватели для строк, которые заканчиваются символом %. Если ответ от Arduino получен, он публикует сообщение MQTT с результатом.

function onMessage(client, topic, message)
    if handleQuery(topic.."+"..message) then
        uart.write(0,topic.."+"..message)

        uart.on("data","%", function(data)
            if data=="quit%" then
                uart.on("data") -- unregister event
            end

            if data ~= "quit%" then
                client:publish(topic.."/response","REPLY:"..data,0,0)
            end
        end,0)
    else
        client:publish(topic.."/response","REPLY: Invalid query",0,0)
    end
end

Ответ от Arduino имеет следующий формат сообщения:

 REPLY:<value>%
 quit%

Это решение работает, если Arduino подключен к USB моего настольного компьютера. Не работает, если питается от внешнего источника питания. Похоже, что ESP не может прочитать то, что Arduino написал в UART с помощью Serial.println(), если питание осуществляется от внешнего источника питания.

Понятия не имею, почему, ведь источник питания должен выдавать больший ток.

Изменить:

Я использую следующий клон Arduino: ссылка на eBay

Я попытался подключить ESP01 к выходу 5 В Arduino с помощью стабилизатора напряжения (5 В должно обеспечивать больший ток), и опять же, если USB подключен, ESP без проблем читает сообщения UART. Если Arduino питается от внешнего источника питания, ESP считывает поврежденные символы. Единственная разница в том, что эти поврежденные персонажи кажутся всегда одинаковыми. Так что, возможно, какие-то проблемы с кодированием (?) или что-то в этом роде.

Пока похоже, что низкое значение тока не является проблемой.

Изменить 2

Я удалил из своего кода оператор print() из кода ESP/LUA, который использовал для «отладки». Он напечатал для меня несколько сообщений. Кажется, немного почистил трафик на Serial линии.

Теперь в большинстве случаев я получаю правильные символы, но первый символ отсутствует, поэтому вместо:

LOW%, я получаю OW%
ВЫСОКИЙ% Я получаю IGH%
29,53% Получаю 9,53%

И время от времени я получаю String =]�quit%.

Возможно, в каком-то входном буфере возникла проблема(?).

, 👍4

Обсуждение

Выложите, пожалуйста, схему или схему. Также укажите свой код., @Dat Ha

Контакт 3,3 В на Uno рассчитан только на [50 мА](https://www.arduino.cc/en/Main/ArduinoBoardUno#techspecs). Вам следует предоставить источник питания, который может обеспечить ток не менее 200 мА., @gre_gor

@gre_gor, но почему это работает, когда Arduino питается от USB?, @n0hepe

Как упомянул @gre_gor, Arduino UNO не способен выдавать ток более 50 мА. Тот факт, что он работает на большинстве USB-TTL, заключается в том, что они могут выдавать ток более 300 мА., @martin

Вы не можете электрически соединить контакты Arduino 0 и 1 одновременно с ESP8266 и последовательным монитором. Вам придется выбрать тот или иной вариант или переместить ESP8266 на другие контакты., @Chris Stratton

@ChrisStratton Я не хочу регулярно использовать последовательный монитор, только для «отладки». Тогда я вижу на последовательном мониторе только то, что Arduino печатает на ESP01, я не ввожу туда никаких команд., @n0hepe

Ардуино выводит и должен получать сигнал ввода-вывода 5 В. esp8266 использует сигналы ввода-вывода 3,3 В. Выходного напряжения 3,3 В от esp8266 может быть недостаточно для этого. Я также согласен с другими, что питания Arduino 3,3 В для 8266 недостаточно. Wi-Fi, кажется, потребляет довольно много сока. В своем последнем проекте я использовал адаптер esp8266, который нашел на Amazon. Он преобразует напряжение питания 5 В в напряжение 3,3 В, а также напряжение ввода-вывода на 8266 и обратно, а также обеспечивает контакты, совместимые с макетом. Найдите адаптер esp01. Около 5 долларов, если я правильно помню., @john D.

Еще одна мысль.... на esp8266 мне пришлось изменить скорость передачи данных, чтобы он получал правильные данные. После того, как вы увидите esp8266 на последовательном мониторе на скорости 115200, команда для изменения скорости: AT+UART_DEF=9600,8,1,0,0, @john D.


1 ответ


1

Используйте подходящий переключатель уровня на линиях RX и TX. Вероятно, у вас маргинальный уровень сигнала.

Проблема не в напряжении на ESP8266. Это уровень сигнала на выходе ESP8266, который недостаточно высок для процессора Uno. Это предельное напряжение может привести к искажению символов. Часто нам это сходит с рук на этом уровне, но на самом деле это маргинальная ситуация. Это ненадежная вещь.

Спецификация для Vin high составляет 0,7xVcc. 0,7 х 5,0в = 3,5 вольт!!!!

Использование сигнала уровня 3,3 В часто работает с логикой 5 В, но не всегда. Я усвоил это на собственном горьком опыте. Я разработал продукт средней производительности, который использовал сигнал TX 3,3 В на логическом входе RX 5 В. Отлично работал в 30 прототипах. Но около 20% отказов при выполнении производственного заказа. Разные партии чипов приводили к разной высокой точке срабатывания.

Только потому, что практика использования 3,3-вольтовой логики в 5-вольтовых процессорах распространена, ее работа НЕ гарантирована. Прочтите спецификацию! Посчитайте .

,

В вопросе есть делитель напряжения на выводе RX esp8266. достаточно, @Juraj

Это не дает ответа на вопрос. Чтобы раскритиковать или запросить разъяснения у автора, оставьте комментарий под его публикацией. - [Из обзора](/review/low-quality-posts/41005), @Juraj

Uno покажет 3,3 В как ВЫСОКИЙ. всегда. официальные щиты используют его. например Ethernet Shield для чипа Wiznet и для SD-карты SPI MISO, @Juraj

@Юрай Это НЕ всегда работает. Это часто срабатывает. Это очень плохая практика, которая малоэффективна., @Rudy

извини, ты прав. а экран Ethernet имеет преобразование уровня для линий MISO, @Juraj