Многие современные микроконтроллеры легко программируются через 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ишествия через большую лупу стало ясно, что медвежачьими лапами здесь ничего не сделаешь.
Вторая идея — прошить через SPI интерфейс. В интернете есть много сайтов, где процесс подробно описан.
Берем свободную плату, у меня Arduino UNO.
Прошиваем ее прошивкой ArduinoISP. Это программный программатор, найти эту прошивку можно в Arduino IDE в меню File – Examples - ArduinoISP.
Соединяем 6-ю проводами:
программатор
целевая плата
5V
5V
GND
GND
10
RST
11
11 (MOSI)
12
12 (MISO)
13
13 (SCK)
(На иной целевой плате нужно использовать другие пины, например, для Arduino Mega: MOSI - 51, MISO - 50, SCK - 52).
В Arduino IDE выбираем программатор: Tools - Programmer - Arduino as ISP.
Прошиваем: Sketch - upload using Programmer.
Наслаждаемся.
Остается лишь прошить 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!) |
4. На целевой плате соединяем CH_PD и 3.3V. Это переводит ESP в режим Enabled.
5. На целевой плате соединяем GPIO0 и GND. Для этого 7-ой свитч переводим в положение ON (остальные свитчи переводим в положение OFF). Это включает режим программирования ESP.
6. Прошиваем через Arduino IDE.
Почему TX нужно подключать к TX, RX к RX а не наоборот?
Давайте посмотрим на схему.
Получается, что на самом деле 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 порта можно. Но без бубна, конечно, не обошлось.
Спасибо за внимание!