Справочник платы

ESP32-C6: распиновка, Zigbee и настройка Arduino IDE

ESP32-C6 — чип Espressif с Wi-Fi 6, Bluetooth LE и радио Zigbee в одном корпусе. На нём делают Super Mini, DevKitC-1, XIAO ESP32C6 и другие платы. Здесь — распиновка трёх самых ходовых плат, какой пункт выбрать в меню, почему молчит монитор порта и как собрать Zigbee-лампу с выключателем из двух плат, без хаба.

Что это за чип

ESP32-C6 — чип для умного дома

У ESP32-C6 одно ядро RISC-V на 160 МГц и ещё одно маленькое, которое может работать, пока основное спит (из Arduino его пока не запустить). Главное отличие от соседей по семейству — радио: кроме Wi-Fi и Bluetooth LE в чипе есть Zigbee и Thread, сети умного дома с датчиками на батарейках. Программируется она так же, как Ардуино: setup(), loop() и digitalWrite() — те же, что на Uno. Если Zigbee не нужен, а нужна просто маленькая плата с Wi-Fi, дешевле обойдётся ESP32-C3 Super Mini.

Какая у вас плата: Super Mini, DevKitC-1, XIAO и другие

Чип один, а плат на нём много, и отличаются они не только размером: у каждой свои светодиоды, свой набор разъёмов и свой пункт в меню.

ПлатаЧип и флеш-памятьРазъём USBСветодиодыПункт меню
Super MiniESP32-C6FH4, 4 МБ внутриодин, роднойцветной на 8, синий на 15«MakerGO ESP32 C6 SuperMini»
ESP32-C6-DevKitC-1модуль WROOM-1, 8 МБдва: «UART» и «USB»цветной на 8«ESP32C6 Dev Module»
XIAO ESP32C6ESP32-C6FH4, 4 МБ внутриодин, роднойжёлтый на 15, горит при LOW«XIAO_ESP32C6»
Waveshare ESP32-C6-ZeroESP32-C6FH4, 4 МБ внутриодин, роднойцветной на 8«Waveshare ESP32-C6-Zero»

В пакете ESP32 есть свои пункты меню ещё для полутора десятков плат на C6. Если плата фирменная, поищите в списке её название; своего пункта нет — выбирайте «ESP32C6 Dev Module» и проверьте USB CDC On Boot. Самые известные из остальных:

Пункт менюLED_BUILTINUSB CDC On Boot по умолчанию
«M5NanoC6»синий на 7Enabled
«DFRobot Beetle ESP32-C6», «DFRobot FireBeetle 2 ESP32-C6»на 15Disabled
«Adafruit Feather ESP32-C6»на 15Disabled
«SparkFun ESP32-C6 Thing Plus»цветной на 23Enabled
«SparkFun ESP32-C6 Qwiic Pocket»на 23Enabled
«OLIMEX ESP32-C6-EVB»на 8Disabled
«UM TinyC6»цветной, флеш-память 8 МБEnabled

Как отличить C6 Super Mini от C3 Super Mini

Внешне платы почти одинаковые, и их легко перепутать. Отличия: на чипе написано ESP32-C6, а не C3; по краям 20 контактов, а не 16; на самой плате есть круглые пятачки с выводами 12, 13, 21, 22 и 23; кроме синего светодиода есть цветной. Если в меню выбрать пункт для C3, загрузка остановится с ошибкой This chip is ESP32-C6, not ESP32-C3. Про саму C3 — отдельная статья.

Плата с экраном ESP32-C6-LCD-1.47

У платы Waveshare ESP32-C6-LCD-1.47 с цветным экраном 1,47″ и её версии с сенсорным экраном своего пункта в меню пакета ESP32 нет: выбирают «ESP32C6 Dev Module» и включают USB CDC On Boot — разъём USB у неё один, родной. Какие выводы заняты экраном и какую библиотеку советует производитель, написано в его описании, а как вообще работать с цветными экранами — в статье про TFT-дисплеи.

Характеристики ESP32-C6

ЯдроRISC-V, одно, до 160 МГц, и маленькое ядро LP до 20 МГц для работы во сне
Оперативная память512 КБ и ещё 16 КБ, которые сохраняются в глубоком сне. Дополнительной внешней памяти (PSRAM), как у S3, нет
Флеш-память4 МБ внутри чипа у ESP32-C6FH4 (8 МБ у FH8) или отдельная микросхема на модуле — 4, 8 или 16 МБ
Wi-FiWi-Fi 6 (802.11ax) и 802.11 b/g/n, только 2,4 ГГц
BluetoothBluetooth LE 5. Классического Bluetooth нет
Zigbee и Threadрадио IEEE 802.15.4: Zigbee 3.0 и Thread 1.3
Выводы30 GPIO у чипа в корпусе побольше, 22 — у ESP32-C6FH4; на платах выведено меньше
Аналоговые входыодин АЦП на 12 бит, 7 входов на выводах 0–6, до 3,3 В
Интерфейсы2 UART, I²C, SPI, I²S, ШИМ на 6 каналов и две шины CAN (TWAI) — как в автомобилях и станках
USBродной USB: прошивка, монитор порта и отладка. USB OTG нет
Питание чипа3,0–3,6 В; на выводы — не больше 3,6 В
Токдо 354 мА в пике передачи Wi-Fi, 7 мкА у самого чипа в глубоком сне

Цифры — из паспорта Espressif, ESP32-C6 Series Datasheet. Логика у платы 3,3-вольтовая: на выводы нельзя подавать больше 3,6 В. Датчик, который отвечает пятью вольтами, подключают через делитель из двух резисторов или преобразователь уровней.

ESP32-C6-WROOM-1: что значат N4, N8 и N16 — и почему R8 не бывает

На модулях ESP32-C6-WROOM-1 после названия пишут объём флеш-памяти: N4 — 4 МБ, N8 — 8 МБ, N16 — 16 МБ. Буква U в названии, WROOM-1U, значит, что вместо антенны на модуле разъём для внешней. У платы-малютки флеш-память спрятана в самом чипе: ESP32-C6FH4 — это 4 МБ, FH8 — 8 МБ. Буквы R, как у ESP32-S3 N16R8, у C6 нет: внешнюю PSRAM этот чип не поддерживает вовсе.

Распиновка ESP32-C6: Super Mini, DevKitC-1 и XIAO

Выберите плату: Super Mini, DevKitC-1 или XIAO. Рядом с номером вывода — его роль. Наведите на категорию в легенде, чтобы подсветить её выводы, и нажмите на неё, чтобы прочитать пояснение. Super Mini выпускают разные фабрики, и раскладка у партий бывает разной: перед тем как паять, сверьте картинку с надписями на своей плате — особенно 5V, GND и 3V3.

Распиновка ESP32-C6 — схема выводовUSB-CLED 15BOOT · 9RSTRGB 8ESP32-C6антенна2322211213TX · 16RX · 17A0 · 0A1 · 1A2 · 2A3 · 3A4 · 4A5 · 5A6 · 675VGND3V320 · SDA19 · SCL1815 · LED149 · BOOT8 · RGB

Так разведено у большинства Super Mini — сверьте с надписями на своей плате. Плата лежит деталями вверх, разъём USB сверху: питание 5V, GND и 3V3 — справа. Подписи SDA и SCL — для пункта меню «MakerGO ESP32 C6 SuperMini»; у «ESP32C6 Dev Module» шина I²C по умолчанию уходит на пятачки 23 и 22. Пятачки 12, 13, 21, 22 и 23 — круглые площадки на самой плате: к ним провод придётся припаять.

Распиновка XIAO ESP32C6: D0–D10 и номера выводов

Если держать плату деталями вверх и разъёмом USB к себе от стола, слева сверху вниз идут D0–D6, справа — 5V, GND, 3V3, D10, D9, D8 и D7. В скетче можно писать и D-номер, и номер вывода чипа:

На платеВывод чипаРоль по умолчанию
D00A0
D11A1
D22A2
D321SS
D422SDA
D523SCL
D616TX
D717RX
D819SCK
D920MISO
D1018MOSI

Выводы 4, 5, 6 и 7 выведены пятачками на обратную сторону. По умолчанию работает встроенная антенна; чтобы перейти на внешнюю через разъём U.FL, в начале setup() напишите digitalWrite(WIFI_ANT_CONFIG, HIGH);.

Распиновка ESP32-C6-DevKitC-1: гребёнки J1 и J3

Если положить плату модулем с антенной вверх, разъёмами USB вниз, слева окажется гребёнка J1: 3V3, RST, 4, 5, 6, 7, 0, 1, 8, 10, 11, 2, 3, 5V, GND, NC. Справа J3: GND, 16 (TX), 17 (RX), 15, 23, 22, 21, 20, 19, 18, 9 (BOOT), GND, 13, 12, GND, NC. Внизу слева разъём «UART», справа — «USB». На гребёнки выведены все выводы модуля WROOM-1, кроме тех, что заняты флеш-памятью.

Какие выводы можно занимать

ВыводыМожно ли занять
0, 1, 2, 3, 6Свободны. Это ещё и аналоговые входы A0–A3 и A6
7, 18–23; 14 — у Super Mini и Zero; 10 и 11 — у DevKitC-1Свободны. У Super Mini 21, 22 и 23 — круглые пятачки на плате, к ним придётся паять
4, 5Можно. Чип читает их при запуске, но они задают только служебный режим SDIO, а на запуск и прошивку не влияют. Заодно аналоговые входы A4 и A5
8Осторожно: при включении должен быть HIGH, иначе плата не войдёт в режим прошивки. На большинстве плат на нём цветной светодиод
9Кнопка BOOT: прижатый к земле при включении, он отправляет плату в режим прошивки. Как вход годится, если при включении его не прижимать
15Можно. Чип читает его при запуске, но на обычных платах это ни на что не влияет. На Super Mini и XIAO на нём светодиод
16, 17На Super Mini, XIAO и Zero — можно, если Serial идёт через USB; при включении на 16 приходят строки загрузчика. На DevKitC-1 — нет: они соединены с мостом USB-UART
12, 13Нет: это линии USB, займёте их — пропадёт порт
3 и 14 у XIAOНет, на гребёнку они и не выведены: 3 включает питание переключателя антенны, 14 выбирает антенну — встроенную или разъём U.FL

Выводы I²C и SPI по умолчанию — свои у каждого пункта меню

Wire.begin() и SPI.begin() без номеров берут выводы из описания платы в пакете. А оно у каждого пункта меню своё:

Пункт менюSDA / SCLSPI: SCK, MISO, MOSI, SS
«ESP32C6 Dev Module»23 / 2221, 20, 19, 18
«MakerGO ESP32 C6 SuperMini»20 / 197, 6, 5, 4
«XIAO_ESP32C6»22 / 2319, 20, 18, 21
«Waveshare ESP32-C6-Zero»14 / 1521, 20, 19, 18

Super Mini, собранная под «ESP32C6 Dev Module», будет искать датчик на выводах 23 и 22 — а это пятачки на плате. Чтобы не гадать, указывайте выводы явно: Wire.begin(20, 19), где первое число — SDA, второе — SCL. Подробнее о шине — в статье про I²C.

Аналоговые входы: семь, до 3,3 В, и с Wi-Fi тоже

Аналоговые входы — выводы 0–6, в скетче A0–A6 (у пункта «XIAO_ESP32C6» объявлены только A0–A2 — остальные пишите номером вывода, например analogRead(4)). analogRead() возвращает от 0 до 4095 при напряжении от 0 до 3,3 В, а analogReadMilliVolts() — сразу милливольты. У других плат семейства есть две неприятности, которых у C6 нет. У C3 точные показания только до 2,5 В. У обычной ESP32 и S3 часть входов замолкает, пока работает Wi-Fi: Wi-Fi занимает второй блок входов. У C6 блок один, и все семь входов работают вместе с Wi-Fi.

Какую плату выбрать в Arduino IDE для ESP32-C6

Платы на C6 есть только в пакете ESP32 версии 3 и новее: в пакетах 1.x и 2.x этого чипа нет вовсе, а в ранних 3.x нет пунктов «MakerGO ESP32 C6 SuperMini» и «Waveshare ESP32-C6-Zero». Всё на этой странице относится к пакету 3.3.12. Если в списке нет ни одной C6 или нет пункта для вашей платы, обновите пакет — как его поставить; если список пакетов не скачивается — разбор этой ошибки. Дальше выберите пункт под свою плату:

ESP32-C6 Super MiniПункт меню«MakerGO ESP32 C6 SuperMini»: его таблица выводовсовпадает с платойUSB CDC On BootПо умолчанию «Disabled» — поставьте «Enabled». МостаUSB-UART на плате нет, и без этого монитор порта будетмолчатьСветодиодыLED_BUILTIN — синий на выводе 15, обычно горит при HIGH.Цветной на выводе 8 зажигают функцией rgbLedWrite()I²C по умолчаниюSDA — 20, SCL — 19С «ESP32C6 Dev Module»Тоже работает, но I²C уходит на пятачки 23 и 22, аLED_BUILTIN становится цветным светодиодом. USB CDC OnBoot включать так же«MakerGO ESP32 C6 SuperMini» и USB CDC On Boot: «Enabled»
У каждого пункта меню своя таблица выводов: один и тот же скетч на разных пунктах может искать датчик I²C на разных ножках, а LED_BUILTIN — на разных светодиодах.

В Arduino IDE параметры платы — в меню «Инструменты», в Trema IDE — под кнопкой «Параметры платы» на верхней панели.

Один разъём USB или два: куда подключать кабель

У Super Mini, XIAO и Zero один разъём — родной USB самого чипа. У DevKitC-1 их два: «UART» ведёт к мосту USB-UART — микросхеме- переходнику между USB и выводами 16 и 17 (у платы Espressif это CP2102N, у копий бывает CH340 или CH343), «USB» — к родному USB чипа. Прошивать можно через любой, а вот куда попадёт печать Serial, решает параметр USB CDC On Boot. Выберите, куда подключён кабель:

Плата с одним разъёмом, USB CDC On Boot: DisabledМонитор портаВаших строк не будет: Serial пишет на выводы 16 и 17, а кним ничего не подключеноЗагрузка программыРаботает: родной USB сам переводит плату в режим прошивкиЧто видит компьютер«Последовательное устройство USB (COMx)», в свойствах —VID_303AЗагрузится, но монитор порта будет молчать
Куда пойдёт Serial, решает один параметр, и он должен совпадать с разъёмом, в котором кабель. Отдельного пункта USB Mode у C6 нет: её родной USB всегда работает как последовательный порт.

Если компьютер не видит порт моста на DevKitC-1, поставьте драйвер для той микросхемы, что стоит у разъёма «UART», — инструкция по драйверам. Родному USB драйвер в Windows 10 и 11 не нужен.

Монитор порта ESP32-C6 молчит

Самая частая беда с платами на C6. Проверьте по порядку:

  • USB CDC On Boot стоит «Enabled», если у платы один разъём. У пунктов «ESP32C6 Dev Module» и «MakerGO ESP32 C6 SuperMini» по умолчанию «Disabled».
  • Скорость монитора — 115200, как в скетчах на этой странице. Это важно для разъёма «UART» у DevKitC-1, родному USB скорость безразлична.
  • В начале setup() есть пауза: родному USB нужно мгновение, чтобы появиться, и первые строки иначе теряются.

Всё про сам монитор — в статье про монитор порта.

Первая прошивка: цветной светодиод на выводе 8

Цветной светодиод на DevKitC-1, Super Mini и Zero — адресный, WS2812. Он принимает цвет посылкой, поэтому digitalWrite(8, HIGH) его не зажжёт, а rgbLedWrite(8, красный, зелёный, синий) — зажжёт. У «ESP32C6 Dev Module» LED_BUILTIN равен 39: это не ножка, а условный номер этого светодиода. Поэтому стандартный Blink всё же мигает — белым.

Скетч перебирает цвета и печатает в монитор порта название чипа — так заодно видно, что плата именно на C6:

// Цветной светодиод ESP32-C6 — адресный WS2812 на выводе 8: так на
// DevKitC-1, Super Mini и Waveshare Zero. Им управляют посылкой цвета,
// поэтому digitalWrite(8, HIGH) его не зажжёт — нужен rgbLedWrite().
// У XIAO ESP32C6 цветного светодиода нет, там простой жёлтый на выводе 15.

const int RGB_PIN = 8;
const int BRIGHTNESS = 40;       // 0–255: на полной яркости светодиод слепит

void showColor(const char *name, int r, int g, int b) {
  rgbLedWrite(RGB_PIN, r, g, b);
  Serial.println(name);
  delay(1000);
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print("Чип: ");
  Serial.println(ESP.getChipModel());   // ESP32-C6 — значит, плата та самая
  showColor("красный", BRIGHTNESS, 0, 0);
  showColor("зелёный", 0, BRIGHTNESS, 0);
  showColor("синий", 0, 0, BRIGHTNESS);
  showColor("погашен", 0, 0, 0);
}
  1. Выберите свой пункт меню и порт. Для Super Mini включите USB CDC On Boot.
  2. Нажмите «Загрузить».
  3. Откройте монитор порта на 115200 — там будет строка «Чип: ESP32-C6».

У XIAO ESP32C6 цветного светодиода нет: скетч соберётся, но светить будет нечему. У неё жёлтый светодиод на выводе 15 (Seeed называет его оранжевым), и горит он наоборот — при LOW. Проверить XIAO проще стандартным Blink: «Файл» → «Примеры» → «01.Basics» → «Blink» мигает именно им. У Super Mini, кроме цветного, есть синий на выводе 15, он обычно горит при HIGH.

Не прошивается: «This chip is ESP32-C6, not ESP32-C3» и «Failed to connect»

Что пишет загрузкаЧто это значит и что делать
This chip is ESP32-C6, not ESP32-C3. Wrong chip argument?В меню выбрана плата на ESP32-C3, а подключена C6: Super Mini на этих чипах почти не отличить. Выберите пункт для C6
This chip is ESP32-C6, not ESP32. Wrong chip argument?Выбран пункт для обычной ESP32, например «ESP32 Dev Module». Выберите пункт для C6
Failed to connect to ESP32-C6: No serial data received.Порт открылся, но чип не ответил: он не перешёл в режим прошивки. Так бывает, если вывод 8 при включении прижат к земле или прошлая программа без конца перезагружает плату, а у DevKitC-1 через разъём «UART» — если мост не смог сам переключить плату. Переведите её в режим прошивки кнопками BOOT и RST
Wrong boot mode detected (0x…)! The chip needs to be in download mode.Плата перезапустилась как обычно, а не в режиме прошивки. Держите BOOT, нажмите и отпустите RST, отпустите BOOT и загружайте снова
Could not open COM3, the port is busy or doesn't exist.Порт занят — чаще всего монитором порта в другом окне или другой программой — или пропал. У плат с одним разъёмом порт пропадает, когда программа заняла выводы USB или ушла в глубокий сон: переведите плату в режим прошивки кнопками BOOT и RST и выберите порт заново

Режим прошивки вручную. Нажмите и держите BOOT, нажмите и отпустите кнопку RST (на DevKitC-1 она подписана RESET), отпустите BOOT и запускайте загрузку. Это лечит почти все беды плат с одним разъёмом: если программа заняла выводы USB, упала или ушла в глубокий сон, порт пропадает, а в режиме прошивки снова появляется. После загрузки нажмите RST ещё раз — программа запустится.

Общие причины — не тот порт, кабель без линий данных — разобраны в статье про ошибки загрузки, а беды прошивки всех ESP32 — в разборе «ESP32 не прошивается».

Zigbee-устройство на ESP32-C6: что нужно знать до начала

Zigbee — сеть умного дома, в которой устройства говорят друг с другом напрямую, без Wi-Fi. У каждого устройства своя роль. Координатор создаёт сеть и пускает в неё новичков — в сети он один. Ретранслятор (router) передаёт чужие сообщения дальше и так расширяет сеть, обычно это устройства с постоянным питанием: реле, розетки. Конечное устройство (end device) — датчик или лампа из примеров пакета: только принимает команды или отправляет показания.

Отсюда главное: одна плата сама по себе Zigbee не покажет — ей нужен координатор. Им может быть вторая плата на ESP32-C6 со скетчем выключателя ниже, USB-стик в Home Assistant или хаб умного дома. И ещё: Wi-Fi и Zigbee у C6 делят одну антенну. В простых примерах они работают порознь, поэтому начинайте с одного протокола.

Zigbee Mode и Partition Scheme: два пункта, без которых ничего не выйдет

В параметрах платы нужно выставить роль — Zigbee Mode — и разметку флеш-памяти — Partition Scheme. Выберите, что собираете:

Лампа или датчикZigbee Mode«Zigbee ED (end device)» — конечное устройствоPartition Scheme«Zigbee 4MB with spiffs»Что будетПлата ищет сеть и входит в неё, когда координатор откроетсеть для новых устройствТак собирают лампы и датчики
Оба пункта есть в параметрах платы рядом с остальными. Разметка Zigbee отводит во флеш-памяти место, где плата хранит ключи и адрес своей сети, — без него библиотеке негде их сохранить.

Пример Zigbee для Arduino: лампа и выключатель-координатор без хаба

Самый короткий путь увидеть Zigbee своими глазами — две платы на ESP32-C6. Первая — выключатель: она же координатор, создаёт сеть. Вторая — лампа: входит в сеть и зажигает цветной светодиод по команде. Кнопка BOOT на выключателе переключает лампу.

Выключатель. Zigbee Mode — «Zigbee ZCZR (coordinator/router)», Partition Scheme — «Zigbee ZCZR 4MB with spiffs»:

// Zigbee-выключатель на ESP32-C6. Он же координатор: создаёт свою сеть
// Zigbee, и плата со скетчем «Zigbee-лампа» входит в неё сама.
// В меню платы: Zigbee Mode — «Zigbee ZCZR (coordinator/router)»,
// Partition Scheme — «Zigbee ZCZR 4MB with spiffs».
// Нажатие кнопки BOOT переключает все лампы, привязанные к выключателю.

#ifndef ZIGBEE_MODE_ZCZR
#error "В меню Zigbee Mode выберите «Zigbee ZCZR (coordinator/router)»"
#endif

#include "Zigbee.h"

const uint8_t SWITCH_ENDPOINT = 5;   // номер «гнезда» выключателя внутри платы

ZigbeeSwitch zbSwitch = ZigbeeSwitch(SWITCH_ENDPOINT);

void setup() {
  Serial.begin(115200);
  delay(2000);                       // время открыть монитор порта
  pinMode(BOOT_PIN, INPUT_PULLUP);   // кнопка BOOT — вывод 9

  zbSwitch.allowMultipleBinding(true);   // можно привязать несколько ламп
  Zigbee.addEndpoint(&zbSwitch);

  // После включения сеть открыта 180 секунд: за это время включите лампу.
  Zigbee.setRebootOpenNetwork(180);

  if (!Zigbee.begin(ZIGBEE_COORDINATOR)) {
    Serial.println("Zigbee не запустился, перезапускаю плату");
    delay(2000);
    ESP.restart();
  }

  Serial.print("Жду лампу");
  while (!zbSwitch.bound()) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.println("Лампа привязана. Нажимайте BOOT — она будет переключаться");
}

void loop() {
  if (digitalRead(BOOT_PIN) == LOW) {       // кнопку нажали
    delay(50);                              // пережидаем дребезг
    if (digitalRead(BOOT_PIN) == LOW) {
      zbSwitch.lightToggle();               // команда всем привязанным лампам
      Serial.println("Переключить");
      while (digitalRead(BOOT_PIN) == LOW) {
        delay(10);                          // ждём, пока отпустят
      }
    }
  }
  delay(20);
}

Лампа. Zigbee Mode — «Zigbee ED (end device)», Partition Scheme — «Zigbee 4MB with spiffs»:

// Zigbee-лампа на ESP32-C6: сама входит в сеть Zigbee и зажигает
// цветной светодиод по команде выключателя.
// В меню платы: Zigbee Mode — «Zigbee ED (end device)»,
// Partition Scheme — «Zigbee 4MB with spiffs».
// Кнопка BOOT: коротко — переключить лампу на месте; держать 3 секунды —
// забыть сеть и искать новую.

#ifndef ZIGBEE_MODE_ED
#error "В меню Zigbee Mode выберите «Zigbee ED (end device)»"
#endif

#include "Zigbee.h"

const uint8_t LIGHT_ENDPOINT = 10;   // номер «гнезда» лампы внутри платы
const int RGB_PIN = 8;               // цветной светодиод WS2812

ZigbeeLight zbLight = ZigbeeLight(LIGHT_ENDPOINT);

// Библиотека вызывает эту функцию, когда лампу включили или выключили.
void setLight(bool on) {
  if (on) {
    rgbLedWrite(RGB_PIN, 40, 40, 40);   // белый, яркость 40 из 255
  } else {
    rgbLedWrite(RGB_PIN, 0, 0, 0);
  }
  Serial.println(on ? "Лампа включена" : "Лампа выключена");
}

void setup() {
  Serial.begin(115200);
  delay(2000);                       // время открыть монитор порта
  pinMode(BOOT_PIN, INPUT_PULLUP);   // кнопка BOOT — вывод 9
  setLight(false);

  zbLight.onLightChange(setLight);
  Zigbee.addEndpoint(&zbLight);

  if (!Zigbee.begin()) {             // по умолчанию — конечное устройство
    Serial.println("Zigbee не запустился, перезапускаю плату");
    delay(2000);
    ESP.restart();
  }

  Serial.print("Ищу сеть");
  while (!Zigbee.connected()) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.println("Лампа в сети, жду команд выключателя");
}

void loop() {
  if (digitalRead(BOOT_PIN) == LOW) {       // кнопку нажали
    unsigned long start = millis();
    delay(50);                              // пережидаем дребезг
    while (digitalRead(BOOT_PIN) == LOW) {  // и ждём, пока отпустят
      delay(10);
      if (millis() - start > 3000) {
        Serial.println("Забываю сеть и перезапускаюсь");
        delay(500);
        Zigbee.factoryReset();              // плата перезапустится сама
      }
    }
    zbLight.setLight(!zbLight.getLightState());
  }
  delay(20);
}
  1. Прошейте обе платы, каждую — со своими пунктами меню. Для Super Mini включите ещё USB CDC On Boot, иначе монитор порта промолчит. Сборка с Zigbee идёт дольше обычной — до пары минут.
  2. Откройте монитор порта лампы.
  3. Нажмите RST на выключателе: с этого момента он 180 секунд пускает в сеть новые устройства.
  4. Сразу нажмите RST на лампе. Точки после «Ищу сеть» сменятся строкой «Лампа в сети», а выключатель напишет «Лампа привязана».
  5. Нажимайте BOOT на выключателе — светодиод лампы будет загораться и гаснуть.

На XIAO цветного светодиода нет: в функции setLight() скетча лампы замените rgbLedWrite() на digitalWrite(15, on ? LOW : HIGH) и добавьте pinMode(15, OUTPUT); в setup().

Лампа не входит в сеть

  • Сеть выключателя уже закрыта: прошло больше 180 секунд. Нажмите RST на выключателе и сразу — на лампе.
  • Лампа пишет «Лампа в сети», а выключатель всё ждёт — лампа помнит прежнюю сеть, например после опытов с другим координатором или после перепрошивки выключателя. Держите BOOT на лампе 3 секунды: скетч забудет сеть. Затем нажмите RST на выключателе, чтобы его сеть снова открылась. То же можно сделать при прошивке лампы: пункт Erase All Flash Before Sketch Upload — «Enabled» стирает всю память перед загрузкой.
  • Проверьте Partition Scheme. С обычной разметкой скетч соберётся, но Zigbee не запустится. В мониторе порта может появиться строка с Failed to find zb_storage partition, а плата — перезагружаться по кругу.
  • Положите платы поближе друг к другу на время первого знакомства.

Как подключить ESP32-C6 к Home Assistant, Zigbee2MQTT или Алисе

Home Assistant. Координатором служит USB-стик Zigbee, а плата на C6 со скетчем лампы или датчика входит в его сеть так же, как в сеть выключателя выше. Устройства со стандартными функциями — лампа, реле, датчик температуры — встроенная интеграция ZHA обычно определяет сама. В пакете ESP32 есть готовые примеры таких устройств: Zigbee_Temperature_Sensor, Zigbee_Occupancy_Sensor и ещё два десятка. Они лежат в меню «Файл» → «Примеры» → «Zigbee» (в Trema IDE — раздел «Примеры», группа Zigbee) и видны, когда выбрана плата на C6. Розетка и реле, Zigbee_Power_Outlet, — ретрансляторы: Zigbee Mode и разметка у них такие же, как у выключателя.

Zigbee2MQTT может показать самодельное устройство как неподдерживаемое: для таких пишут внешний конвертер — небольшое описание устройства для Zigbee2MQTT.

Алиса. Яндекс советует проверять, есть ли устройство в списке поддерживаемых. Самодельной платы там нет, поэтому войдёт ли она в сеть Станции или Хаба по Zigbee, заранее сказать нельзя. Надёжнее путь через Wi-Fi и посредника: плата по MQTT отправляет данные в систему умного дома, а уже эту систему подключают к Алисе. Как отправлять данные по MQTT — в отдельной статье.

Thread и Matter: что есть в пакете

Радио C6 умеет и Thread — ещё одну сеть умного дома на той же частоте, что Zigbee. В пакете ESP32 для неё есть библиотека OpenThread с примерами; узел сети Thread занимает 77 % места под программу. Есть и библиотека Matter — общего языка умных домов разных фирм. На C6 она рассчитана и на Wi-Fi, и на Thread. Программа с ней в стандартную разметку не помещается: в описании примеров советуют «Huge APP (3MB No OTA/1MB SPIFFS)» и «Enabled» в Erase All Flash Before Sketch Upload. К умному дому такое устройство подключают через центр с поддержкой Matter.

Wi-Fi 6 на деле: что он даёт плате

Wi-Fi 6 у ESP32-C6 есть, но с оговорками. Работает он только в диапазоне 2,4 ГГц, только в полосе 20 МГц и только когда плата — клиент: точку доступа на Wi-Fi 6 она не поднимет. Со старым роутером плата подключается как обычная, по 802.11n. Скорости датчику хватает и так. Главное, что даёт Wi-Fi 6, — устойчивость в сети, где много устройств: роутер обслуживает их одновременно. Умеет он и экономить энергию — роутер назначает плате время просыпаться, — но в Arduino это само не включается: нужны отдельные вызовы ESP-IDF и роутер, который это поддерживает.

Включать Wi-Fi 6 в скетче не нужно: пакет разрешает его сам, и плата договаривается с роутером при подключении. О чём они договорились, покажет этот скетч:

// Договорилась ли плата с роутером о Wi-Fi 6. ESP32-C6 умеет 802.11ax,
// но только в сети 2,4 ГГц и только если роутер тоже его поддерживает.
// Со старым роутером плата работает как обычная, по 802.11n.
#include <WiFi.h>
#include "esp_wifi.h"

const char* WIFI_NAME = "имя_вашей_сети";   // только сеть 2,4 ГГц
const char* WIFI_PASS = "пароль";

void setup() {
  Serial.begin(115200);
  delay(2000);                   // время открыть монитор порта

  WiFi.begin(WIFI_NAME, WIFI_PASS);
  Serial.print("Подключаюсь");
  unsigned long start = millis();
  while (WiFi.status() != WL_CONNECTED && millis() - start < 20000) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Не подключилась: проверьте имя сети, пароль и диапазон 2,4 ГГц");
    return;
  }

  Serial.print("Адрес платы: ");
  Serial.println(WiFi.localIP());
  Serial.print("Канал: ");
  Serial.println(WiFi.channel());

  // Какой стандарт выбрали плата и роутер при подключении.
  wifi_phy_mode_t mode;
  if (esp_wifi_sta_get_negotiated_phymode(&mode) != ESP_OK) {
    Serial.println("Стандарт связи узнать не удалось");
    return;
  }
  Serial.print("Стандарт связи: ");
  switch (mode) {
    case WIFI_PHY_MODE_HE20: Serial.println("Wi-Fi 6 (802.11ax)"); break;
    case WIFI_PHY_MODE_HT20:
    case WIFI_PHY_MODE_HT40: Serial.println("Wi-Fi 4 (802.11n)"); break;
    case WIFI_PHY_MODE_11G:  Serial.println("802.11g"); break;
    case WIFI_PHY_MODE_11B:  Serial.println("802.11b"); break;
    default:                 Serial.println("другой"); break;
  }
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    Serial.print("Сигнал: ");
    Serial.print(WiFi.RSSI());     // чем ближе к нулю, тем лучше
    Serial.println(" dBm");
  }
  delay(5000);
}

Впишите имя сети и пароль, загрузите и откройте монитор порта. В строке «Стандарт связи» будет Wi-Fi 6 (802.11ax), если роутер его поддерживает и он включён для сети 2,4 ГГц, иначе — Wi-Fi 4 (802.11n), а у совсем старого роутера — 802.11g. Если плата не подключается, остальные причины — в статье про Wi-Fi.

Место под программу

У плат из этой статьи — и почти у всех остальных на C6 — по умолчанию стоит разметка «Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)»: под программу 1 310 720 байт. У «Zigbee 4MB with spiffs» и «Zigbee ZCZR 4MB with spiffs» столько же. Сколько занимают типичные программы:

ПрограммаРазмер и доля от 1 310 720 байт
Blink262 746 байт — 20 %
Поиск сетей Wi-Fi959 114 байт — 73 %
Поиск устройств BLE704 632 байта — 53 %
Zigbee-лампа611 988 байт — 46 %
Zigbee-выключатель714 234 байта — 54 %
Узел сети Thread1 015 290 байт — 77 %
Лампа Matter2 667 854 байта — 203 %, не помещается

Wi-Fi и BLE вместе с веб-сервером быстро упираются в предел. Тогда выбирают «Huge APP (3MB No OTA/1MB SPIFFS)» — 3 МБ под программу, но без прошивки по воздуху. Нужна прошивка по воздуху — «Minimal SPIFFS (1.9MB APP with OTA/128KB SPIFFS)»: по 1,9 МБ на два раздела (у пункта «XIAO_ESP32C6» такой разметки нет). Как устроена прошивка по воздуху — в статье про OTA.

Питание и сон

5V на гребёнке связан с питанием от USB, 3V3 — выход стабилизатора платы. Блок питания на 5 В подключают к 5V вместо кабеля, а не вместе с ним: у Super Mini и XIAO вывод 5V соединён с разъёмом USB напрямую, и блок питания начнёт толкать ток в порт компьютера. У DevKitC-1 и Zero там стоит диод, но Espressif всё равно велит выбирать один источник. Два кабеля USB сразу DevKitC-1 не вредят: оба разъёма развязаны диодами. Стабилизатор у неё — на 800 мА, а перемычка J5 стоит в питании модуля: сняв её и включив вместо неё амперметр, меряют ток одного модуля.

В глубоком сне сам чип берёт около 7 мкА, но плата целиком — заметно больше: ток тянут стабилизатор, светодиод питания и адресный светодиод. Для датчика на батарейке удобнее XIAO ESP32C6: у неё есть зарядка литиевого аккумулятора, а Seeed указывает для платы около 15 мкА во сне; при питании от аккумулятора на выводе 5V напряжения нет. У многих Super Mini тоже есть площадки для аккумулятора и микросхема зарядки, но у разных партий они разные, а у некоторых их нет вовсе — смотрите на свою плату. Подробнее о стабилизаторах и аккумуляторах — в статье про питание.

Чего у ESP32-C6 нет

Чего нетЧто скажет сборка или скетчЧем заменить
PSRAMESP.getPsramSize() вернёт 0512 КБ своей памяти; нужна PSRAM — берите S3
Классический Bluetooth'BluetoothSerial' does not name a typeBLE; для старых телефонных терминалов — обычная ESP32
USB-клавиатура и мышь'USBHIDKeyboard' does not name a typeESP32-S3
ЦАП, dacWrite()'dacWrite' was not declared in this scopeШИМ и RC-фильтр
Сенсорные входы, touchRead()'touchRead' was not declared in this scopeESP32-S3 или обычная ESP32
Wi-Fi 5 ГГцСетей 5 ГГц плата не видитСеть 2,4 ГГц на роутере
LP-ядро в ArduinoВ пакете для Arduino оно выключеноГлубокий сон основного ядра

Про Bluetooth на Arduino подробнее — в статье про Bluetooth, про PSRAM и USB-клавиатуру — в статье про ESP32-S3.

Чему не верить в карточках ESP32-C6

  • «N16R8, 8 МБ PSRAM» — PSRAM у C6 не бывает; N16 значит 16 МБ флеш-памяти
  • «Второй USB — OTG для камер и клавиатур» — у DevKitC-1 второй разъём ведёт к мосту USB-UART, а USB OTG у C6 нет вовсе
  • «Частота 40 МГц» — ядро работает до 160 МГц; 40 МГц — это кварц
  • «Bluetooth 5.3 с классическим режимом» — только Bluetooth LE; 5.3 — номер сертификации
  • «Wi-Fi 6 на 5 ГГц» — у C6 только 2,4 ГГц; Wi-Fi 6 в 5 ГГц — у другого чипа, ESP32-C5

ESP32-C6 или C3, H2, S3: что выбрать

ESP32-C3ESP32-C6ESP32-S3
ЯдроRISC-V, 1 ядро, 160 МГцRISC-V 160 МГц + LP-ядроXtensa, 2 ядра, 240 МГц
Оперативная память400 КБ512 КБ512 КБ + PSRAM на многих платах
Wi-Fi802.11 b/g/nWi-Fi 6 и b/g/n802.11 b/g/n
Zigbee и Threadнетестьнет
USBпоследовательный портпоследовательный портпорт и USB OTG
Аналоговые входы5 входов, точно до 2,5 В7 входов, до 3,3 Вдо 20 входов, точно до 2,9 В; 10 из них молчат при Wi-Fi
CAN121

C3 — дешевле и проще, примеров под неё больше: для датчика с Wi-Fi её хватает. C6 берут, когда нужен Zigbee или Thread, Wi-Fi 6 или аналоговые входы до 3,3 В. ESP32-H2 — Zigbee, Thread и Bluetooth LE, но без Wi-Fi: на нём делают датчики на батарейках. S3 — для памяти, экранов, камеры и USB-клавиатуры: ESP32-S3. Камеру дешевле всего поставить на ESP32-CAM, а если нужно много выводов — классическая ESP32 DevKit. Если вы только начинаете, проще стартовать с Arduino Uno и уроков, а к ESP32-C6 вернуться, когда понадобится умный дом.

Проекты на ESP32-C6: что собирают

  • Zigbee-датчик температуры для Home Assistant — по примеру Zigbee_Temperature_Sensor из пакета.
  • Беспроводной выключатель и реле света — как пара плат из этой статьи, только вместо светодиода реле. Реле на 220 В собирают только вместе со взрослым и при вынутой из розетки вилке — подробнее в статье «Реле и Arduino».
  • Датчик движения или двери — примеры Zigbee_Occupancy_Sensor и Zigbee_Contact_Switch.
  • Датчик на батарейке, который спит и просыпается по таймеру, — пример Zigbee_Temp_Hum_Sensor_Sleepy (в нём раз в минуту, интервал меняется одной строкой).
  • Метеостанция по Wi-Fi с показаниями на телефоне — через MQTT.
  • Устройство с шиной CAN — по ней общаются блоки в автомобилях и станках. У C6 два контроллера CAN, к шине их подключают через микросхему-трансивер.

Проекты попроще, на обычной Arduino, — в подборке проектов.

Чем программировать

ESP32-C6 в Trema IDE

Trema IDE — русская среда, совместимая с Arduino IDE: те же скетчи .ino, тот же пакет ESP32 и те же пункты для плат на C6. Пакет ставится из менеджера плат с российского зеркала, без ручных ссылок и VPN. Zigbee Mode, Partition Scheme и USB CDC On Boot открываются кнопкой «Параметры платы» на верхней панели, а ошибки сборки объясняются по-русски, с переходом к нужной строке.

  • Пакет ESP32 с платами на C6 ставится с российского зеркала
  • Zigbee Mode, Partition Scheme и USB CDC On Boot — кнопкой «Параметры платы»
  • Скетчи .ino открываются без переделки
  • Ошибки сборки — с объяснением по-русски и переходом к строке

Вопросы

Частые вопросы про ESP32-C6

Не нашли ответа? Спросите нас

Какую плату выбрать для ESP32-C6 в Arduino IDE?

Для DevKitC-1 — «ESP32C6 Dev Module», для XIAO — «XIAO_ESP32C6», для Waveshare Zero — «Waveshare ESP32-C6-Zero», для Super Mini — «MakerGO ESP32 C6 SuperMini». У Super Mini включите USB CDC On Boot — «Enabled», иначе монитор порта будет молчать. Нужен свежий пакет ESP32: в пакетах 1.x и 2.x C6 нет, а в ранних 3.x нет пунктов MakerGO и Waveshare.

Почему в списке плат нет ESP32-C6?

Стоит старый пакет ESP32: платы на C6 появились только в версии 3.0, в пакетах 1.x и 2.x их нет. Обновите пакет в менеджере плат.

Что значит «This chip is ESP32-C6, not ESP32-C3»?

В меню выбрана плата на C3, а подключена C6. Super Mini на этих чипах внешне почти одинаковые: у C6 по краям 20 контактов, а не 16, и есть цветной светодиод. Выберите пункт для C6.

Как включить Zigbee на ESP32-C6?

В параметрах платы выставить два пункта. Zigbee Mode — «Zigbee ED (end device)» для лампы или датчика либо «Zigbee ZCZR (coordinator/router)» для координатора. Partition Scheme — «Zigbee 4MB with spiffs» или «Zigbee ZCZR 4MB with spiffs» соответственно. Без первого пункта примеры не соберутся, без второго Zigbee не запустится, хотя сборка пройдёт без ошибок.

Нужен ли хаб для Zigbee на ESP32-C6?

В каждой сети Zigbee есть координатор. Им может быть вторая плата ESP32-C6 со скетчем выключателя, USB-стик в Home Assistant или хаб умного дома. Одна плата без координатора в сеть не войдёт.

Можно ли подключить ESP32-C6 к Алисе?

По Wi-Fi — можно, но через посредника: плата по MQTT отправляет данные в систему умного дома, а её подключают к Алисе. По Zigbee самодельной платы нет в списке устройств Яндекса, так что войдёт ли она в сеть Станции, заранее сказать нельзя.

На каком выводе светодиод у ESP32-C6?

У DevKitC-1 и Waveshare Zero — цветной адресный на выводе 8; обычного, которым можно мигать, нет. У Super Mini — цветной на 8 и синий на 15. У XIAO — жёлтый на 15, он горит при LOW. Цветной зажигают функцией rgbLedWrite(): digitalWrite(8, HIGH) его не зажжёт.

Почему монитор порта ESP32-C6 ничего не показывает?

Параметр USB CDC On Boot не совпадает с разъёмом. У платы с одним разъёмом нужен «Enabled», а у пунктов «ESP32C6 Dev Module» и «MakerGO ESP32 C6 SuperMini» по умолчанию стоит «Disabled». У DevKitC-1 при «Disabled» печать идёт в разъём «UART», при «Enabled» — в «USB». И добавьте в начало setup() паузу в пару секунд.

Какие выводы ESP32-C6 нельзя занимать?

12 и 13 — линии USB: займёте их, и пропадёт порт. Вывод 8 при включении нельзя прижимать к земле — для режима прошивки на нём нужен HIGH. На 9 стоит кнопка BOOT: прижатый к земле при включении, он отправляет плату в режим прошивки. 4, 5 и 15 чип тоже читает при запуске, но на обычных платах их можно занимать. У XIAO заняты 3 и 14 (антенна), у DevKitC-1 — 16 и 17 (мост USB-UART).

Где выводы I²C у ESP32-C6?

Зависит от пункта меню: у «ESP32C6 Dev Module» SDA 23 и SCL 22, у «MakerGO ESP32 C6 SuperMini» — 20 и 19, у «XIAO_ESP32C6» — 22 и 23, у «Waveshare ESP32-C6-Zero» — 14 и 15. Надёжнее указать выводы явно: Wire.begin(SDA, SCL) со своими номерами.

Есть ли у ESP32-C6 PSRAM?

Нет. У чипа 512 КБ оперативной памяти, внешнюю PSRAM он не поддерживает. Надписи «N16R8» и «8 МБ PSRAM» в карточках товаров — ошибка: у модулей C6 бывает только флеш-память N4, N8 или N16.

Работает ли ESP32-C6 с Wi-Fi 5 ГГц и что даёт Wi-Fi 6?

Только 2,4 ГГц. Если роутер поддерживает Wi-Fi 6 в сети 2,4 ГГц, плата подключится по нему, а со старым роутером — по 802.11n. Быстрее для датчика от этого ничего не станет: Wi-Fi 6 полезен в сетях с множеством устройств, а экономию энергии в Arduino нужно включать отдельно.

Есть ли у ESP32-C6 классический Bluetooth?

Нет, только Bluetooth LE. Скетч с BluetoothSerial не соберётся, а телефонные терминалы для модуля HC-05 с платой не работают. Нужен классический Bluetooth — берите обычную ESP32.

Чем ESP32-C6 отличается от ESP32-C3?

Обе с одним ядром RISC-V на 160 МГц и без PSRAM. У C6 есть Zigbee и Thread, Wi-Fi 6, 512 КБ памяти вместо 400, семь аналоговых входов до 3,3 В и больше выводов. Второе, маленькое ядро у чипа тоже есть, но из Arduino его пока не запустить. C3 дешевле, и примеров под неё больше.

Zigbee без хаба — на двух платах за вечер

Скачайте Trema IDE, поставьте пакет ESP32 с российского зеркала, выберите пункт своей платы, выставьте Zigbee Mode и разметку — и выключатель зажжёт лампу на соседней плате. Дома — бесплатно навсегда.