Последовательная связь между ESP8266 и Arduino ( программное и аппаратное обеспечение )
Я хочу подключить Arduino ( любой из семейства 328P), который его 5v, с ESP8266 (ESP-01, или даже NodeMCU или Wemos D1 mini), который является логикой 3v3. Моя цель состоит в том, что ESP8266 будет отвечать за сообщения MQTT и другие удаленные возможности, в то время как плата Arduino будет отвечать за переключатель ВВЕРХ/Выключение/вниз и 2 реле ( для надежности у меня скорее есть эта настройка ). Оба кода MCU написаны мной с помощью Arduino
Я знаю 2 основных способа: делитель напряжения и переключатель уровня ( и 3-й будет использовать логику 3v3 в качестве pro-mini - но давайте пока оставим ).
Мои вопросы:
А) Требуется ли Rx
Tx
напряжение, чтобы быть одинаковым ( некоторые онлайн-учебники игнорируют это вообще )? если да, то нужно ли это в обоих случаях ?
Б) В некоторых учебниках упоминается, что использование делителя напряжения создает некоторые помехи связи. Это верно и/ или актуально для использования, как объяснено ?
В) Рекомендуется ли библиотека SofwareSerial (опять же - надежность ).
@Guy . D, 👍0
2 ответа
Лучший ответ:
А) Нужно ли Rx Tx, чтобы напряжение было одинаковым ( некоторые онлайн-учебники вообще игнорируют это )? если да, то нужна ли она в обоих направлениях ?
Дело в том, что часто микроконтроллеры 3,3 В не могут переносить напряжения значительно выше этого. Так что подключение 5 В может повредить ему. Я видел довольно много дискуссий в Интернете о том, являются ли платы ESP толерантными к 5 В или нет, но я не видел реального расследования в этом вопросе. Часто вы можете очень хорошо сойти с рук, подключив их напрямую, но никто не даст вам никаких гарантий на этот счет. Если вы хотите быть в безопасности, вам нужно добавить какой-то переход напряжения от Arduino TX к ESP RX. Другая линия (ESP TX - arduino RX) управляется ESP с напряжением 3,3 В, что нормально для Arduino (3,3 В достаточно для того, чтобы Arduino видел его как ВЫСОКИЙ), так что вам ничего не нужно на этой линии.
Б) В некоторых учебниках упоминается, что использование делителя напряжения создает некоторые коммуникационные помехи. Это правда и/ или релевантно для использования, как объяснено ?
Поскольку делитель напряжения пассивен, вы получаете дополнительные эффекты (паразитная емкость и индуктивность), которые ограничивают скорость передачи. Хотя у меня все еще была связь без ошибок с бодратами до 115200 (я не проводил тщательного расследования, это просто субъективный опыт). С электронной точки зрения лучше было бы правильное смещение уровня (которое использует транзисторы), но в большинстве случаев делитель напряжения также работает хорошо. Поэтому я бы сказал, что если вы не хотите использовать действительно высокие скорости передачи данных, то хорошо владеете делителем напряжения. Другие, конечно, также могут поделиться своим опытом на этом сайте.
Рекомендуется ли использовать библиотеку SofwareSerial (опять же - надежность ).
Как правило, аппаратный последовательный интерфейс всегда лучше, так как коммуникационный протокол полностью обрабатывается аппаратно. Коду просто нужно читать и записывать отдельные байты из/в аппаратные регистры. SoftwareSerial
используется, когда нет свободного для использования аппаратного последовательного интерфейса. И это накладывает некоторые дополнительные ограничения: вы можете слушать только один интерфейс SoftwareSerial в любой момент времени и не можете использовать с ним высокие скорости передачи данных (я думаю, что 115200 уже слишком высоки для него, в зависимости от используемого Arduino). Кроме того, это зависит от остальной части вашего кода (зависит от вашего использования ISR). Поэтому, если у вас есть неиспользуемый аппаратный последовательный интерфейс на плате Arduino, вы должны использовать его. В противном случае вы можете использовать
SoftwareSerial
.
Просто добавив немного плоти в отличный ответ @chrisl с некоторыми дополнительными техническими деталями:
Б) В некоторых учебниках упоминается, что использование делителя напряжения создает некоторые помехи связи. Это верно и/ или актуально для использования, как объяснено ?
Проблема здесь в том, что резисторы и емкость входного контакта образуют фильтр низких частот. Слишком высокое сопротивление и вы деформируете красивую чистую квадратную волну последовательных данных. Это ограничивает скорость передачи данных, которую вы можете надежно использовать. Уменьшите значения резистора, и вы увеличите частоту фильтрации, что позволит увеличить скорость передачи данных, но за счет увеличения тока, получаемого от вывода TX.
Рекомендуется ли использовать библиотеку SofwareSerial (опять же - надежность ).
Проблема SoftwareSerial двоякая: это очень "блокирующая" система, в которой MCU не может делать ничего другого, когда байт либо принимается, либо передается, и он очень разборчив в синхронизации, отчасти из-за этой блокировки. Есть два фактора, которые влияют на максимальную скорость, которую вы можете использовать: как быстро MCU может обрабатывать входящий сигнал, чтобы понять, что это такое, и как быстро MCU может обрабатывать этот декодированный сигнал, чтобы сохранить его в буфере.
В то время как можно надежно получить байт на 115200 бодах, проблема возникает при быстром получении нескольких байтов. Arduino не всегда может взять этот полученный байт и сохранить его в RX ringbuffer достаточно быстро, прежде чем стартовый бит следующего байта прибудет, поэтому он пропускает его. Это приводит к повреждению потока данных.
По этой причине я никогда не рекомендую больше, чем 9600 бод (или, может быть, 38400 в крайнем случае), чтобы дать Arduino больше времени для обработки байтов по мере их поступления. Однако это означает, что больше времени тратится на отправку или получение, что блокирует остальную часть вашей программы в течение этого времени дольше.
Также SoftwareSerial строго полудуплексный: когда вы получаете, вы не можете отправить, и когда вы отправляете, вы не можете получить. Это только действительно полезно в протоколе стиля "вызов-ответ", где переключение между отправкой и получением предсказуемо.
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как работает последовательная связь на Arduino?
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
Спасибо. Установка скорости 9600 для меня достаточно хороша, так как esp отправляет цифровые команды AUX в Arduino в виде 2 цифр и возвращает подтвержденное сообщение. Поэтому я не ожидаю ничего необычного., @Guy . D
Что касается программного обеспечения, как я уже сказал, - надежность на вершине, @Guy . D