ESP32-S3: распиновка DevKitC, платы Waveshare и отличие от C3
Распиновка ESP32-S3-DevKitC-1 простая: на гребёнках 36 выводов GPIO, из них выводы 19 и 20 отданы под USB, а сам чип двухъядерный с тактовой 240 МГц. Разъёмов на плате два, и это главное отличие от ESP32-C3.
Платы S3 и C3 путают постоянно: обе умеют WiFi, Bluetooth LE и I2C, обе помещаются в ту же коробочку с маркетплейса. Разница уходит в кремний и в разъёмы, и если задача не про USB и не про камеру, то C3 честно дешевле.
Первый мой S3 не прошился. Я выбрал в настройках плату ESP32 Dev Module, нажал загрузить и получил ошибку про отсутствие последовательного порта. Перечитал распиновку через два дня и увидел, что на плате два разъёма, а IDE ждала порт от моста.
S3, C3 и обычный ESP32: что изменилось
Сравнивать имеет смысл по трём осям: ядро, интерфейсы и периферия. Всё остальное вторично, потому что задачи у этих плат пересекаются сильнее, чем кажется.
| Параметр | ESP32 | ESP32-C3 | ESP32-S3 |
|---|---|---|---|
| Ядро | Xtensa LX6, одно | RISC-V, одно | Xtensa LX7, два |
| Тактовая | 240 МГц | 160 МГц | 240 МГц |
| Векторные инструкции | нет | нет | есть, SIMD 128 бит |
| USB на борту | только мост | Serial и JTAG | OTG и Serial и JTAG |
| Линий GPIO в чипе | 34 | 22 | 45 |
| Оперативная память | 520 КБ | 400 КБ | 512 КБ |
| Каналы АЦП | 18 | 10 | 20 |
| Ёмкостное касание | нет | нет | 14 каналов |
| Декодер JPEG | нет | нет | есть |
| Цифровой выход | 2 ЦАП | нет | нет |
Одна строка в этой таблице объясняет, почему S3 стоит брать: два USB. На C3 есть только Serial и JTAG, и он умеет быть последовательным портом, но не умеет притвориться клавиатурой или мышью. На S3 есть полноценный USB OTG, и с ним чип работает как устройство HID без единого внешнего резистора.
Два разъёма USB и выводы 19 и 20
На плате DevKitC стоят два разъёма Micro USB. Первый ведёт на отдельный мост USB и нужен для прошивки и обычного Serial. Второй подключён напрямую к выводам 19 и 20 самого чипа и даёт нативный USB OTG, он же используется как Serial и JTAG при отладке.
- Разъём с мостом даёт виртуальный порт COM на скорости до 3 Мбит/с и нужен всегда при прошивке.
- Разъём на выводах 19 и 20 даёт USB OTG чипа, а вместе с ним отладку по JTAG без внешнего отладчика.
- Оба контроллера делят одну пару выводов, поэтому включить их одновременно нельзя.
- Кабель должен нести линии данных: зарядные шнуры их не имеют, и порт не появится.
- После первой прошивки через нативный USB компьютер видит устройство как CDC, а не как Arduino.
Распиновка DevKitC: 36 выводов на гребёнках
Модуль S3 в корпусе WROOM имеет 45 линий GPIO: от GPIO0 до GPIO21 и от GPIO26 до GPIO48. Девять линий, с GPIO26 по GPIO34, отданы внутренней шине SPI флеша и наружу не выведены. На гребёнках платы остаётся 36 выводов: с GPIO0 по GPIO21 и с GPIO35 по GPIO48.
- Выводы 19 и 20 заняты USB, и трогать их без нужды не стоит.
- GPIO43 это TX, GPIO44 это RX, туда же подключён встроенный мост.
- GPIO0 держит кнопку Boot, и на нём же высокий уровень при старте вводит режим загрузки прошивки.
- GPIO35, GPIO36 и GPIO37 на модулях с восьмибитной PSRAM заняты внутренней шиной и наружу не выведены.
- Вывод 38 или 48 на плате занят адресным светодиодом RGB: в версии 1.0 это 48, в версии 1.1 это 38.
- VP и VN это аналоговые входы, канал АЦП на них один и он 12 бит.
Декодер JPEG, камера и касание
В S3 встроен аппаратный декодер JPEG, и на этом чипе делают камеры: плата с модулем OV2640 и интерфейсом DVP снимает картинку без внешнего преобразователя. Распаковка кадра на процессоре не занимает время, как на обычном ESP32, где для этого нужен был жадный разбор в памяти.
Ещё одна особенность S3, которой нет ни у C3, ни у первого ESP32: 14 ёмкостных каналов касания на выводах с GPIO1 по GPIO14. Палец или кусок бумаги на сенсорной площадке дают значение, которое читается функцией touchRead. Это работает без микроконтроллера на кнопке.
#include <Arduino.h> void setup() { Serial.begin(115200); delay(300); Serial.print("Board: "); Serial.println(ARDUINO_BOARD); #if CONFIG_IDF_TARGET_ESP32S3 Serial.println("Target: ESP32-S3, dva yadra Xtensa LX7 240 MHz");#elif CONFIG_IDF_TARGET_ESP32C3 Serial.println("Target: ESP32-C3, odno yadro RISC-V 160 MHz");#else Serial.println("Target: ne ESP32");#endif touchRead(0); // inizializaciya skanirovaniya kanalov} void loop() { for (int i = 0; i < 14; i++) { int t = touchRead(i); if (t > 20) { Serial.print("Kanal "); Serial.print(i); Serial.print(" soglazhivanie: "); Serial.println(t); } } delay(200);}Какую плату брать: DevKitC, Super Mini, Zero, Waveshare
Под запросы «waveshare esp32 s3» и «esp32 s3 mini» в продаже идёт много разных плат, и разница между ними не в чипе, а в разъёмах, экране и памяти.
| Плата | Что на ней есть | Кому подходит |
|---|---|---|
| ESP32-S3-DevKitC-1 | 36 GPIO, два USB, светодиод RGB | Универсальный выбор для старта |
| Super Mini | маленькая, один разъём USB | Проекты в корпусе и на макетке |
| Zero | компактная, PSRAM 2 или 8 МБ | Камера и картинки при нехватке выводов |
| Waveshare S3 | экран, слот карты, два USB | Готовый терминал без пайки |
| Модуль S3 WROOM | модуль без платы | Своя плата под свой корпус |
Платы Waveshare берут ради готового экрана и слота карты памяти, а не ради самого чипа: там же S3 с небольшим экраном и парой кнопок. Для первого проекта это удобно, но выводов на гребёнках у них меньше, чем у DevKitC.
Что сначала не получилось
Первый провал занял два вечера. Я выбрал в настройках IDE плату ESP32 Dev Module, подключил плату разъёмом с мостом, нажал загрузить и получил ошибку: порта нет. Я переустановил драйвер, переткнул кабель в другой разъём, скачал другую версию IDE и только потом догадался посмотреть на надпись на плате.
Дело было в том, что плата с S3 не определяется автоматически. Для неё надо выбрать конкретную плату из списка, а после первой прошивки порт переезжает: вместо порта моста появляется устройство USB CDC, и IDE перестаёт его видеть как Arduino.
Второй тупик был глупее и обошёлся дороже. Я купил плату Super Mini, припаял к ней датчик температуры на вывод 4 и неделю не мог понять, почему показания застыли на нуле. На Super Mini выводы подписаны не как на DevKitC, и я перепутал номера: датчик ушёл на вывод питания.
Личный опыт: терминал на S3
Мой первый проект на S3 был настольным терминалом: плата, маленький экран на SPI, кнопки и датчик температуры. Задача была показать текущую температуру и датчик BLE со смартфона, а время ответа не больше секунды.
Что выяснилось по ходу. Перерисовка экрана занимала 40 мс, и при обновлении раз в секунду это было видно как короткое мигание, поэтому я рисовал только изменившиеся цифры. Второй разъём я оставил на мосте, а нативный USB задействовал под HID, чтобы терминалом можно было управлять с компьютера без установки драйверов. А вывод 35 на моей плате с восьмибитной PSRAM был недоступен, и я перенёс на него кнопку только после того, как перечитал документацию.
Авторская позиция: когда брать S3, а когда C3
Новичку я бы посоветовал начинать с C3. Он дешевле, у него нет ни одного лишнего разъёма, а WiFi и Bluetooth LE там работают точно так же. Большинство проектов, которые начинаются с «подключить датчик и отправить значение на телефон», на C3 умещаются целиком.
S3 стоит брать по трём причинам. Первая: нужен нативный USB, то есть HID, мышь, клавиатура или флешка. Вторая: камера или декодер JPEG. Третья: два ядра и векторные инструкции под вычисления. Если ни одной из трёх причин у вас нет, S3 будет дороже и бессмысленнее.
И ещё одно правило: сначала прошивайте через разъём с мостом. Нативный USB на S3 удобен, но пока плата не прошита, он бесполезен, а переключение портов в IDE сбивает с толку сильнее, чем любой другой нюанс этой платы.