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 <V> <I>) до активної 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>V <I>mA), а через 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
uart send <n> <msg> відправити текст у Raspberry Pi №n
uart read <n> [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 (макроси, сценарії, логування станів) та інтегрувати з продакшн-скриптами.
Description
система моніторингу пристрою WATCHER
Readme 4.5 MiB
Languages
C 92.7%
CMake 3.3%
Makefile 1.6%
Python 1.1%
C++ 0.5%
Other 0.7%