Скрещивание набирающего популярность микроконтроллера ESP32 и уже ставшей чрезвычайно популярной экосистемы Arduino является очень нужным и полезным делом для сообщества радиолюбителей. Успех платформы Arduino возник не в последнюю очередь из-за очень простого подхода к программированию, который могли быстро освоить даже далекие от электроники и программирования люди.
Теперь вслед за ESP8266 на рельсы Arduino встал самый мощный «поезд» компании Espressif – микроконтроллер ESP32. Сочетание мощности и простоты обеспечит грандиозные возможности для разработки новых интеллектуальных устройств.
Итак, для программирования ESP32 в среде Arduino IDE в первую очередь необходимо скачать репозиторий с GitHub и клонировать его в директорию hardware/espressif/esp32 в папке Arduino IDE. После этого можно начинать писать программы для ESP32 в этой среде.
Конечно, пока данный проект реализует не все возможности и функции Arduino, но основные уже доступны и работают полностью. Так, например, управлять линиями GPIO в данном случае также легко, как и у классического Arduino – просто пользуемся функциями digitalWrite() и digitalRead(). Интерфейсы SPI и I2C работают также, как и в Arduino. На данном этапе есть возможность управлять только двумя модулями SPI в ESP32. Скорость работы SPI задается через SPI_CLOCK_DIV_XX, где XX число делителя частоты. I2C (Wire) имеет только один модуль с выводами GPIO21 в качестве линии данных и GPIO22 в качестве линии тактирования. Ниже представлена распиновка ESP32 с функциональным назначением каждого вывода.
Для реализации связи по WiFi используются те же функции, что и изначально у Arduino с внешним модулем WiFi. В микроконтроллере ESP32 есть также встроенный модуль Bluetooth, но пока для него не реализованы функции должным образом.
Помимо функций изначально предназначенных для Arduino имеются специализированные функции для ядра ESP32. Их можно найти в директории /arduino-esp32/tree/master/cores/esp32/. Они представлены в файлах с «-hal-» в наименовании (esp32-hal-xxx.h и esp32-hal-xxx.c). Например, в esp32-hal-matrix.* можно найти функции, дающие легкий доступ к матрице назначения выводов.
С помощью специализированных функций можно управлять внешними устройствами, например, светодиодами или сервомоторами. Для этого имеются файлы esp32-hal-ledc.*, обеспечивающие функции для генерации ШИМ. Ниже приведен код для управления серводвигателем, в котором с помощью функции ledcSetup устанавливается первый канал ШИМ с частотой 50 Гц и разрядностью 16 бит. Функция ledcAttachPin подключает этот первый канал ШИМ к линии GPIO22. Функция ledcWrite обеспечивает на первом канале ШИМ генерацию импульсов шириной 3300 и 6500 с изменяемым в цикле на 100 шагом.
void loop() {
for (int i=3300 ; i < 6500 ; i=i+100){
ledcWrite(1, i);
delay(100);
}
}
Таким образом, микроконтроллер ESP32 уже можно программировать в среде Arduino IDE. Хотя реализованы еще не все функции, но даже с помощью имеющихся вполне возможно делать какие-либо несложные устройства на базе ESP32.
Веб-сервер на базе ESP32, настроенный с помощью IDE Arduino.
Сейчас при помощи IDE Arduino попробуем создать автономный веб-сервер, позволяющий включать/выключать два светодиода. Более подробно о ESP32 можно почитать тут.
Подготовка ESP32 при помощи IDE Arduino
Для того, чтобы программировать ESP32 при помощи среды IDE Arduino и языка программирования Arduino, понадобится специальный аддон. О том, как подготовить IDE Arduino для работы с ESP32 на Windows, читайте тут, а на Mac и Linux – тут.
Загрузка кода
В нашем проекте мы подключим два светодиода к ESP32, а затем будем управлять ими из браузера. Скопируйте текст ниже в рабочую область IDE Arduino:
Внимание! Не забудьте указать данные, соответствующие вашей сети. Это делается в самом верху скетча в константах ssid и password.
Теперь подключите ESP32 к компьютеру и следуйте инструкциям ниже:
Выберите свою плату в меню Инструменты > Плата (Tools > Board). В моем случае это «ESP32 Dev Module».
Выберите COM-порт.
Чтобы перевести ESP32 в режим загрузки прошивки, зажмите кнопку BOOT и нажмите на кнопку EN. Это перезагрузит ESP32.
Нажмите кнопку «Загрузка» в IDE Arduino и подождите несколько секунд, пока код скомпилируется и загрузится на плату. Если все было сделано правильно, вы должны увидеть примерно следующее:
Перезапустите ESP32, чтобы запустить новую прошивку.
Необходимые компоненты и схема
Ниже – список компонентов, необходимых для нашего проекта:
Один модуль ESP32
Два светодиода
Одна макетная плата
Два резистора на 270 Ом
Провода-перемычки
Подключите друг к другу все эти компоненты как показано на картинке ниже:
Доступ к веб-серверу
Перезапустившись, ESP32 напечатает в мониторе порта IDE Arduino свой IP-адрес. Скорость передачи данных нужно выставить на 115200 бод.
Теперь, чтобы получить доступ к веб-серверу, вам нужно вбить в адресной строке браузера IP-адрес, который ESP32 напечатала в мониторе порта IDE Arduino. В моем случае это «192.168.1.116».
Демонстрация
Используя кнопки в браузере, попробуйте включить/выключить светодиоды, подключенные к ESP32. Вживую все это должно выглядеть примерно так:
unsigned int localPort = 2390; // local port to listen for UDP packets
unsigned long ntp_time = 0;
long t_correct = 0;
unsigned long cur_ms = 0;
unsigned long ms1 = 0;
unsigned long ms2 = 10000000UL;
unsigned long t_cur = 0;
bool points = true;
unsigned int err_count = 0;
uint16_t vdd = 0;
// Если нет соединения с интернетом, перезагружаемся
if( err_count > 10 ){
Serial.println("NTP connect false");
Serial.println("Reset ESP32 ...");
// ESP.reset();
}
delay(100);
}
/**
* Выдача текущего времени на индикатор
*/
void DisplayTime(void){
uint16_t m = ( ntp_time/60 )%60;
uint16_t h = ( ntp_time/3600 )%24;
Serial.print("Time: ");
Serial.print(h);
Serial.print(":");
Serial.println(m);
tm1637.point(points);
tm1637.display(0,h/10);
tm1637.display(1,h%10);
tm1637.display(2,m/10);
tm1637.display(3,m%10);
}
/**
* Посылаем и парсим запрос к NTP серверу
*/
bool GetNTP(void) {
WiFi.hostByName(ntpServerName, timeServerIP);
sendNTPpacket(timeServerIP);
delay(1000);
int cb = udp.parsePacket();
if (!cb) {
Serial.println("No packet yet");
return false;
}
else {
Serial.print("packet received, length=");
Serial.println(cb);
// Читаем пакет в буфер
udp.read(packetBuffer, NTP_PACKET_SIZE);
// 4 байта начиная с 40-го сождержат таймстамп времени - число секунд
// от 01.01.1900
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// Конвертируем два слова в переменную long
unsigned long secsSince1900 = highWord << 16 | lowWord;
// Конвертируем в UNIX-таймстамп (число секунд от 01.01.1970
const unsigned long seventyYears = 2208988800UL;
unsigned long epoch = secsSince1900 - seventyYears;
// Делаем поправку на местную тайм-зону
ntp_time = epoch + TIMEZONE*3600;
Serial.print("Unix time = ");
Serial.println(ntp_time);
}
return true;
}
/**
* Посылаем запрос NTP серверу на заданный адрес
*/
unsigned long sendNTPpacket(IPAddress& address)
{
Serial.println("sending NTP packet...");
// Очистка буфера в 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Формируем строку зыпроса NTP сервера
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// Посылаем запрос на NTP сервер (123 порт)
udp.beginPacket(address, 123);
udp.write(packetBuffer, NTP_PACKET_SIZE);
udp.endPacket();
}
Подключаем индикатор к GPIO22 и GPIO23, ESP32 соединяется с интернетом и на дисплее получаем точное время.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Все гости форума могут отвечать на сообщения в этом разделе.
Темы, похожие на тему "Программируем ESP32 в Arduino IDE"