Многие современные микроконтроллеры легко программируются через USB порт. А если его нет, будет ли все просто?

Плата Arduino Wi-Fi представляет собой составной девайс два в одном: обычный Arduino UNO (на чипе ATmega328P) и Wi-Fi модуль (ESP8266 ). Каждое из устройств имеет свой процессор, свою оперативку и свой EEPROM (энергонезависимая память). И программируется все это, соответственно, двумя скетчами, которые выполняются одновременно и независимо друг от друга.

Такая архитектура оправдана — ATMega может выполнять критические по времени задачи в то время как ESP подвисла ожидая таймаута, например при оборвавшемся TCP соединении во время сессии.

Взаимодействовать между собой устройства могут через UART интерфейс (Universal asynchronous receiver/transmitter – универсальный асинхронный приемник — передатчик). Используются 2 провода. Tx одного устройства соединяется с Rx другого и наоборот.

Также на плате есть чип CH340, это UART USB-TTL преобразователь, с одной стороны у него UART интерфейс, а с другой USB интерфейс для связи с компьютером. Для переключения соединений между устройствами используются DIP-переключатели:

1

ATMega - ESP

2

3

ATMega - CH340

4

5

ESP - CH340

6

7

GPIO0 на ESP– GND

8

не используется

Так вот, при монтаже платы я нечаянно оторвал USB порт не успев ничего запрограммировать.

Первая идея была подключить питание через пины и хоть как-нибудь подпаять Data+ и Data-, а после прошивки пайку убрать. После осмотра места проcишествия через большую лупу стало ясно, что медвежачьими лапами здесь ничего не сделаешь.

Место крепления USB.
Место крепления USB.

Вторая идея — прошить через SPI интерфейс. В интернете есть много сайтов, где процесс подробно описан.

  1. Берем свободную плату, у меня Arduino UNO.

  2. Прошиваем ее прошивкой ArduinoISP. Это программный программатор, найти эту прошивку можно в Arduino IDE в меню File – Examples - ArduinoISP.

  3. Соединяем 6-ю проводами:

    программатор

    целевая плата

    5V

    5V

    GND

    GND

    10

    RST

    11

    11 (MOSI)

    12

    12 (MISO)

    13

    13 (SCK)

    (На иной целевой плате нужно использовать другие пины, например, для Arduino Mega: MOSI - 51, MISO - 50, SCK - 52).

  4. В Arduino IDE выбираем программатор: Tools - Programmer - Arduino as ISP.

  5. Прошиваем: Sketch - upload using Programmer.

  6. Наслаждаемся.

Остается лишь прошить ESP8266, но здесь проблема: нужные пины на плату не выведены! Нужно прошивать прямо через TX-RX.

Перелопатив с десяток форумов я наконец понял, как нужно подключить ESP для прошивки. Схема эта сработала, но не сразу.

1. Берем свободную плату (Arduino UNO). Наличие или отсутствие прошивки на ней не играет роли — она будет использована в роли USB – UART моста.

2. Замыкаем на ней RST и GND. Это нужно чтобы микроконтроллер не стартовал, не посылал ничего в UART и не реагировал на входящие сигналы.

3. Соединяем 4-мя проводами:

Arduino UNO (UART-USB мост)

целевая плата

5V

5V

GND

GND

TX

TXD (на ESP!)

RX

RXD (на ESP!)

Выводы ESP8266 на плате Arduino Wi-Fi Uno
Выводы ESP8266 на плате Arduino Wi-Fi Uno

4. На целевой плате соединяем CH_PD и 3.3V. Это переводит ESP в режим Enabled.

5. На целевой плате соединяем GPIO0 и GND. Для этого 7-ой свитч переводим в положение ON (остальные свитчи переводим в положение OFF). Это включает режим программирования ESP.

6. Прошиваем через Arduino IDE.

Почему TX нужно подключать к TX, RX к RX а не наоборот?

Давайте посмотрим на схему.

Схема подключения UART ESP8266 к Arduino UNOO
Схема подключения UART ESP8266 к Arduino UNOO

Получается, что на самом деле TX от ESP взаимодействует с RX чипа CH340 на плате-мосте и наоборот.

Учитывая, что рабочее напряжение Arduino UNO 5V, а у ESP – 3,3V нужно ли согласовывать питание по линиям TX и RX?

Мой ответ — нет. И вот почему.

1. Питание 5V для ESP было бы губительным, но мы подключили 5V к входу 5V общей платы, а там есть преобразователь который питает ESP правильным напряжением.

2. GPIO выводы ESP8266 являются 5V - толерантными. Правда, следует оговориться, что встречается и противоположное мнение. Его сторонники на форумах обычно приводят цитату из документации:

«All digital IO pins are protected from over-voltage with a snap-back circuit connected between the pad and ground. The snap back voltage is typically about 6V, and the holding voltage is 5.8V. This provides protection from over-voltages and ESD. The output devices are also protected from reversed voltages with diodes.»

Эту формулировку считают неоднозначной, более того, есть мнение, что это перевод с китайского, и сделан он с искажением смысла.

3. Для Arduino UNO напряжение от 0 до 1,5V считается логическим уровнем 0 (LOW), а напряжение 3V и выше — 1 (HIGH). Таким образом, напряжение 3,3V попадает в диапазон HIGH, и никакие преобразования здесь тоже не нужны.

Схема должна была работать, но... я запускал прошивку много раз, но ничего не получалось.

Я перезапускал IDE, перезагружал ноутбук, пытался нажимать Reset ESP в разные моменты около начала прошивки, но не помогало ничего.

Тогда я обратил внимание на поведение светодиодов TX и RX на Arduino UNO (мосте). Они мигали полностью синхронно. Мне это показалась странно, как будто TX-RX были соединены прямым проводом. Я еще раз проверил подключение, оно полностью соответствовало описанной выше схеме и контакты были надежными.

Тогда я поменял провода местами, соединил TX - RXD и RX - TXD.

Внимание, так делать нельзя! Есть риск короткого замыкания на соединении RX-TXD (помните, в нашей схеме контакт, обозначенный RX на плате-мосте на самом деле ведет к TX чипа CH340).

Я знал, что это не правильно, но все таки сделал это от безнадежности. В конце концов плата без USB порта все равно неисправна, плата arduino UNO покупалась для опытов а голове крутилась шуточная мантра: «опыт инженера растет пропорционально выведенному из строя оборудованию». В момент попытки прошивки светодиод TX на плате-мосте ярко горел а RX молчал. Ничего особенного не произошло. Я поменял провода обратно, выключил/включил питание и вдруг увидел в Serial monitor мусор, который выбрасывает ESP8266 при старте в режиме программирования.

Появилась надежда… нажимаю кнопку прошить — и, ура, все прошилось.

Резюме: загрузить скетчи на Arduino Wi-Fi без USB порта можно. Но без бубна, конечно, не обошлось.

Спасибо за внимание!

Комментарии (7)


  1. SamOwaR
    13.01.2024 10:05
    +5

    Теоретически, D+/D- c SUB разъёма идут сразу на ноги CH340, т.е. можно пробовать подпаяться туда.


    1. alextrof94
      13.01.2024 10:05

      Мне так вообще кажется, что вон те 2 резистора как раз воткнуты на d+/d-, а к ним ещё проще подпаяться, нежели к ch340...


  1. Kudriavyi
    13.01.2024 10:05
    +9

    Краткое содержание:

    1. Я оторвал usb раз'ем на ардуине.

    2. Подключил другую ардуину как usd-uart преобразователь.

    3. Оказалось, что перепутал rx tx (как неожиданно, никто так не делал)

    4. Подключил правильно rx tx и все заработало


  1. mastergril
    13.01.2024 10:05
    +2

    Там даже на фото видно два резистора 0603 на линиях дата usb подпаяться к ним можно даже дедушкиным паяльником эпсн.


    1. NutsUnderline
      13.01.2024 10:05

      так сказано что медвежими лапами


  1. azunai
    13.01.2024 10:05
    +2

    Куда катится хабр. Давайте я запилю статью как чищу картошку не картофелечисткой, а ножом. С каждым может случиться.

    Картинка
    -2 слоя вниз дремелем, пайка к дороге волоском мгтф на пятак. Флюс отмыл позже.
    -2 слоя вниз дремелем, пайка к дороге волоском мгтф на пятак. Флюс отмыл позже.


  1. VickyVise
    13.01.2024 10:05

    В названии как будто планировалось прошить ардуино через wi-fi.