# 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` реалізовано базову логіку — канали вмикаються по черзі з інтервалом 4 с, що дозволяє перевірити всі DC/DC. - **Світлодіодний індикатор стану**: п’ять WS2812 (GPIO 8) показують роботу каналів — активний канал підсвічується яскраво-зеленим, увімкнені/вимкнені відображаються зеленим/синім, помилки — червоним. - **Моніторинг навантаження**: датчики INA226 вимірюють напругу, струм та потужність кожного каналу, інформація потрапляє в лог і CLI. - **UART взаємодія з Raspberry Pi**: один UART через мультиплексор (A0/A1/A2) ділиться між п’ятьма Pi, дозволяючи надсилати службові повідомлення або обмінюватися даними. - **Нативний USB-CLI**: ESP32-S3 підключається до Raspberry Pi 5 по 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 діодів). - Модуль `ws2812_status` синхронізує стан з DC/DC: увімкнені канали світяться зеленим, вимкнені — синім, активний у поточному циклі — яскраво-зеленим крапкою. - За критичної помилки (наприклад, DCDC не ініціалізувався) всі індикатори стають червоними. - Колірні алгоритми можна кастомізувати у `main/ws2812_status.c`. - 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. - Після кожного вимірювання INA226 ESP32-S3 відправляє поточну телеметрію (`PWR `) до активної Raspberry Pi. - Якщо 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 м’ютексом. - У `app_main` після вимірювань кожному Pi відправляється телеметрія (`CHx V mA`), а через CLI можна виконати `uart send ` або `uart read [len]`. - Усі параметри (порт, швидкість, GPIO) доступні в `menuconfig → UART мультиплексор`. ## USB CDC CLI Після підключення ESP32-S3 до Raspberry Pi 5 з’являється USB-пристрій (CDC ACM). У CLI доступні команди: | Команда | Опис | |------------------|------------------------------------| | `help` | довідка по командам | | `status` | поточний стан усіх каналів | | `enable ` | увімкнути канал `n` (0..4) | | `disable ` | вимкнути канал `n` | | `toggle ` | перемкнути канал `n` | | `sense` | виміряти загальну напругу/струм/потужність | | `uart send ` | надіслати повідомлення у Raspberry Pi `n` | | `uart read [len]` | прочитати відповідь від Raspberry Pi `n` | | `uart send ` | відправити текст у Raspberry Pi №n | | `uart read [len]` | прочитати дані з цільового Pi | CLI з’являється після того, як Raspberry Pi встановить DTR (наприклад, через `screen`, `picocom` або власний скрипт). ## Збірка та конфігурація 1. Встановіть ESP-IDF v5.5.1 (шлях `IDF_PATH` має вказувати на `/Users/tarassivas/esp/v5.5.1/esp-idf`). 2. Один раз виконайте `idf.py reconfigure`, щоб підвантажити залежності з `idf_component.yml`. 3. Переконайтеся, що в `sdkconfig` увімкнено: - `CONFIG_TINYUSB_CDC_ENABLED=y` - `CONFIG_TINYUSB_CDC_RX_BUFSIZE=128` (або інше значення за вашим сценарієм). 4. Зберіть проєкт: `idf.py build`, прошийте `idf.py flash`, переглядайте лог `idf.py monitor`. ## Подальший розвиток 1. Додати протокол обміну з Raspberry Pi (наприклад, командний набір через USB CLI або окреме IPC). 2. Включити зворотній зв’язок: вимір напруги/струму, датчики температури для кожного DC/DC. 3. Розширити CLI (макроси, сценарії, логування станів) та інтегрувати з продакшн-скриптами.