Esp 32 как программировать
Перейти к содержимому

Esp 32 как программировать

  • автор:

ESP32 Урок 1. Первое знакомство с контроллером ESP32

Ну вот, наконец-то, настало время нам перейти к знакомству с более взрослой линейкой контроллеров китайского производителя Espressif — ESP32.

Зрители и читатели данного ресурса давно уже меня просят о том, чтобы я поскорей начал уроки по контроллеру ESP32, но так как до некоторых пор не было пакета (или тулчейна) для программирования данной линейки контроллеров, ориентированного на операционную систему Windows, я до сих пор оттягивал данную тему. И вот, наконец теперь мы дождались этого момента и можем приступать.

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

Контроллеры линейки ESP32 привлекают нас так же, как и контроллеры линейки ESP8266, наличием программированных беспроводных интерфейсов, и, как это не удивительно, тем, что при всех этих преимуществах они отличаются очень невысокой стоимостью.

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

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

Архитектура контроллера похожа на архитектуру ESP8266, но есть ряд важных отличий, как то наличие модуля Bluetooth, второго ядра процессора и многие другие.

Основные технические характеристики контроллера ESP8266 (а точнее ESP8266EX), касающиеся передачи данных по Wi-FI:

  • поддержка протокола 802.11 b/g/n
  • поддержка 802.11 n (2.4 GHz) до 150 Mbps
  • WMM (Wi-Fi Multimedia)
  • дефрагментация
  • TX/RX A-MPDU, RX A-MSDU
  • автоматический мониторинг радиомаяка
  • 4 виртуальных передатчика Wi-Fi
  • разнесение антенн.

Также приведу некоторые остальные характеристики:

  • процессор Tensilica Xtensa LX6, состоящий из двух 32-разрядных ядер
  • производительность до 600 MIPS
  • сопроцессор с ультранизким энергопотреблением
  • 448 KB ROM для загрузчика и функций ядра
  • 520 KB SRAM для данных и команд
  • 16 KB SRAM в RTC
  • две группы таймеров, включая 2×64 бит таймеры и сторожевой таймер в каждой группе
  • 34 программируемых универсальных портов GPIO
  • два 8-битных ЦАПа
  • 12-битный АЦП 18 каналов
  • Ethernet MAC интрефейс
  • четрые SPI
  • два I2C
  • два I2S
  • три UART
  • хост контроллер SD/eMMC/SDIO
  • SLAVE контроллер SDIO/SPI
  • CAN 2.0
  • датчик Холла
  • IR порт
  • PWM для двигателей
  • PWM для светодиодов до 16 каналов
  • модуль RTC, предназначенный для работы процессора в режимах с низким энергопотреблением, общего управления питанием, а также включающий в себя всю аналоговую периферию.

Интересно было бы отметить то, что у контроллера ESP32 ножки делятся на 4 группы по питанию.

Приведу функциональную схему мультиплексирования входов из справочной документации, в которой мы видим, каким образом коммутируются различные группы ножек микроконтроллера

Если пролистать документацию дальше, то мы увидим распиновку контроллера, в которой ножки отображены по группам различным цветом

На ножки, отмеченные жёлтым цветом, питание подаётся только в активном режиме, в спящем режиме энергосбережения, в котором работает только третье ядро, специально для этого предназначенное, питание на данные ножки не подаётся, следовательно управлять ими и брать с них сигнал мы не можем.

Окрашенные в синий цвет ножки питаются как и в активном режиме работы микроконтроллера, а также они не теряют питание и в спящем режиме.

Ножки, окрашенные в красный цвет, питаются вместе с аналоговой частью контроллера.

Отмеченные зелёным цветом ножки могут питаться как напряжением 3.3В, так и 1.8В. Эта возможность, видимо, реализована потому, что данные ножки могут управлять подключенной картой SD, которые питаются разным напряжением.

Думаю, что краткая информация изложена, более глубоко будем постигать неизведанные просторы этого непростого микроконтроллера, когда будем писать свои программы для него, а писать мы будем их, как всегда на обычном языке C, что позволяет более гибко отрегулировать работу периферийных устройств, но в ту же очередь требует от нас большей ответственности. Но мы трудностей не боимся и я верю, что обязательно у нас всё получится.

Ждём новых уроков. Спасибо за внимание!

Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32

Смотреть ВИДЕОУРОК в Youtube (нажмите на картинку)

ESP32 Первое знакомство с контроллером ESP32

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32

ESP32

Аппаратная часть IoT-платформы выполнена на модуле ESP-WROOM-32 с однокристальной системой ESP32-D0WDQ6 производства компании Espressif.

Чип ESP32-D0WDQ6 — выполнен по технологии SoC (англ. System-on-a-Chip — система на кристалле).

ESP32-WROOM — модуль с чипом ESP32-D0WDQ6, Flash-памятью на 4 МБ и всей необходимой обвязкой, которые спрятаны под металлическим кожухом. Рядом с кожухом расположена миниатюрная антенна из дорожки на верхнем слое печатной платы. Металлический кожух экранирует компоненты модуля и тем самым улучшает электромагнитные свойства.

ESP32

Кристалл включает в себя 2-ядерный 32-разрядный процессор Tensilica Xtensa LX6, 520 Кб памяти SRAM и 448 Кб флеш-памяти, 4 Мб внешней флеш-памяти. Тактовая частота выставляется до 240 МГц в зависимости от режима энергопотребления.

Имеются встроенный температурный датчик, датчик Холла, инфракрасный контроллер на приём и на передачу, контроллер сенсорных кнопок, Bluetooth (BLE v4.2 BR/EDR), Wi-Fi (стандарты связи Wi-Fi 802.11 b/g/n (2,4 ГГц)).

Преобразователь USB-UART на микросхеме CP2102 обеспечивает связь модуля ESP32-WROOM с USB-портом компьютера. При подключении к ПК — платформа ESP32 DevKit определяется как виртуальный COM-порт.

Разъём micro-USB предназначен для прошивки и питания платформы ESP32 DevKit с помощью компьютера.

Контакты

Pinout ESP32

C двух сторон платы расположены контактные гребёнки по 15 пинов с шагом 2,54 мм (модификация на 30 пинов).

Доступны 25 пинов общего назначения. Все контакты поддерживают прерывания. Максимальный ток на пинах: 12 мА/

  • Цифровые 21 контакт ввода-вывода (GPIO): 1–5, 12–19, 21–23, 25–27, 32 и 33. Контакты общего назначения. Пины могут быть настроены на вход или на выход. Логический уровень единицы — 3,3 В, нуля — 0 В. Максимальный ток выхода — 12 мА. Все выводы ввода-вывода могут работать как ШИМ, что позволяет выводить аналоговые значения в виде ШИМ-сигнала с разрядность 16 бит. Максимальное количество каналов 16
  • цифровые 4 контакта ввода (GPI): 34, 35, 36 и 39. Могут быть настроены только на вход.
  • 15 аналоговых входов с АЦП (12 бит): 2, 4, 12–15, 25–27, 32–36 и 39. Позволяет представить аналоговое напряжение в цифровом виде с разрядностью 12 бит
  • 2 аналоговых выхода с ЦАП (8 бит): 25 (DAC1) и 26 (DAC2). Аналоговый выход цифро-аналогового преобразователя, который позволяет формировать 8-битные уровни напряжения. Выводы могут использоваться для аудио-выхода.
  • 10 контактов ёмкостного сенсора

На пинах ввода-вывода можно сконфигурировать аппаратные интерфейсы:

Для экспериментов используйте выводы 2, 4, 12, 13, 14, 18, 19, 21, 22, 23, 25, 26, 27.

Сводная таблица выводов для использования в проектах

GPIO Input Output Notes
0 pulled up OK outputs PWM signal at boot
1 TX pin OK debug output at boot
2 OK OK connected to on-board LED
3 OK RX pin HIGH at boot
4 OK OK
5 OK OK outputs PWM signal at boot
6 x x connected to the integrated SPI flash
7 x x connected to the integrated SPI flash
8 x x connected to the integrated SPI flash
9 x x connected to the integrated SPI flash
10 x x connected to the integrated SPI flash
11 x x connected to the integrated SPI flash
12 OK OK boot fail if pulled high
13 OK OK
14 OK OK outputs PWM signal at boot
15 OK OK outputs PWM signal at boot
16 OK OK
17 OK OK
18 OK OK
19 OK OK
21 OK OK
22 OK OK
23 OK OK
25 OK OK
26 OK OK
27 OK OK
32 OK OK
33 OK OK
34 OK input only
35 OK input only
36 OK input only
39 OK input only

Пины питания

  • VIN: Пин для подключения внешнего источника напряжения в диапазоне от 5 до 14 вольт (рядом с GND)
  • 3V3: Пин от стабилизатора напряжения с выходом 3,3 вольта и максимальных током 1 А. Регулятор обеспечивает питание модуля ESP32-WROOM (рядом с GND)
  • GND: Выводы земли (два контакта, по одному на каждой стороне)

На отладочном модуле расположены две тактовые кнопки. Кнопка EN предназначена для ручного перезапуска платы — аналог кнопки RESET обычного компьютера.

Кнопка Boot служит для ручного запуска режима прошивки модуля. Алгоритм следующий: Зажмите кнопку BOOT; Нажмите и отпустите кнопку EN; Отпустите кнопку BOOT.

Также на плате находится светодиод питания и индикаторный светодиод, подключённый к цифровому пину 2 (вместо 13 как у стандартных Arduino).

Питание

Линейный понижающий регулятор напряжения AMS1117-3.3 обеспечивает питание микроконтроллера. Выходное напряжение 3,3 вольта с максимальным током 1 А.

Питание подаётся через разъём micro-USB или контакт Vin. Источник определяется автоматически.

При питании через USB используйте зарядник на 5В совместно с кабелем Micro USB. В случае питания через Vin рекомендуется входное напряжение от 5 до 14 В. Преобразователь питания на плате выровняет входное напряжение до необходимых 3,3 В.

Важно! Напряжение логических уровней на пинах — 3,3В, подключение 5-вольтовой периферии может повредить микроконтроллер!

Как и в случае с платами Arduino, платы ESP32 также бывают от разных производителей с разным числом выводов и разной обвязкой. Также появляются модификации и конкретной платы. Например, плата ESP32 DEVKIT DOIT бывает с 30 и 36 пинами.

ESP32 WROOM DevKit v1: распиновка, схема подключения и программирование

ESP32 DevKit — это универсальная платформа для разработки IoT-решений.

Программирование на C++

Для начала работы с платформой ESP32 DevKit на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino IDE.

По умолчанию среда IDE настроена только на AVR-платы. Для платформы ESP32 DevKit добавьте в менеджере плат поддержку платформ на модуле ESP32.

Выберите платформу ESP32 DevKit: Инструменты Плата DOIT ESP32 DEVKIT V1 .

После выполненных действий плата ESP32 DevKit готова к программированию через Arduino IDE.

Подробности о функциях и методах работы ESP32 на языке C++ читайте на ESP32 Arduino Core.

Примеры работы для Arduino

ESP32 может подключиться к Wi-Fi сети, создать собственную точку доступа, представляться сервером и клиентом, формировать GET и POST запросы. Также микроконтроллер имеет два АЦП и датчик Хола.

Пример WebClient

GET-запрос по URL -адресу в Интернете.

// библиотека для работы с HTTP-протоколом #include // вводим имя и пароль точки доступа const char* ssid = "WIFINAME"; const char* password = "WIFIPASSWORD"; void setup() { // иницилизируем монитор порта Serial.begin(115200); // запас времени на открытие монитора порта — 5 секунд delay(5000); // подключаемся к Wi-Fi сети WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to Wi-Fi.."); } Serial.println("Connected to the Wi-Fi network"); } void loop() { // выполняем проверку подключения к беспроводной сети if ((WiFi.status() == WL_CONNECTED)) { // создаем объект для работы с HTTP HTTPClient http; // подключаемся к тестовому серверу с помощью HTTP http.begin("http://httpbin.org/"); // делаем GET запрос int httpCode = http.GET(); // проверяем успешность запроса if (httpCode > 0) { // выводим ответ сервера String payload = http.getString(); Serial.println(httpCode); Serial.println(payload); } else { Serial.println("Error on HTTP request"); } // освобождаем ресурсы микроконтроллера http.end(); } delay(10000); }

После подключения к Wi-Fi микроконтроллер напишет в COM порт ответ от сервера.

Пример Analog WebServer

ESP32 имеет 15 аналоговых пинов. Выведем через веб-интерфейс значения с 36, 39 и 34 пина.

// подключяем библиотеку для работы с Wi-Fi server #include // вводим имя и пароль точки доступа const char* ssid = "WIFINAME"; const char* password = "WIFIPASSWORD"; // инициализируем сервер на 80 порте WiFiServer server(80); // заводим буфер и счетчик для буфера char lineBuf[80]; int charCount = 0; void setup() { // инициализируем монитор порта Serial.begin(115200); // запас времени на открытие монитора порта — 5 секунд delay(5000); // инициализируем аналоговые пины pinMode(36, INPUT); pinMode(39, INPUT); pinMode(34, INPUT); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); // подключаем микроконтроллер к Wi-Fi сети WiFi.begin(ssid, password); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Wi-Fi connected"); Serial.println("IP-address: "); Serial.println(WiFi.localIP()); // запускаем сервер server.begin(); } void loop() { // анализируем канал связи на наличие входящих клиентов WiFiClient client = server.available(); if (client) { Serial.println("New client"); memset(lineBuf, 0, sizeof(lineBuf)); charCount = 0; // HTTP-запрос заканчивается пустой строкой boolean currentLineIsBlank = true; while (client.connected()) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); // формируем веб-страницу String webPage = ""; webPage += ""; webPage += " "; webPage += " \"viewport\" content=\"width=device-width,"; webPage += " initial-scale=1\">"; webPage += " "; webPage += " 

ESP32 - Web Server

"
; webPage += "

"; webPage += " AnalogPin 36 = "; webPage += analogRead(36); webPage += "
"
; webPage += " AnalogPin 39 = "; webPage += analogRead(39); webPage += "
"
; webPage += " AnalogPin 34 = "; webPage += analogRead(34); webPage += "
"
; webPage += "

"
; webPage += ""; client.println(webPage); break; } // даем веб-браузеру время для получения данных delay(1); // закрываем соединение client.stop(); Serial.println("client disconnected"); } }

Когда микроконтроллер подключится к Wi-Fi сети, в монитор порта будет выведен IP-адрес веб-страницы с данными. Получить к ней доступ можно из локальной сети, перейдя по указанному IP-адресу. Скопируйте IP-адрес из монитора порта и вставьте в адресную строку браузера. Если вы подключены к той же локальной сети, что и ESP32, то вы увидите веб-интерфейс.

Пример blink WebServer

Создадим WEB-сервер на порту 80. С помощью веб-интерфейса будем мигать светодиодами на 16 и 17 пинах.

// подключяем библиотеку для работы с Wi-Fi server #include // указываем пины, к которым подключены светодиоды #define LED_GREEN 16 #define LED_RED 17 // вводим имя и пароль точки доступа const char* ssid = "WIFINAME"; const char* password = "WIFIPASSWORD"; // инициализируем сервер на 80 порте WiFiServer server(80); // создаем буфер и счетчик для буфера char lineBuf[80]; int charCount = 0; void setup() { // запас времени на открытие монитора порта — 5 секунд delay(5000); // инициализируем контакты для светодиодов pinMode(LED_GREEN, OUTPUT); pinMode(LED_RED, OUTPUT); // инициализируем монитор порта Serial.begin(115200); // подключаемся к Wi-Fi сети Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Wi-Fi connected"); Serial.println("IP-address: "); // пишем IP-адрес в монитор порта Serial.println(WiFi.localIP()); server.begin(); } void loop() { // анализируем канал связи на наличие входящих клиентов WiFiClient client = server.available(); if (client) { Serial.println("New client"); memset(lineBuf, 0, sizeof(lineBuf)); charCount = 0; // HTTP-запрос заканчивается пустой строкой boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); // считываем HTTP-запрос lineBuf[charCount] = c; if (charCount  sizeof(lineBuf) - 1) { charCount++; } // на символ конца строки отправляем ответ if (c == '\n' && currentLineIsBlank) { // отправляем стандартный заголовок HTTP-ответа client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); // тип контента: text/html client.println("Connection: close"); // после отправки ответа связь будет отключена client.println(); // формируем веб-страницу String webPage = ""; webPage +=""; webPage +=" "; webPage +=" \"viewport\" content=\"width=device-width,"; webPage +=" initial-scale=1\">"; webPage +=" "; webPage +=" 

ESP32 - Web Server

"
; webPage +="

LED #1"; webPage +=" \"on1\">"; webPage +=" "; webPage +="  "; webPage +=" \"off1\">"; webPage +=" "; webPage +=" "; webPage +="

"
; webPage +="

LED #2"; webPage +=" \"on2\">"; webPage +=" "; webPage +="  "; webPage +=" \"off2\">"; webPage +=" "; webPage +=" "; webPage +="

"
; webPage +=""; client.println(webPage); break; } if (c == '\n') { // анализируем буфер на наличие запросов // если есть запрос, меняем состояние светодиода currentLineIsBlank = true; if (strstr(lineBuf, "GET /on1") > 0) { Serial.println("LED 1 ON"); digitalWrite(LED_GREEN, HIGH); } else if (strstr(lineBuf, "GET /off1") > 0) { Serial.println("LED 1 OFF"); digitalWrite(LED_GREEN, LOW); } else if (strstr(lineBuf, "GET /on2") > 0) { Serial.println("LED 2 ON"); digitalWrite(LED_RED, HIGH); } else if (strstr(lineBuf, "GET /off2") > 0) { Serial.println("LED 2 OFF"); digitalWrite(LED_RED, LOW); } // начинаем новую строку currentLineIsBlank = true; memset(lineBuf, 0, sizeof(lineBuf)); charCount = 0; } else if (c != '\r') { // в строке попался новый символ currentLineIsBlank = false; } } } // даем веб-браузеру время, чтобы получить данные delay(1); // закрываем соединение client.stop(); Serial.println("client disconnected"); } }

При переходе по IP-адресу из монитора порта, выводится веб-страница с кнопками.

Программирование на JavaScript

Для старта с платформой Wi-Fi Slot на языке JavaScript скачайте и установите интегрированную среду разработки — Espruino Web IDE.

Программирование ESP32 в среде Arduino IDE. Структура кода.

Чтобы начать программировать ESP32 в среде Arduino IDE, необходимо изучить структуру кода. В данном уроке постараюсь объяснить структуру кода в среде Arduino IDE. Данная структура применима при программировании и других микроконтроллеров в данной среде разработки. Вы можете убедиться в этом, посмотрев мой урок по программированию Arduino.

Что понадобиться для выполнения данного урока.

  • Модуль ESP32. Я буду использовать ESP32 DEVKIT V1.
  • USB кабель для подключения к ПК.

Модуль ESP32. Я буду использовать ESP32 DEVKIT V1.

Базовая структура кода.

Код ESP32 (также называют скетч, который имеет ту — же структуру, что и код Arduino). Он включает в себя две основные части.

Базовая структура кода.

Блок настроек (setup)

  • Код прописывается в функции setup().
  • Код выполняется сразу поле включения питания или перезагрузки.
  • Данный код выполняется только один раз.
  • Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д.

Основной цикл (loop).

  • Код основного цикла прописываться в функции loop().
  • Данный код выполняется сразу после выполнения кода настроек.
  • Код в функции loop() выполняется бесконечное количество раз.

Пример.

void setup() < // put your setup code here, to executed once: Serial.begin(9600); Serial.println("This is ESP32 setup code"); >void loop() < // put your main code here, to run repeatedly: Serial.println("This is ESP32 loop code"); delay(1000); >

Загрузка и проверка кода ESP32.

  • Если вы используете ESP32 в первый раз, смотрите статью «Настройка Arduino IDE для работы с ESP32».
  • Скопируйте приведенный код выше.
  • Скомпилируйте и загрузите код на плату ESP32, нажав на кнопку загрузить.
  • Откройте последовательный монитор порта.
  • Вы увидите вывод следующей информации.

Загрузка и проверка кода ESP32.

Как вы видите фраза «This is ESP32 the setup code» напечатана в порте всего 1 раз. Но фраза«This is ESP32 loop code» выводиться много раз. Это наглядно демонстрирует, что код настроек выводиться 1 раз, а код цикла выполняется повторно. Причём, сперва выполнился код настроек.

Как вы видите фраза «This is ESP32 the setup code» напечатана в порте всего 1 раз. Но фраза«This is ESP32 loop code»

ВНИМАНИЕ! Функции setup() и loop() обязательно должны использоваться в коде. Иначе вы увидите ошибку при компиляции кода.

Другие разделы кода.

Другие разделы кода.

Помимо кода настроек и основного цикла, скетч ESP32 может включать в себя дополнительные разделы кода:

  • Блок комментариев. Обычно используется для указания: информации об авторе, инструкцию по подключению, лицензиюи т.д. Данная информация не используется при компиляции и может располагаться в любом месте кода.
  • Подключение библиотек. Используется для подключения сторонних библиотек в скетче.
  • Константы. Используются для определения необходимых констант.
  • Глобальные переменные.

Вот мы с вами и рассмотрели структуру кода в среде Arduino IDE на примере скетча для ESP32.

Вот мы с вами и рассмотрели структуру кода в среде Arduino IDE на примере скетча для ESP32.

Смотрите также уроки по программированию ESP8266:

  • HTTP-сервер ESP8266. Выводим информацию HTML, Javascript и CSS
  • Настройка простого HTTP веб-сервера.
  • Управление двигателем постоянного тока. NodeMCU + MX1508
  • Использование широтно-импульсной модуляции (ШИМ).
  • Подключение сдвигового регистра 74HC595.
  • Кодирование сообщений JSON — Encoding JSON messages.

Понравился урок: Программирование ESP32 в среде Arduino IDE. Структура кода? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

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

Технологии начинаются с простого!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *