Перейти к содержанию

Можно ли соединить UART Arduino и ESP32 напрямую?

Обновлено Редакция GAW

UART передаёт биты уровнями напряжения относительно общего провода (подробнее — в статье «UART»). У Arduino Uno на ATmega328P при питании 5 В единица на выходе — почти 5 В, у ESP32 — около 3,3 В, и пороги входов тоже разные.

Сравнение уровней

ПараметрATmega328P, 5 ВESP32, 3,3 В
Единица на входе (VIH)от 0,6 · VCC = 3,0 Вот 0,75 · VDD ≈ 2,48 В, но не выше VDD + 0,3 = 3,6 В
Ноль на входе (VIL)до 0,3 · VCC = 1,5 Вдо 0,25 · VDD ≈ 0,83 В
Единица на выходе (VOH)близко к 5 Вот 0,8 · VDD = 2,64 В

Пересчёт в вольты — наш, по табл. 5-3 Espressif и разд. 29.2 Microchip. Отсюда две проблемы.

  • Arduino TX → ESP32 RX. 5 В выше допустимых 3,6 В на входе ESP32. Простое решение — резистивный делитель, его номиналы считает калькулятор делителя напряжения.
  • ESP32 TX → Arduino RX. Гарантированные 2,64 В меньше 3,0 В, которые ATmega328P считает единицей. Делитель здесь не поможет — нужно повысить уровень.

Надёжный вариант

Двунаправленный преобразователь уровней решает обе задачи: TXS0108E питают от 3,3 В со стороны A и от 5 В со стороны B (условие VCCA ≤ VCCB), и он пропускает двухтактные линии UART со скоростью намного выше обычных 115 200 бит/с. Другие схемы согласования, в том числе на транзисторах, — в статье «Согласование уровней 3,3 и 5 В».

Похожие вопросы

Какой делитель поставить на RX ESP32?

Например, 1 кОм последовательно от TX Arduino и 2 кОм от RX ESP32 к земле. Наш расчёт: 5 · 2 / 3 ≈ 3,33 В — ниже предела 3,6 В и выше порога единицы 0,75 · 3,3 ≈ 2,48 В. Резисторы в единицы килоом не заваливают фронты на скоростях до 115 200 бит/с (наш вывод).

Почему соединение Arduino и ESP32 «на столе» работает без преобразователя?

Потому что 2,64 В — это гарантированный минимум при нагрузке, а без нагрузки выход ESP32 обычно ближе к 3,3 В, что выше порога 3,0 В. Но гарантии даташита нет, а вход ESP32 под 5 В работает за пределом допустимого — такую связь не оставляют в готовом устройстве (наш вывод).

Нужно ли соединять земли Arduino и ESP32?

Да, UART передаёт уровни относительно общего провода: без соединения GND плат приёмник не знает, где ноль, и линия не работает или работает со сбоями.

Источники

  1. Espressif. ESP32 Series Datasheet v5.3 — табл. 5-3, DC Characteristics (3,3 В, 25 °C): VIH от 0,75 · VDD до VDD + 0,3 В, VIL до 0,25 · VDD, VOH не ниже 0,8 · VDD, VOL не выше 0,1 · VDD
  2. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P megaAVR Data Sheet (DS40002061B) — разд. 29.2, DC Characteristics: VIH не ниже 0,6 · VCC при VCC 2,4–5,5 В, VIL до 0,3 · VCC
  3. Texas Instruments. TXS0108E 8-Bit Bi-Directional, Level-Shifting, Voltage Translator for Open-Drain and Push-Pull Applications (SCES642L) — разд. 5.3: VCCA 1,4–3,6 В, VCCB 1,65–5,5 В, VCCA ≤ VCCB; разд. 5.6–5.9: двухтактные линии до десятков Мбит/с

Нашли ошибку?