ESP-01. Использование Arduino IDE.
Как было отмечено в предыдущей статье, одним из методов работы с ESP8266 является использование "самодельной" прошивки.
Наиболее "ленивым" способом реализовать этот метод можно используя готовые dll-ки для Arduino IDE. Такое решение позволяет использовать стандартные ардуиновские подходы для реализации различных технически-программных решений. Знакомая "обстановка" существенно упрощает и ускоряет разработку любительских конструкций.
"Arduino IDE для ESP8266 позволяет писать скетчи и загружать их одним кликом в ESP8266 в знакомой среде Arduino IDE".
Наиболее "ленивым" способом реализовать этот метод можно используя готовые dll-ки для Arduino IDE. Такое решение позволяет использовать стандартные ардуиновские подходы для реализации различных технически-программных решений. Знакомая "обстановка" существенно упрощает и ускоряет разработку любительских конструкций.
"Arduino IDE для ESP8266 позволяет писать скетчи и загружать их одним кликом в ESP8266 в знакомой среде Arduino IDE".
Установка Arduino IDE для ESP8266 подробно описана тут.
Как ставил я и что получилось:
Как ставил я и что получилось:
- Скачиваем архив arduino-1.6.1-windows.zip, который можно найти на указанной страничке. В архиве все что надо для работы, в том числе и сама система Arduino IDE.
- Распаковываем архив в отдельную папку, например: C:\arduino-1.6.1. Сокращаем вложения папок, если уж так вышло...
- Далее, чтоб поменьше было проблем, руками копируем dll-ку в корень проекта: "Для успешной компиляции перед началом работы необходимо скопировать файл libiconv-2.dll из папки ..\arduino-1.6.1\hardware\tools\avr\libexec\gcc\avr\4.8.1 в папку ..\arduino-1.6.1"
Методика "прошивки"
Методика работы c ESP8266 в Arduino IDE хорошо описана на той же страничке, повторю:
1. Подключаем USB-TTL к USB (в Диспетчере устройств отмечаем появившийся СОМ порт, пусть это вышел СОМ10).
2. Подключаем ESP8266 к USB-TTL: как это сделать - было разобрано в предыдущей статье.
3. Подключаем GPIO0 на землю, отключаем (если было включено) и вновь подаем питание на модуль ESP. Теперь все готово к прошивке: модуль ждет
загрузки программы через UART.
4. Запускаем Arduino IDE из папки C:\arduino-1.6.1 (см выше)
5. В меню Инструменты – Плата выбираем модуль ESP – Generic ESP8266 board (в самом низу)
6. В меню Инструменты выбираем порт, к которому подключен наш USB-TTL - это как раз наш новый порт СОМ10 (см.п.1)
7. В меню Инструменты – Программатор – esptool (тоже в самом низу)
8. Теперь можно создать новый скетч.
9. Жмем кнопку компиляции и загрузки скетча. На экране будет что-то типа (имена и размеры зависят от скетча):
Sketch uses 195 208 bytes (37%) of program storage space. Maximum is 524 288 bytes.
Uploading 34944 bytes from C:\WINDOWS\Temp\build1804685654077075156.tmp/WiFiWebServer.cpp_00000.bin to flash at 0x00000000
...................................
Uploading 160312 bytes from C:\WINDOWS\Temp\build1804685654077075156.tmp/WiFiWebServer.cpp_40000.bin to flash at 0x00040000
.............................................................................................................................................................
10. По окончании процесса отключаем питание от ESP8266 отключая или не отключая USB-TTL от URXD и UTXD в зависимости от решаемой задачи. Отключаем GPIO0 от земли.
11. Подаем питание на модуль и смотрим как работает "наше творение".
Если требуется "мониторить UART", тогда (лучше до подачи питания на модуль):
10. По окончании процесса отключаем питание от ESP8266 не отключая USB-TTL от URXD и UTXD, отключаем GPIO0 от земли.
11. В меню Инструменты – Монитор последовательного порта, запускаем терминальную программу.
12. Выбираем скорость 115200.
13. Подаем питание на модуль и смотрим что происходит в терминале.
Первый проект - Blink светодиодом на UTXD
Естественно, первым делом, я запустил тестовый пример WiFiWebServer. Но правильно было бы "начать с малого" - с обычного Blink.
В вышеописанной инструкции на этапе п.8 открываем базовый пример Arduin-ы Blink. Слегка меняем текст скетча: вместо pin13, указываем 1 (вспомним, что к UTXD на плате модуля ESP-01 подключен светодиод, а UTXD это и есть GPIO1).
// текст скетча *Blink*
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output. тут меняем пин на номер 1
pinMode(1, OUTPUT);
digitalWrite(1, LOW); // turn the LED TxD on
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(1, HIGH); // turn the LED off (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(1, LOW); // turn the LED on by making the voltage LOW
delay(1000); // wait for a second
}
Запускаем компиляцию - наблюдаем мигание светодиода...
Интересно проверить скорость работы функций DigitalWrite(). Для этого меняем в скетче pin1 на GPIO2, подключаем к этому выводу осциллограф.
Уменьшаем задержку в функции Delay() с 1000 до 1 мс. Картинка с осциллограммой сигнала на выводе GPIO2 показана на фото.
Продолжаем эксперимент: комментируем в скетче строки с вызовом функции Delay().
Сигнал на GPIO2 для этого случая показан на фото.
Тут уже сказывается быстродействие "китайского DSO201", но по периоду "как бы прямоугольников" можно оценить быстродействие модуля при использовании стандартных функций Arduino (период сигнала около 6 мкс).
Сигнал на GPIO2 для этого случая показан на фото.
Тут уже сказывается быстродействие "китайского DSO201", но по периоду "как бы прямоугольников" можно оценить быстродействие модуля при использовании стандартных функций Arduino (период сигнала около 6 мкс).
Стандартный Web-сервер - управление GPIO2
После простой задачки интересно посмотреть как работает модуль по "своему прямому назначению".
В списке примеров есть реализация простенького Web-сервера. Программка позволяет управлять выходом GPIO2 (для наглядности к нему хорошо бы подключить светодиод катодом к GND через резистор (я ставил 200 ом)).
Действуем по вышеописанному алгоритму, только на шаге п.8 поступаем иначе: в меню
Файл – Примеры (Образцы) – ESP8266WiFi – выбираем WiFiWebServer
В строках 12 и 13 скетча указываем SSID и пароль нашей домашней Wi-Fi сети, к примеру у меня они такие:
const char* ssid = "ASUS";
const char* password = "NATASVETA000";
далее действуем по схеме "мониторить UART" (см выше)...
В результате, в мониторе последовательного порта увидим примерно следующее:
Connecting to ASUS
...
WiFi connected
Server started
192.168.1.10
Вот этот IP адрес нам и нужен. Это то что назначено модулю ESP-01 работающим в нашей сети DHCP сервером (обычно его роль в домашней сети играет роутер).
Теперь к нашему модулю можно обращаться по сети. Попробуем включить светодиод (установить уровень HIGH на выводе GPIO2). Для этого, на компьютере или смартфоне, находящемся в той же сети в адресной строке браузера набираем:
http://192.168.1.10/gpio/1
по идее тут же в окне браузера мы должны получить ответ модуля:
GPIO is now high
Светодиод, подключенный к GPIO2 должен загореться, а в мониторе последовательного порта увидим примерно следующее:
new client
GET /gpio/1 HTTP/1.1
Client disonnected
new client
GET /favicon.ico HTTP/1.1
invalid request
new client
Выключим светодиод: для этого в браузере вводим:
http://192.168.1.10/gpio/0
Светодиод гаснет, а в браузере получаем ответ:
GPIO is now low
Теперь можно "удивить" окружающих дистанционным управлением светодиодом. Если вместо светодиода подключить релюшку или тиристор с соответствующими цепями управления, то можно управлять уже чем то более существенным. По идее это будет один из наборов Мастер-кит (по цене в несколько тысяч рублей, при наших затратах порядка 300 руб).
Переделка WebServer - управление четырьмя линиями GPIO0...GPIO3
После первой победы, сразу хочется чего-то большего. На фото показан макет, реализующий управление четырьмя выходами GPIO (светодиодами). Использованы выводы GPIO0...GPIO3. Схема включения светодиодов показана ниже.
Подключение светодиода к GPIO2 описано выше и не вызывает трудностей. Иное дело GPIO0 и GPIO1: если светодиоды подключить катодом на GND, то можно столкнуться с проблемой: при включении питания модуль будет воспринимать уровень сигнала на этих линиях как LOW и "не запускать" загруженную программу, а выходить в режим тестирования (GPIO1 = LOW), либо загрузки по UART (GPIO0 = LOW). Поэтому светодиоды лучше подключать анодом к VCC через токоограничивающий резистор (на GPIO1 (UTXD) такой светодиод уже распаян в модуле ESP-01). К GPIO3 (URXD) можно светодиод подключать любым способом. Следует только помнить, что к этому выводу в режиме загрузки программы подключен выход TxD переходника UART-USB - как бы его "не подпалить" когда GPIO3 будет настроен на вывод!
После первой победы, сразу хочется чего-то большего. На фото показан макет, реализующий управление четырьмя выходами GPIO (светодиодами). Использованы выводы GPIO0...GPIO3. Схема включения светодиодов показана ниже.
Подключение светодиода к GPIO2 описано выше и не вызывает трудностей. Иное дело GPIO0 и GPIO1: если светодиоды подключить катодом на GND, то можно столкнуться с проблемой: при включении питания модуль будет воспринимать уровень сигнала на этих линиях как LOW и "не запускать" загруженную программу, а выходить в режим тестирования (GPIO1 = LOW), либо загрузки по UART (GPIO0 = LOW). Поэтому светодиоды лучше подключать анодом к VCC через токоограничивающий резистор (на GPIO1 (UTXD) такой светодиод уже распаян в модуле ESP-01). К GPIO3 (URXD) можно светодиод подключать любым способом. Следует только помнить, что к этому выводу в режиме загрузки программы подключен выход TxD переходника UART-USB - как бы его "не подпалить" когда GPIO3 будет настроен на вывод!
Т.к. линии UART заняты светодиодами, нам не удастся "промониторить" IP адрес устройства, поэтому "подразумеваем", что адрес остался тем же...
Используем подправленный для нашей задачи скетч WiFiWebServer_4pin.
Назначение GPIO:
int pin01 = 1; //TxD GPIO1 VD to VCC
int pin23 = 2; //GPIO2 VD to GND
int pin45 = 3; //RxD GPIO3 VD to GND (перед включением надо отключить от UART-USB)
int pin67 = 0; //GPIO0 VD to VCC
Управление из адресной строки браузера:
http://192.168.1.10/gpio/0 ... /1 - управление GPIO1
http://192.168.1.10/gpio/2 ... /3 - управление GPIO2
http://192.168.1.10/gpio/4 ... /5 - управление GPIO3
http://192.168.1.10/gpio/6 ... /7 - управление GPIO0
Несколько слов о подаче уровней LOW и HIGH на выводы GPIO. Порты GPIO в процессе запуска модуля могут иметь разное направление работы. Может получиться так, что "запаянная на землю" линия GPIO при инициализации настраивается на вывод, да еще по ней выдается уровень HIGH - в результате выходные каскады модуля могут быть повреждены. "Обезопасить" себя можно подключением выводов к цепям питания через резисторы номиналом 1К..10К.
Используем подправленный для нашей задачи скетч WiFiWebServer_4pin.
Назначение GPIO:
int pin01 = 1; //TxD GPIO1 VD to VCC
int pin23 = 2; //GPIO2 VD to GND
int pin45 = 3; //RxD GPIO3 VD to GND (перед включением надо отключить от UART-USB)
int pin67 = 0; //GPIO0 VD to VCC
Управление из адресной строки браузера:
http://192.168.1.10/gpio/0 ... /1 - управление GPIO1
http://192.168.1.10/gpio/2 ... /3 - управление GPIO2
http://192.168.1.10/gpio/4 ... /5 - управление GPIO3
http://192.168.1.10/gpio/6 ... /7 - управление GPIO0
Несколько слов о подаче уровней LOW и HIGH на выводы GPIO. Порты GPIO в процессе запуска модуля могут иметь разное направление работы. Может получиться так, что "запаянная на землю" линия GPIO при инициализации настраивается на вывод, да еще по ней выдается уровень HIGH - в результате выходные каскады модуля могут быть повреждены. "Обезопасить" себя можно подключением выводов к цепям питания через резисторы номиналом 1К..10К.
Переделка WebServer - 3 линии GPIO на вывод, 1 - на ввод
Кроме вывода данных, может потребоваться и считывание информации... На основе описанного выше примера сделан скетч WiFiWebServer_3out_1in, позволяющий управлять тремя выводами GPIO (GPIO0, GPIO1, GPIO3) и считывать состояние вывода GPIO2. В приведенной выше схеме "освобождаем" GPIO2 от светодиода и подаем на него уровни логической единицы или нуля, имитируя источник данных...
Назначение GPIO
int pin01 = 1; //TxD GPIO1 VD to VCC
int pin23 = 2; //GPIO2 input
int pin45 = 3; //RxD GPIO3 VD to GND
int pin67 = 0; //GPIO0 VD to VCC
управление из адресной строки браузера аналогично вышеописанному
Ответ модуля в окне браузера вглядит примерно так:
GPIO (1,2,3) is now low, high, low input: high
В данном примере столкнулся с "особенностью" работы GPIO на ввод: надо вход GPIO обязательно включать либо на VCC, либо на GND! Висящий в воздухе вывод - дает предыдущее(!?) состояние (скорей всего работает pullup или pulldown резистор линии ввода/вывода модуля).
Вообще говоря, четырех линий ввода/вывода маловато для более-менее серьезного проекта... Можно, конечно, "поиграться" с оставшимся GPIO16... Но значительно эффективнее использовать внешние элементы - сдвиговые регистры для организации требуемого числа линий ввода и вывода. Четырех рассмотренных линий GPIO достаточно для создания произвольного числа линий ввода/вывода. Например, используя регистр 74HC595 (1 штука = 8 выходов) - организуем вывод данных, а 74HC165 (1 штука = 8 входов) - прием данных.
Кроме вывода данных, может потребоваться и считывание информации... На основе описанного выше примера сделан скетч WiFiWebServer_3out_1in, позволяющий управлять тремя выводами GPIO (GPIO0, GPIO1, GPIO3) и считывать состояние вывода GPIO2. В приведенной выше схеме "освобождаем" GPIO2 от светодиода и подаем на него уровни логической единицы или нуля, имитируя источник данных...
Назначение GPIO
int pin01 = 1; //TxD GPIO1 VD to VCC
int pin23 = 2; //GPIO2 input
int pin45 = 3; //RxD GPIO3 VD to GND
int pin67 = 0; //GPIO0 VD to VCC
управление из адресной строки браузера аналогично вышеописанному
Ответ модуля в окне браузера вглядит примерно так:
GPIO (1,2,3) is now low, high, low input: high
В данном примере столкнулся с "особенностью" работы GPIO на ввод: надо вход GPIO обязательно включать либо на VCC, либо на GND! Висящий в воздухе вывод - дает предыдущее(!?) состояние (скорей всего работает pullup или pulldown резистор линии ввода/вывода модуля).
Вообще говоря, четырех линий ввода/вывода маловато для более-менее серьезного проекта... Можно, конечно, "поиграться" с оставшимся GPIO16... Но значительно эффективнее использовать внешние элементы - сдвиговые регистры для организации требуемого числа линий ввода и вывода. Четырех рассмотренных линий GPIO достаточно для создания произвольного числа линий ввода/вывода. Например, используя регистр 74HC595 (1 штука = 8 выходов) - организуем вывод данных, а 74HC165 (1 штука = 8 входов) - прием данных.
опубликовано 01.06.2015