Однокристальные системы ESP8266 получили большую популярность благодаря своей низкой цене и достаточно мощной начинки. Помимо Wi-Fi-модуля этот контроллер содержит 32-битный процессор Xtensa L106, работающий на частоте 80 МГц с возможностью негарантированного разгона до 160 МГц. К имеющимся 17 портам ввода-вывода возможно подключать различную периферию. Имеются интерфейсы SPI, UART, I2C (программный), I2S и 10-битный АЦП.
Особенностью этой системы является отсутствие встроенной флеш-памяти у микроконтроллера. Программа храниться во внешней микросхеме памяти, подключаемой по интерфейсу ISP (как правило, эта микросхема скрывается под металлическим экраном модуля вместе с процессором, кварцем и прочими элементами обвязки). Перед тем, как программа будет исполнена, она загружается в оперативную память контроллера. Самой оперативной памяти доступно около 80 кБ, плюс ещё 32 кБ используется в качестве кеша инструкций. Подгрузкой инструкций в кэш управляет компилятор, хитрым образом вставляющий в нужных местах кода вызовы соответствующих функций.
Питается контроллер от источника напряжения 2.2 … 3.6 В, потребляемый ток при этом может достигать 215 мА в режиме передачи, 100 мА в режиме приема, и 70 мА в режиме ожидания. В режиме пониженного энергопотребления потребляемый ток сокращается до 15 мкА в режиме Deep sleep (либо до 15 мА и 0.4мА в режимах Modem и Light sleep соответственно.
Для того, чтобы "поиграться" с контроллером ESP8266 была сделана печатная плата, которая, помимо самого контроллера, содержит различную периферию, подключить и отключить которую можно джамперами на плате. Если встроенной периферии окажется недостаточно, то монтажными проводами можно можно подключить всё, что угодно.
Фотографии платы:
Центральным элементом макетной платы является сам ESP8266. Почти все его выводы разведены на разъёмы, которые можно подключить к различной встроенной периферии либо джамперами, либо монтажными проводами. Кроме джамперов есть три кнопки:
Чтобы “поиграться” со встроенным АЦП на плате имеется переменный резистор, на котором собран делитель напряжения. Ко входу АЦП он также подключается джампером.
ESP8266 поддерживает два интерфейса UART для которых на плате разведено два USB-UART преобразователя на микросхемах CH340G с разъёмами miniUSB. Первый используется для загрузки прошивки в микроконтроллер, второй - для вывода отладочных логов (либо любых других целей).
Из периферии на плате есть разъём для подключения цветного дисплея на контроллере ST7735 (в правом верхнем углу), разъём для SD-карты и пищалка с транзисторным ключом. Подсветка дисплея также управляется транзисторным ключом. Её можно просто включить джампером, либо управлять её включением со свободного пина ESP.
Т.к. выводов GPIO у ESP не так много, на плате (снизу) установлена микросхема расширения портов PCA9555, добавляющая ещё 16 линий GPIO, управляемых по шине I2C. Адрес PCA9555 можно выставить джамперами.
К этим дополнительным пинам подключена линейка из 8 светодиодов и 5-кнопочный “джойстик”. Если же светодиоды и кнопки не нужны (полностью, либо частично), то можно просто их не использовать и подключить другую периферию к распаянным контактам.
Питается плата от USB-порта (любого из двух), для питания ESP8266 и всей периферии установлен линейный стабилизатор на 3.3В. Также на плате расположена группа разъёмов, к которым можно подключать другую периферию.
Для работы с платой потребуется установить утилиту esptool. Сделать это можно командой (предполагается, что python/pip уже установлены)
pip install esptool
Программа имеет следующий опции командной строки:
usage: esptool [-h] [--chip {auto,esp8266,esp32}] [--port PORT] [--baud BAUD] [--before {default_reset,no_reset,no_reset_no_sync}] [--after {hard_reset,soft_reset,no_reset}] [--no-stub] [--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]] {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version} Run esptool {command} -h for additional help load_ram Download an image to RAM and execute dump_mem Dump arbitrary memory to disk read_mem Read arbitrary memory location write_mem Read-modify-write to arbitrary memory location write_flash Write a binary blob to flash run Run application code in flash image_info Dump headers from an application image make_image Create an application image from binary files elf2image Create an application image from ELF file read_mac Read MAC address from OTP ROM chip_id Read Chip ID from OTP ROM flash_id Read SPI flash manufacturer and device ID read_flash_status Read SPI flash status register write_flash_status Write SPI flash status register read_flash Read SPI flash content verify_flash Verify a binary blob against flash erase_flash Perform Chip Erase on SPI flash erase_region Erase a region of the flash version Print esptool version optional arguments: -h, --help show this help message and exit --chip {auto,esp8266,esp32}, -c {auto,esp8266,esp32} Target chip type --port PORT, -p PORT Serial port device --baud BAUD, -b BAUD Serial port baud rate used when flashing/reading --before {default_reset,no_reset} What to do before connecting to the chip --after {hard_reset,soft_reset,no_reset}, -a {hard_reset,soft_reset,no_reset} What to do after esptool.py is finished
Убедиться в том, что всё работает правильно, можно, например, командой read_mac, отображающей mac-адрес ESP. Команда запуска будет выглядеть следующим образом (тут /dev/tty.wchusbserial1410 - это имя COM-порта в моей системе, у вас оно, почти наверняка будет другим):
python esptool.py --baud 115200 --port /dev/tty.wchusbserial1410 read_mac
После запуска команды надо перевести ESP в режим управления по SPI. Для этого требуется нажать и удерживать кнопку SPI_CS2 после чего кратковременно нажать кнопку RESET на плате.
Результат в моей системе:
esptool.py v3.0-dev Serial port /dev/tty.wchusbserial1410 Connecting..... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 80:7d:3a:78:ee:a5 Uploading stub... Running stub... Stub running... MAC: 80:7d:3a:78:ee:a5 Hard resetting via RTS pin...
Сохранить резервную копию прошивки можно командой read_flash:
python esptool.py --baud 115200 --port /dev/tty.wchusbserial1410 read_flash 0 1024000 backup.bin
В результате должны увидеть что-то подобное:
esptool.py v3.0-dev Serial port /dev/tty.wchusbserial1410 Connecting..... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 80:7d:3a:78:ee:a5 Uploading stub... Running stub... Stub running... 1024000 (100 %) 1024000 (100 %) Read 1024000 bytes at 0x0 in 97.5 seconds (84.1 kbit/s)... Hard resetting via RTS pin...
Теперь можно заливать в контроллер свою прошивку (командой write_flash) предварительно стерев старую (командой write_flash).