2025-12-22 16:10:23 +02:00
2025-12-13 11:59:11 +02:00
2025-12-22 16:10:23 +02:00
2025-12-13 11:59:11 +02:00
2025-12-13 11:59:11 +02:00
2025-12-13 11:59:11 +02:00

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 по 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.
  • Після кожного вимірювання INA226 ESP32-S3 відправляє поточну телеметрію (PWR <V>V <I>A) до активної 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>A), а через 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, і вони одразу набувають чинності без перезбирання прошивки:

  1. hb_period — інтервал (сек) між опитуваннями/heartbeat у головному циклі.
  2. dcdc_off — тривалість вимкнення каналу DCDC при автоматичному перезапуску (сек).
  3. hb_start — затримка перед стартом опитування після завантаження (сек); застосовується як у головному циклі, так і у watchdog-завданні.
  4. hb_monitor — значення 1 вмикає моніторинг heartbeat (за замовчуванням), 0 вимикає лише контроль/рестарти каналів, але тестові повідомлення heartbeat продовжують відправлятися.
  5. hb_miss — кількість послідовних запитів без відповіді перед автоматичним перезапуском каналу (за замовчуванням 3). Значення зберігає watchdog та використовується в CLI для відображення статистики пропусків/рестартів.

Прошивка без натискання BOOT

  1. Під’єднайтесь до CLI та виконайте команду bootloader. ESP32-S3 перезавантажиться у ROM bootloader, а на хості з’явиться USB-пристрій USB JTAG/serial.
  2. На 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
  3. Після завершення прошивки виконайте esptool.py --after hard_reset reset або просто перезавантажте живлення — пристрій вийде з bootloader і повернеться до нормальної роботи.
    Таким чином процедура оновлення доступна без натискання кнопки BOOT і може виконуватись безпосередньо з підключеної Raspberry Pi.

Збірка та конфігурація

  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%