watch-watch
watch-watch — вбудована система на ESP32-S3 для нагляду за п’ятьма силовими модулями на базі Raspberry Pi 5. ESP32-S3 керує DC/DC перетворювачами через сигнали EN, а також надає USB CLI інтерфейс для налаштування та діагностики без окремого UART.
Основні можливості
- Керування каналами живлення: 5 незалежних ліній
EN(GPIO 2, 4, 5, 18, 19), які можна увімкнути, вимкнути або перемкнути з коду чи CLI. - Послідовний автотест: у
app_mainреалізовано базову логіку — канали вмикаються по черзі з інтервалом 3 с, що дозволяє перевірити всі DC/DC без стрибків споживання. - Світлодіодний індикатор стану: п’ять WS2812 (GPIO 8) світяться зеленим під час стартової затримки, після чого кожен канал сигналізує лише про дві події — відсутність VPN (два червоних блимання) та падіння APP (три жовтих блимання).
- Моніторинг навантаження: датчики INA226 вимірюють напругу, струм та потужність пристрою таку як напруга, струм та потужність, інформація потрапляє в CLI.
- UART взаємодія з Raspberry Pi: один UART через мультиплексор (A0/A1/A2) ділиться між п’ятьма Pi, дозволяючи надсилати службові повідомлення або обмінюватися даними.
- Нативний USB-CLI: ESP32-S3 підключається до Raspberry Pi 5 першої ноди системи Watcher по USB і стає CDC ACM пристроєм; командний інтерфейс дозволяє керувати каналами та дивитись стан у реальному часі.
- Модульна архітектура: окремі компоненти
dcdc_controllerіusb_cdc_cliспрощують розширення (телеметрія, автоматизація, протоколи зв’язку).
Структура проєкту
├── CMakeLists.txt
├── Kconfig.projbuild # меню і параметри WATCH_WS2812_*
├── README.md
├── sdkconfig # збережені налаштування menuconfig
├── dependencies.lock
├── main
│ ├── CMakeLists.txt
│ ├── idf_component.yml # залежності: esp_tinyusb, led_strip
│ ├── main.c # головний цикл, тестова логіка DC/DC
│ ├── dcdc_controller.c/.h # керування GPIO EN
│ ├── usb_cdc_cli.c/.h # CLI по USB CDC
│ ├── ws2812_status.c/.h # індикація стану на WS2812
│ ├── ina226_monitor.c/.h # вимірювання напруги/струму/потужності
│ └── uart_mux.c/.h # UART взаємодія з 5 Raspberry Pi
├── managed_components
│ ├── espressif__esp_tinyusb # бібліотека TinyUSB від Espressif
│ └── espressif__led_strip # драйвер керування WS2812 (RMT/SPI)
└── .vscode / .devcontainer / .clangd # допоміжні файли середовища розробки
GPIO-призначення каналів
| Канал | GPIO | Призначення |
|---|---|---|
| 0 | 2 | Модуль живлення #1 |
| 1 | 4 | Модуль живлення #2 |
| 2 | 5 | Модуль живлення #3 |
| 3 | 18 | Модуль живлення #4 |
| 4 | 19 | Модуль живлення #5 |
Піни можна змінити в
main/dcdc_controller.c, масивs_dcdc_gpio_map.
Світлодіоди стану
- IC WS2812 підключений до GPIO 8 (один ланцюг із 5 діодів).
- Після старту всі п’ять діодів світяться сталим зеленим протягом затримки
heartbeat_start_delay_sec, щоб показати фазу ініціалізації. - Після завершення затримки вся стрічка гасне, а кожен канал індикує лише два типи подій:
- VPN=0 — два червоних блимання по 200 мс із паузою між циклами;
- APP=0 — три жовтих блимання по 200 мс. Якщо активні обидва попередження, вони програються послідовно (спочатку VPN, потім APP) із паузою 2 с між послідовностями.
- При критичній помилці (наприклад, DCDC не ініціалізувався) всі індикатори залишаються червоними.
- GPIO, кількість діодів та тактову частоту RMT можна змінити через
idf.py menuconfig(розділ Налаштування watch-watch).
Моніторинг живлення (INA226)
- Один INA226 підключений до загальної шини живлення (I2C порт 0, GPIO 6/7; адреса налаштовується параметром
WATCH_INA226_ADDR). - Модуль
ina226_monitorвимірює сумарну напругу, струм і розраховує потужність — ці значення фіксуються в логах і використовуються для телеметрії. - Команда CLI
senseпоказує поточні показники для всієї системи (канал не вказується, бо датчик один). - Конфігурація I2C, адреси, шунта та кроку струму знаходиться в
menuconfig → INA226 моніторинг.
UART взаємодія та heartbeat
- Загальний UART (типово UART1, GPIO17/16) підключений до аналогового мультиплексора, лінії адреси
A0/A1/A2(GPIO 9/10/11) вибирають одну з Raspberry Pi. - Модуль
uart_muxсеріалізує доступ до UART, надає API дляuart_mux_write/readі періодично опитує UART на наявність heartbeat. - Якщо heartbeat від Pi не надходить протягом
CONFIG_WATCH_UART_HEARTBEAT_TIMEOUT_SEC(за замовчуванням 60 с), відповідний канал живлення вимикається й знову вмикається для примусового перезапуску. - Команди CLI
uart send/uart readдозволяють вручну надсилати/читати повідомлення, а вapp_mainможна реалізувати власні протоколи синхронізації.
UART взаємодія з Raspberry Pi
- Шина UART (типово UART1, TX=GPIO17, RX=GPIO16) підключена до аналогового мультиплексора з адресними лініями A0/A1/A2 (GPIO 9/10/11), що дозволяє вибирати одну з 5 Raspberry Pi.
- Модуль
uart_muxгарантує серійний доступ: перед операцією він виставляє двійковий код каналу на A0-A2 та блокує UART м’ютексом. - Через CLI можна виконати
uart send <n> <msg>абоuart read <n> [len]. - Усі параметри (порт, швидкість, GPIO) доступні в
menuconfig → UART мультиплексор.
USB CDC CLI
Після підключення ESP32-S3 до Raspberry Pi 5 з’являється USB-пристрій (CDC ACM). У CLI доступні команди:
| Команда | Опис |
|---|---|
help |
довідка по командам |
status |
поточний стан усіх каналів |
enable <n> |
увімкнути канал n (0..4) |
disable <n> |
вимкнути канал n |
toggle <n> |
перемкнути канал n |
sense |
виміряти загальну напругу/струм/потужність |
uart send <n> <msg> |
надіслати повідомлення у Raspberry Pi n |
uart read <n> [len] |
прочитати відповідь від Raspberry Pi n |
config show |
переглянути таймінги heartbeat/DCDC |
config set … |
змінити та зберегти таймінги / моніторинг |
reset |
м’яке перезавантаження ESP32-S3 |
bootloader |
перезавантажити ESP32-S3 у ROM bootloader для esptool.py |
CLI з’являється після того, як Raspberry Pi встановить DTR (наприклад, через screen, picocom або власний скрипт).
Керування таймінгами heartbeat
Команда config дозволяє зберігати параметри роботи watchdog та циклу heartbeat у NVS, і вони одразу набувають чинності без перезбирання прошивки:
hb_period— інтервал (сек) між опитуваннями/heartbeat у головному циклі.dcdc_off— тривалість вимкнення каналу DCDC при автоматичному перезапуску (сек).hb_start— затримка перед стартом опитування після завантаження (сек); застосовується як у головному циклі, так і у watchdog-завданні.hb_monitor— значення1вмикає моніторинг heartbeat (за замовчуванням),0вимикає лише контроль/рестарти каналів, але тестові повідомлення heartbeat продовжують відправлятися.hb_miss— кількість послідовних запитів без відповіді перед автоматичним перезапуском каналу (за замовчуванням 3). Значення зберігає watchdog та використовується в CLI для відображення статистики пропусків/рестартів.
Прошивка без натискання BOOT
- Під’єднайтесь до CLI та виконайте команду
bootloader. ESP32-S3 перезавантажиться у ROM bootloader, а на хості з’явиться USB-пристрійUSB JTAG/serial. - На Raspberry Pi запустіть
esptool.pyабоidf.py flashі вкажіть новий порт (/dev/ttyACM*або/dev/cu.usbmodem*). Наприклад:
esptool.py --chip esp32s3 --port /dev/ttyACM0 --before usb_reset --after no_reset write_flash 0x0 build/watch-watch.bin - Після завершення прошивки виконайте
esptool.py --after hard_reset resetабо просто перезавантажте живлення — пристрій вийде з bootloader і повернеться до нормальної роботи.
Таким чином процедура оновлення доступна без натискання кнопки BOOT і може виконуватись безпосередньо з підключеної Raspberry Pi.
Збірка та конфігурація
- Встановіть ESP-IDF v5.5.1 (шлях
IDF_PATHмає вказувати на/Users/tarassivas/esp/v5.5.1/esp-idf). - Один раз виконайте
idf.py reconfigure, щоб підвантажити залежності зidf_component.yml. - Переконайтеся, що в
sdkconfigувімкнено:CONFIG_TINYUSB_CDC_ENABLED=yCONFIG_TINYUSB_CDC_RX_BUFSIZE=128(або інше значення за вашим сценарієм).
- Зберіть проєкт:
idf.py build, прошийтеidf.py flash, переглядайте логidf.py monitor.
Подальший розвиток
- Додати протокол обміну з Raspberry Pi (наприклад, командний набір через USB CLI або окреме IPC).
- Розширити CLI (макроси, сценарії, логування станів) та інтегрувати з продакшн-скриптами.
Description
Languages
C
92.7%
CMake
3.3%
Makefile
1.6%
Python
1.1%
C++
0.5%
Other
0.7%