Files
watch-watch/README.md
2025-12-20 08:24:51 +00:00

123 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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, і вони одразу набувають чинності без перезбирання прошивки:
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. Розширити CLI (макроси, сценарії, логування станів) та інтегрувати з продакшн-скриптами.