Arduino nano uart esp8266
Как подключить? Каждый из модулей имеет USB порт и может запитываться от компьютера, но рано или поздно им потребуется автономное питание. Надо решить эту задачу сразу.
Два варианта: у каждого модуля свой источник питания, или один на всех.
Подключил внешние 5 вольт на Vin обоих модулей, затем подключил USB к Arduino UNO. Пока все идет нормально.
Первое, что хотелось проверить, это соответствие уровней сигналов двух модулей.
Для первой программы я использовал пример использования библиотеки Software Serial
Исходный скетч для Arduino NANO
/* * RX is digital pin 10 (connect to TX of other device)
* TX is digital pin 11 (connect to RX of other device)
*/
#include
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() <
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) <
; // wait for serial port to connect. Needed for native USB port only
>
Serial.println(«Goodnight moon!»);
// set the data rate for the SoftwareSerial port
// я изменил на 115200)
mySerial.begin(115200);
mySerial.println(«Hello, world?»);
>
void loop() < // run over and over
if (mySerial.available()) <
Serial.write(mySerial.read());
>
if (Serial.available()) <
mySerial.write(Serial.read());
>
>
Сначала я «залил» программу в ESP8266:
1 — подключив компьютер к модулю через USB.
2 — в Arduino IDE выбрал COM порт (скорость 11520) и модуль NodeMCU 1.0.
3 — отсоединил Rx и Tx от Arduino NANO.
4 — прошил свою программу R_ESP8266_Control.
Проверил работу модуля без связки с Arduino — все нормально.
Подключаю к компьютеру Arduino NANO:
1 — в Arduino IDE выбрал COM порт (скорость 57600) и модуль Arduino NANO.
2 — загрузил скетч, показанный выше.
Проверил работу модуля без связки с ESP8266 — все нормально.
Соединяю два модуля линиями Rx> Tx и Tx> Rx, как показано на рисунке выше. Подсоединяю компьютер только к USB порту Arduino NANO, и включаю питание.
Запускаю монитор последовательного порта на компьютере нажимаю кнопку RESET на DevKit ESP8266 модуле. Через пару секунд на мониторе получил отчет:
Теперь на любом устройстве, имеющим возможность работать в вашей сети, следует в браузере набрать IP адрес 192.168.0.101 и управлять модулями. На мониторе последовательного порта должны отображаться все передаваемые сообщения от DtvKit ESP8266 в Arduino NANO.
Объединить два модуля, имеющие свои «обвязки» из защитных и согласущих сопротивлений, оказалось делом очень простым. В других случаях надо быть внимательнее к общим цепям.
Для прошивки ESP8266 следует:
— преключатель sw1 перевести в положение «prog». При этом выводы Rx и Tx обоих модулей будут соединены напрямую;
— ключ Kn2 (RESET) замкнуть, чтобы вывод RST подключить к Gnd. Это позволит отключить микроконтроллер и использовать Arduino как прозрачный USB-TTL конвертер;
— ключ или перемычку Kn1 (GPIO0) замкнуть — подключить вывод GPIO0 ESP8266 к Gnd для записи программы;
— ключ или перемычку Kn2 (GPIO15) замкнуть на Gnd для записи программы;
— включить питание;
— подсоединить компьютер к USB;
— все готово для программирования ESP8266 через порт USB;
Для прошивки Arduino NANO следует:
— преключатель sw1 перевести в положение «connect»;
— ключ Kn2 (RESET) разомкнуть;
— ключ Kn1 (GPIO0) разомкнуть;
— подсоединить компьютер к USB;
— все готово для работы или программирования Arduino NANO;
По поводу согласования цепей модулей с питанием 3.3 вольта 5.0 вольт, много материала в Инете. Я испробовал способ, представленный на схеме. Работает стабильно!
ESP8266 и Arduino, подключение, распиновка
Привет Хабр. Тема ESP8266, как и IoT(интернет вещей), всё больше набирает популярности, и уже Arduino подхватывает инициативу — добавляя эти Wi-Fi модули в список поддерживаемых плат.
Но как же его подключить к ардуино? И возможно как-то обойтись вообще без ардуино? Сегодня именно об этом и пойдёт речь в этой статье.
Забегая наперёд, скажу, что будет вторая статья, уже более практическая, по теме прошивки и программирования модуля ESP8266 в среде разработки Arduino IDE. Но, обо всём по порядку.
Этот видеоролик, полностью дублирует материал, представленный в статье.
На данный момент, существует много разновидностей этого модуля, вот некоторые из них:
А вот распиновка ESP01, ESP03, ESP12:
* Данную картинку можно посмотреть в хорошем качестве на офф. сайте pighixxx.com.
Лично мне, больше всего нравится версия ESP07. Как минимум за то, что тут есть металлический экран (он защищает микросхемы от внешних наводок, тем самым обеспечивает более стабильную работу), своя керамическая антенна, разъём для внешней антенны. Получается, подключив к нему внешнюю антенну, например типа биквадрат, то можно добиться неплохой дальности. К тому же, тут есть немало портов ввода вывода, так называемых GPIO(General Purpose Input Output — порты ввода-вывода общего назначения), по аналогии с ардуино — пинов.
Давайте вернёмся к нашим баранам Wi-Fi модулям и Arduino. В этой статье, я буду рассматривать подключение ESP8266(модели ESP01) к Arduino Nano V3.
Но, данная информация будет актуальна для большинства модулей ESP8266 и так же разных Arduino плат, например самой популярной Arduino UNO.
Пару слов по ножкам ESP01:
Vcc и GND(на картинке выше это 8 и 1) — питание, на ножку Vcc можно подавать, судя по документации, от 3 до 3.6 В, а GND — земля (минус питания). Я видел, как один человек подключал этот модуль к двум AA аккумуляторам (напряжение питания в этом случае было примерно 2.7 В) и модуль был работоспособным. Но всё же разработчики указали диапазон напряжений, в котором модуль должен гарантированно работать, если вы используете другой — ваши проблемы.
Внимание! Этот модуль основан на 3.3 В логике, а Arduino в основном — 5 В логика. 5 В запросто могут вывести из строя ESP8266, потому на него нужно отдельно от ардуино подавать питание.
— На моей ардуинке есть ножка, где написано 3.3 В, почему бы не использовать её?
Наверное подумаете вы. Дело в том, что ESP8266 довольно таки прожорливый модуль, и в пиках может потреблять токи до 200 мА, и почти никакая ардуинка по умолчанию не способна выдать такой ток, разве что исключением является Arduino Due, у которой ток по линии 3.3 В может достигать 800 мА, чего с запасом хватит, в других же случаях советую использовать дополнительный стабилизатор на 3.3 В, например AMS1117 3.3 В. Таких валом как в Китае, так и у нас.
Ножка RST 6 — предназначена «железной» для перезагрузки модуля, кратковременно подав на неё низкий логический уровень, модуль перезагрузиться. Хоть и на видео я этим пренебрёг, но всё же вам советую «прижимать» данную ногу резистором на 10 кОм к плюсу питания, дабы добиться лучшей стабильности в работе модуля, а то у меня перезагружался от малейших наводок.
Ножка CP_PD 4(или по-другому EN) — служит, опять же, для «железного» перевода модуля в энергосберегающий режим, в котором он потребляет очень маленький ток. Ну и снова — не будет лишним «прижать» эту ногу резистором на 10 кОм к плюсу питалова. На видео я тупо закоротил эту ногу на Vcc, потому как под рукой не оказалось такого резистора.
Ноги RXD0 7 TXD0 2 — аппаратный UART, который используется для перепрошивки, но ведь никто не запрещает использовать эти порты как GPIO(GPIO3 и GPIO1 соотвественно). GPIO3 на картинке почему-то не размечен, но в даташите он есть:
К стати, к ножке TXD0 2 подключен светодиод «Connect», и горит он при низком логическом уровне на GPIO1, ну или когда модуль отправляет что-то по UART.
GPIO0 5 — может быть не только портом ввода/вывода, но и переводить модуль в режим программирования. Делается это подключив этот порт к низкому логическому уровню(«прижав» к GND) и подав питание на модуль. На видео я делаю это обычной кнопкой. После перепрошивки — не забудьте вытащить перемычку/отжать кнопку(кнопку во время перепрошивки держать не обязательно, модуль при включении переходит в режим программирования, и остаётся в нём до перезагрузки).
GPIO2 3 — порт ввода/вывода.
И ещё один немаловажный момент, каждый GPIO Wi-Fi модуля может безопасно выдавать ток до 6 мА, чтобы его не спалить, обязательно ставьте резисторы последовательно портам ввода/вывода на… Вспоминаем закон Ома R = U/I = 3.3В / 0.006 А = 550 Ом, то есть, на 560 Ом. Или же пренебрегайте этим, и потом удивляйтесь почему оно не работает.
В ESP01 все GPIO поддерживают ШИМ, так что к нашим четырём GPIO, то есть GPIO0-3 можно подключить драйвер двигателя, аля L293 / L298 и рулить двумя двигателями, например катера, или же сделать RGB Wi-Fi приблуду. Да, да, данный модуль имеет на борту много чего, и для простеньких проектов скрипач Arduino не нужен, только для перепрошивки. А если использовать ESP07 то там вообще портов почти как у Uno, что даёт возможность уже уверенно обходиться без ардуино. Правда есть один неприятный момент, аналоговых портов у ESP01 вообще нет, а у ESP07 только один, ADC зовётся. Это конечно усугубляет работу с аналоговыми датчиками. В таком случае ардуино аналоговый мультиплексор в помощь.
Всё вроде как по распиновке пояснил, и вот схема подключения ESP8266 к Arduino Nano:
Видите на Arduino Nano перемычка на ножках RST и GND? Это нужно для того, чтобы ардуинка не мешала прошивке модуля, в случае подключения ESP8266 при помощи Arduino — обязательное условие.
Так же если подключаете к Arduino — RX модуля должен идти к RX ардуинки, TX — TX. Это потому, что микросхема преобразователь уже подключена к ножкам ардуино в перекрестном порядке.
Так же немаловажен резистивный делитель, состоящий из резисторов на 1 кОм и 2 кОм (можно сделать из двух резисторов на 1 кОм последовательно соединив их) по линии RX модуля. Потому как ардуино это 5 В логика а модуль 3.3. Получается примитивный преобразователь уровней. Он обязательно должен быть, потому что ноги RXD TXD модуля не толерантные к 5 В.
Ну и можно вообще обойтись без ардуино, подключив ESP8266 через обычный USB-UART преобразователь. В случае подключения к ардуино, мы, по сути, используем штатный конвертер интерфейсов usb и uart, минуя мозги. Так зачем тратиться лишний раз, если можно обойтись и без ардуино вообще? Только в этом случае, мы подключаем RXD модуля к TXD конвертора, TXD — RXD.
Если вам лениво заморачиваться с подключением, возится с резисторами и стабилизаторами — есть готовые решения NodeMcu:
Тут всё значительно проще, воткнул кабель в компьютер, установил драйвера и программируй, только не забывай задействовать перемычку/кнопку на GPIO0 для перевода модуля в режим прошивки.
Ну вот, с теорией наверное всё, статья получилась пожалуй довольно таки большая, и практическую часть, аля прошивка и программирование модуля, я опубликую немного позже.
Я, у себя на ютуб канале, открыл целый плейлист посвящённый моим видео по теме этого Wi-Fi модуля. В планах построили машинку, или лодку, на Wi-Fi управлении, где вместо пульта ДУ будет обычный смарт. Но пока что я к этому ещё не пришёл, так что это всего лишь планы на будущее.
By Сергей ПоделкинЦ ака MrПоделкинЦ.
Уже на подходе плата на базе esp32:
http://www.pighixxx.com/test/2015/12/esp32-pinout/
Которая значительно круче чем esp8266, так что нас скоро ждёт бум, как мне кажется, темы IoT(интернет вещей).
ESP8266. Начало работы, особенности
В этом уроке поговорим о микроконтроллере ESP8266 и платах на его основе. Как с ними работать и чем они отличаются от Arduino на базе МК AVR. ESP8266 – китайский микроконтроллер за 2 доллара с большим объемом памяти и WiFi связью на борту. Официальная документация:
Купить на Aliexpress
Дёшево купить Wemos Mini можно тут: ссылка, ссылка, ссылка. Рекомендуется брать версию как слева на картинке выше, на базе полного чипа ESP-12.
Уроки по работе с esp8266
Конкретные уроки по работе с платой и WiFi библиотеками публикуются на сайте набора GyverKIT, так как уроки на этом сайте являются общими по программированию Arduino, без углубления в сторонние библиотеки.
Характеристики
- Напряжение питания: 3.3V (2.5-3.6V)
- Ток потребления: 300 мА при запуске и передаче данных, 35 мА во время работы, 80 мА в режиме точки доступа
- Максимальный ток пина – 12 мА.
- Flash память (память программы): 1 МБ
- Flash память (файловое хранилище): 1-16 МБ в зависимости от модификации
- EEPROM память: до 4 кБ
- SRAM память: 82 кБ
- Частота ядра: 80/160 МГц
- GPIO: 11 пинов
- ШИМ: 10 пинов
- Прерывания: 10 пинов
- АЦП: 1 пин
- I2C: 1 штука (программный, пины можно назначить любые)
- I2S: 1 штука
- SPI: 1 штука
- UART: 1.5 штуки
- WiFi связь
Начало работы
Для работы с платами на основе esp8266 нужно установить ядро и драйвер.
- Идём в Файл/Настройки/Дополнительные ссылки для менеджера плат. Вставляем ссылку https://arduino.esp8266.com/stable/package_esp8266com_index.json.
- Инструменты/Плата/Менеджер плат…, ищем в поиске esp8266 и устанавливаем. В списке плат появится семейство плат на базе esp8266.
- На большинстве плат стоит USB конвертер CH340, как на всех китайских Ардуинах. Если вы ещё не устанавливали драйвер – читать здесь.
Настройки платы
Для работы с любой платой (даже самодельной) можно выбрать пункт Generic esp8266, будет доступен полный набор настроек. Для работы с Wemos Mini выбираем LOLIN Wemos D1 R2 mini. Настроек станет меньше, а к пинам платы можно будет обращаться в программе по их подписям на плате (Dn). Основные настройки:
- Upload speed: скорость загрузки прошивки. Можно смело поднимать до 921600.
- CPU Frequency: частота тактирования процессора. Для большинства задач хватит стандартных 80 МГц. На 160 МГц будет работать шустрее, но могут быть сбои.
- Flash Size: распределение памяти, настройка имеет вид xMB (FS:xMB OTA:
xKB). Размер памяти под программу не меняется – это всегда 1 МБ.
- Первое число: полный объём микросхемы памяти (в основном 4MB, на Wemos и NodeMCU стоят такие).
- Второе число: объём под файловое хранилище.
- Третье число: объём под OTA (обновление по воздуху) – всегда меньше 1 МБ.
- Что выбрать? У Wemos самый ходовой – первый вариант: 4MB (FS:2MB OTA:
1019KB).
- DOUT: медленный, но совместим со всеми модификациями esp8266.
- QIO: более быстрый, но будет работать не на всех чипах.
- Only Sketch: стереть только программу.
- Sketch + WiFi Settings: стереть программу и настройки WiFi (логин-пароль последнего подключения и т.д.).
- All Flash Contents: полностью очистить память.
Нумерация пинов
У самого чипа esp8266 все выводы пронумерованы цифрами. На распиновке они подписаны как GPIOn, где n – номер. На плате (NodeMCU, Wemos Mini) пины подписаны как Dn и эти номера не совпадают с номерами GPIO! При работе например с Wemos можно использовать как нумерацию выводов GPIO ( digitalWrite(5, LOW) ), так и D-нумерацию пинов на плате ( digitalWrite(D1, LOW) ) – если выбрана плата Wemos. Новички очень часто в этом путаются, будьте внимательны. Также GPIO1 и GPIO3 подписаны на плате как TX и RX, по этим названиям к ним тоже можно обращаться ( digitalWrite(TX, LOW) ).
Особенности пинов
У esp8266 много системных пинов, с которыми нужно быть очень внимательным.
- К целому ряду пинов подключена внешняя Flash память, в общем случае их использовать нельзя (если очень нужно – ищите информацию). На плате NodeMCU визуально гораздо больше пинов, чем на Wemos Mini, но по факту “безопасных” для использования пинов там ровно столько же.
- С оставшимися пинами тоже не всё гладко: некоторые из них требуют наличия определенного логического уровня на момент включения микроконтроллера (подача питания, перезагрузка), иначе esp не запустится. Вот распиновка с этими пинами и нужным уровнем сигнала при запуске:
- На плате (NodeMCU, Wemos и других) эти пины уже подтянуты резисторами к нужному напряжению, поэтому нужно несколько раз подумать, что вы к ним подключаете и как оно повлияет на напряжение на пине. Например, можно подключить энкодер, он прижмёт системный пин к GND и esp не запустится.
- На GPIO16/D0 нельзя подключать прерывания ( attachInterrupt() ) и включать ШИМ сигнал ( analogWrite() ).
- Максимальный ток с GPIO – 12 мА.
- Светодиод LED_BUILTIN находится на пине GPIO2 и его поведение инвертировано: при подаче LOW он включается и наоборот.
- При старте контроллера почти все пины делают скачок до высокого уровня, подробнее – в этой статье. Единственными “спокойными” пинами являются D1 (GPIO5) и D2 (GPIO4). Если контроллер управляет напрямую какими-то железками (реле, транзистор, или является “кнопкой” для другого устройства), то лучше использовать именно эти пины!
- На этих же пинах сидит I2C, но шину можно переназначить на любые другие пины через Wire.begin(sda, scl) .
Особенности работы WiFi
WiFi реализован синхронно, его обработчик должен постоянно вызываться во время работы программы не реже, чем каждые 20 мс (если WiFi используется в программе). Обработка WiFi происходит в следующих местах:
- Автоматически в конце каждой итерации loop()
- Внутри любого delay()
- Внутри функции yield()
Если у вас есть участки программы, которые долго выполняются, то нужно разместить вызовы yield() до и после тяжёлых блоков кода. Также в чужих скетчах можно встретить delay(0) , по сути это и есть yield() .
По тем же причинам не рекомендуется использовать задержку delayMicroseconds() более чем на 20’000 мкс.
Отличия от AVR Arduino
min() и max()
В ядре esp8266 функции min() и max() реализованы как функции, а не как макросы, поэтому должны использоваться с данными одного типа. Использование переменных разного типа приведёт к ошибке компиляции.
В функции map(val, min, max, to min, to max) нет защиты от деления на 0, поэтому если min равен max – микроконтроллер зависнет и перезагрузится. Если min и max задаются какими-то внешними условиями – проверяйте их равенство вручную и исключайте вызов map() с такими аргументами.
Типы данных
- Тип int является синонимом long ( int32_t ) и занимает 4 байта. В AVR int это int16_t , то есть 2 байта.
- Тип double имеет полную двойную точность – 8 байт. В AVR это 4 байта.
- Указатель занимает 4 байта, так как область памяти тут 32-битная. В AVR – 2 байта.
Функция analogRead()
ESP8266 имеет крайне убогий одноканальный АЦП.
- Сам АЦП в esp8266 может измерять напряжение в диапазоне 0.. 1.0V. На платах (NodeMCU, Wemos Mini) стоит делитель напряжения, который расширяет диапазон до более удобных 3.3V.
- Частый вызов analogRead() замедляет работу WiFi. При вызовах чаще нескольких миллисекунд WiFi полностью перестаёт работать.
- Результат analogRead() имеет кеширование до 5 мс, то есть полученные данные могут запаздывать на это время.
- АЦП может использоваться для измерения напряжения питания МК: для этого нужно вызвать ADC_MODE(ADC_VCC); до void setup() , а само напряжение питания можно получить из ESP.getVcc() .
Функция analogWrite()
- Работает на всех пинах, кроме GPIO16.
- Разрядность ШИМ по умолчанию 8 бит (0.. 255) на версиях ядра 3.x. На ранних версиях – 10 бит (0.. 1023). Скажем спасибо индусам за совместимость.
- Разрядность можно настроить в analogWriteResolution(4. 16 бит) .
- Частота ШИМ по умолчанию 1 кГц.
- Частоту можно настроить в analogWriteFreq(100.. 40000 Гц) .
- ШИМ реализован программно, поэтому на повышенной частоте и разрядности будет тормозить выполнение программы!
Аппаратные прерывания
- Настраиваются точно так же, через attachInterrupt() .
- Работают на всех пинах, кроме GPIO16.
- Функция-обработчик должна быть объявлена с атрибутом IRAM_ATTR :
Либо с ICACHE_RAM_ATTR (на старых версиях ядра), вот так:
Функция yield()
В реализации esp8266 функция yield() выполняет другую задачу и использовать её как на AVR не получится. Скажем спасибо индусам за совместимость
EEPROM
EEPROM в esp8266 является эмуляцией из Flash памяти, поэтому мы можем выбрать нужный размер.
- Перед началом работы нужно вызвать EEPROM.begin(4.. 4096) с указанием размера области памяти в байтах.
- Для применения изменений в памяти нужно вызвать EEPROM.commit() .
В остальном работа с библиотекой EEPROM.h ничем не отличается.