Но как разработчик и hardware интегратор Open-Source библиотеки для Blynk, я часто получаю ранний доступ к различным девайсам. Blynk позволяет быстро прототипировать и строить iOS/Android Apps для интернета вещей, используя drag'n'drop блоки прямо на телефоне.
Плата, которая попала мне в руки, выглядит вот так:
ESP32 обещает снова совершить революцию в мире IoT, как в свое время совершил его младший брат ESP8266 (и я искренне надеюсь, что так и будет). Если Вы раньше ничего не слышали о ESP8266 — читайте, например здесь и здесь (ну и гугл).
Что же собой представляет новый ESP32? Даже с первого взгляда понятно, что это очень мощная платформа. Например, Иван Грохотков (разработчик поддержки Arduino для ESP8266) опубликовал фото игры DOOM на ESP32:
Характеристики ESP32
CPU: Xtensa Dual-Core 32-bit LX6, 160 MHz или 240 MHz (до 600 DMIPS)
Memory: 520 KByte SRAM, 448 KByte ROM
Flash на модуле: 1, 2, 4… 64 Мб
Wireless:
- Wi-Fi: 802.11b/g/n/e/i, до 150 Mbps c HT40
- Bluetooth: v4.2 BR/EDR и BLE
Peripheral interfaces:
- 12-bit SAR ADC до 18 каналов
- 2 ? 8-bit DAC
- 10 ? touch сенсоров
- Temperature сенсор
- 4 ? SPI
- 2 ? I?S
- 2 ? I?C
- 3 ? UART
- 1 host (SD/eMMC/SDIO)
- 1 slave (SDIO/SPI)
- Ethernet MAC с поддержкой DMA и IEEE 1588
- CAN 2.0
- IR (TX/RX)
- Motor PWM
- LED PWM до 16 каналов
- Hall sensor
- Ultra low power analog pre-amplifier
Security:
- IEEE 802.11 безопасность WFA, WPA/WPA2 и WAPI
- Secure boot
- Flash encryption
- 1024-bit OTP, включая до 768-bit под задачу
- Cryptographic движок: AES, SHA-2, RSA, ECC, RNG
На картинке это выглядит так:
Более детальная (и практически полная) информация есть на офф. сайте Espressif Systems. ESP32 будет доступен (как минимум) в нескольких видах:
» Модуль ESP-WROOM-32 ($5 ?)
Распиновка | Datasheet
» Модуль AI-Thinker ESP3212, похожий на ESP-12F ($6.9). На ESP3212 нет ножек для SD-card, в отличии от WROOM-32.
Библиотека Eagle | Библиотека KiCAD
Чип ESP32-D0WDQ6 ($2.8 ?) | Datasheet
- D: Dual-core
- 0: No internal flash
- W: Wi-Fi
- D: Dual-mode Bluetooth
- Q: Quad Flat No-leads (QFN) package
- 6: 6 mm ? 6 mm package body size
Стоит отметить, что до релиза ESP32, был доступен ESP31B (тестовая версия) в виде модуля Espressif ESP-WROOM-03, и в интернетах его часто путают с ESP32.
Осторожно! Практически все упоминания о ESP32 до 09.2016 на самом деле о ESP31B, что вообще не то же самое.
Настройка среды разработки
На оффсайте сейчас можно найти ссылки на два SDK:
» ESP31_RTOS_SDK — SDK для ESP31B, построена на FreeRTOS.
» Espressif IDF (IoT Development Framework) — Official development framework for ESP32.
Хоть это и не очевидно с описания на сайте, но для релизной версии нам подходит только ESP-IDF. Есть инструкции по установке для linux, windows, macos.
У меня 64-bit Ubuntu Linux. Сначала скачал компилятор:
sudo mkdir /opt/Espressif
sudo chmod a+rw /opt/Espressif
cd /opt/Espressif
wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-59.tar.gz
tar -xzf xtensa-esp32-elf-linux64-1.22.0-59.tar.gz
Должна появиться папка
xtensa-esp32-elf
. Потом скачал esp-idf (в той же папке /opt/Espressif
):git clone --recursive https://github.com/espressif/esp-idf.git
Должна появиться папка
esp-idf
.Пишем Hello World
Espressif подготовил для нас темплейт проект, так что начать очень просто:
cd ~
git clone https://github.com/espressif/esp-idf-template.git myapp
cd myapp
Можно попробовать запустить чисто темплейт, но мне это показалось неинтересным. Я чуть-чуть дописал
main/app_main.c
, чтоб помигать светодиодом. Вот что получилось.#include <stdio.h>
#include "rom/gpio.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define LED_PIN 18
#define LOG(msg, ...) printf("[%u] " msg "\n", system_get_time(), ##__VA_ARGS__)
void pingTask(void *pvParameters)
{
while (1) {
GPIO_OUTPUT_SET(LED_PIN, 0);
LOG("low");
vTaskDelay(1000 / portTICK_PERIOD_MS);
GPIO_OUTPUT_SET(LED_PIN, 1);
LOG("high");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void app_main()
{
xTaskCreatePinnedToCore(&pingTask, "pingTask", 2048, NULL, 5, NULL, 0);
}
Собираем и заливаем на плату
Чтоб собрать проект, сначала надо настроить окружение:
cd ~/myapp
export PATH=/opt/Espressif/xtensa-esp32-elf/bin:$PATH
export IDF_PATH=/opt/Espressif/esp-idf
Теперь подключаем плату, включаем питание, и смотрим на каком порту она появилась (у меня это /dev/ttyUSB3). Запускаем конфигуратор:
make menuconfig
Надо зайти в «Serial flasher config» и установить «Default serial port» на порт платы. Можно еще посмотреть другие настройки.
Все, сохраняем и выходим.
Компилируем:
make
Если все хорошо, заливаем на плату:
make flash
Flashing project app to 0x10000...
esptool.py v2.0-dev
Connecting...
Changing baud rate to 921600
Changed.
********************************
IS HSPI: 0x00000000 <type 'int'>
--------------------------
IS LEGACY: 0x00 <type 'int'>
*********************************
SENDING SPI ATTACH COMMAND
--------------
SEND ESP SPI ATTACH CMD
START DOWNLOADING...
Erasing flash...
Unc size 6656 comp size 3900 comp blocks 4
Took 0.09s to erase flash block
Wrote 3900 bytes at 0x00001000 in 0.2 seconds (194.1 kbit/s)...
Hash of data verified.
Erasing flash...
Unc size 378208 comp size 210815 comp blocks 206
Took 1.99s to erase flash block
Wrote 210815 bytes at 0x00010000 in 4.6 seconds (366.2 kbit/s)...
Hash of data verified.
Erasing flash...
Unc size 96 comp size 57 comp blocks 1
Took 0.04s to erase flash block
Wrote 57 bytes at 0x00004000 in 0.1 seconds (5.0 kbit/s)...
Hash of data verified.
Leaving...
Подключаемся к плате используя Putty (screen, или другой эмулятор терминала). Передергиваем питание, и видим:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:QIO, clock div:2
load:0x3ffc0000,len:0
load:0x3ffc0000,len:2268
load:0x40078000,len:3788
load:0x40098000,len:532
entry 0x4009813c
**************************************
* hello espressif ESP32! *
* 2nd boot is running! *
* version (V0.1) *
**************************************
compile time 18:10:20
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size : 4MB
Partition Table:
## Label Usage Type ST Offset Length
0 factory factory app 00 00 00010000 00100000
1 rfdata RF data 01 01 00110000 00040000
2 wifidata WiFi data 01 02 00150000 00040000
End of partition table
Loading app partition at offset 00010000
section 0: paddr=0x00000020 vaddr=0x00000000 size=0x0ffe8 ( 65512)
section 1: paddr=0x00010010 vaddr=0x3f400010 size=0x086fc ( 34556) map
section 2: paddr=0x00018714 vaddr=0x3ffba950 size=0x01248 ( 4680) load
section 3: paddr=0x00019964 vaddr=0x40080000 size=0x00400 ( 1024) load
section 4: paddr=0x00019d6c vaddr=0x40080400 size=0x1326c ( 78444) load
section 5: paddr=0x0002cfe0 vaddr=0x00000000 size=0x03030 ( 12336)
section 6: paddr=0x00030018 vaddr=0x400d0018 size=0x2c540 (181568) map
start: 0x4008078c
Initializing heap allocator:
Region 19: 3FFBBB98 len 00024468 tag 0
Region 25: 3FFE8000 len 00018000 tag 1
Pro cpu up.
Pro cpu start user code
nvs_flash_init
misc_nvs_load g_misc_nvs=0x3ffbbd04
frc2_timer_task_hdl:3ffbc880, prio:22, stack:2048
tcpip_task_hdlxxx : 3ffbe62c, prio:20,stack:2048
phy_version: 80, Aug 26 2016, 13:04:06, 0
pp_task_hdl : 3ffc3360, prio:23, stack:8192
[213450] low
[1212827] high
[2212827] low
[3212828] high
[4212828] low
Если подключить светодиод к
IO18
, то он тоже мигает. Значит, наш код работает!Отладка
Еще одна хорошая новость — в ESP32 есть JTAG интерфейс на ножках
IO12, IO13, IO14, IO15
. Я попробую использовать его для отладки программ. Но об этом уже в следующей статье.Ну что ж, осталось только дождаться наличия ESP32 в магазинах, стабилизации SDK (надеюсь, оно будет изначально намного стабильнее, чем ESP8266). Функция Bluetooth тоже пока не доступна. В скором времени (по моим данным, очень скоро) должны появиться бета-поддержка Arduino IDE и MicroPython, чуть потом Espruino и что-то похожее на NodeMCU.
Что думаете?
Комментарии (20)
de1m
12.09.2016 13:30Интересен вопрос цены, особенно с 64мб памяти. И было бы интересно на проекты посмотреть.
Что с питанием? Меньше, чем у esp8266?
pvvv
12.09.2016 13:36+1я так понимаю что исходников вот этого:
https://github.com/espressif/esp32-wifi-lib
и человеческого даташита, впрочем как и для 8266, не будет и можно и не ждать.i_grr
12.09.2016 14:48+3Мы стараемся улучшить ситуацию с документацией. План таков, что вся периферия (кроме радио и бэйсбэнда) будет документирована на уровне регистров. Текущее состояние дел можно посмотреть в ESP32 Technical Reference Manual: https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en_0.pdf. Надеюсь, вы согласитесь, что это уже больше чем вся документация на 8266 вместе взятая.
Многой периферии пока нет в этом документе. Основной затык в том, что найти хороших технических писателей, которые могут переводить с китайского, достаточно сложно. Поэтому работу по редактированию документации после первоначального перевода приходится делать англоговорящим инженерам, у которых и без этого работы хватает. Я, например, сегодня целый день правил главу про UART. Надеюсь, получится понятно :)
Что касается esp32-wifi-libs: решение опенсорсить все выше нижнего MAC уровня уже принято, и я начал ревьюить и рефакторить код. Скажу честно, работы там много, и идет она небыстро. После того как основная функциональность ESP-IDF будет доделана, я смогу подключить к этому процессу больше людей и дело пойдет быстрее. Пока что результатами в этом направлении похвастаться, увы, не могу.pvvv
12.09.2016 18:10Это замечательно, но в первую очередь говорит лишь о том насколько всё плохо было с 8266.
Но всё равно спасибо, прогресс конечно есть.
А что такого секретного в описаниях регистров радио периферии и уровнях ниже МАС?i_grr
12.09.2016 18:54+2Что касается радио, BB и нижних уровней стека — польза от открытия их не столь очевидна (в отличие от верхних уровней).
Верхние уровни должны быть открыты чтобы портировать, скажем, NuttX или другую RTOS. В верхних уровнях больше шансов, что сторонние разработчики найдут и исправят баги. В верхних уровнях больше возможностей для простых оптимизаций поведения и добавления функционала.
Нижние уровни сложнее документировать — нужно описать устройство и логику работы довольно сложного бэйзбэнда. В нижних уровнях больше возможностей заставить чип плохо себя вести по отношению к другим участникам эфира — мы не хотим давать FCC новый повод для введения ограничений на перепрограммирование WiFi SoC-ов. Найти и исправить баг в нижних уровнях стека обычно намного сложнее.
Принципиальных ограничений на открытие нижних частей стека нет, но пока что от открытия верхней части польза видится больше. Поэтому за верхнюю часть я готов бодаться и тратить на нее ресурсы. Если появится хорошая причина для открытия нижней части или куча способных программистов и технических писателей, окей, поработаем и над ней.
vshymanskyy
12.09.2016 17:42+2Ура, удалось подключить отладчик, так что буду писать следующую статью!
x893
12.09.2016 21:56+1Может попросить мастеров анализа кода пропустить всё через их чудесный продукт для анализа?
kosmonaFFFt
13.09.2016 08:12Для ESP8266 есть проект esp-open-rtos, будет ли что-то подобное для ESP32?
DarkByte
13.09.2016 08:35Забавно то, что совсем скоро планируют отправить чип в продакшн, а функций для работы с блутузом до сих пор в SDK нет. И если остальной функционал более-менее покрыт тестировщиками, то с блутузом стоит ожидать таких же косяков как с esp8266? Странные они какие то.
i_grr
13.09.2016 10:52+2Чип уже в несколько недель как в продакшене. Блютус стек прошел compliance test на прошлой неделе. Да, есть определенные проблемы с интеграцией BT стека, и их фиксят, тестируют, и снова фиксят. BT потому и нет в master'е, что QA еще на дал добро.
На днях мы наконец доделали автоматическое тестирование merge request-ов на реальном железе, так что надеюсь число регрессий будет меньше чем с 8266.
sintech
13.09.2016 18:05На модуле AI-Thinker ESP3212, пины для подключения SD выведены сбоку: IO2, 12,13,14,15.
Пошел заказывать на Ali.
vshymanskyy
15.09.2016 18:39Еще одна свежая статья (English): http://hackaday.com/2016/09/15/esp32-hands-on-awesome-promise/
past
С нетерпением ждем появления на али.
На гитхабе NodeMCU уже вовсю идет портирование.