123 lines
13 KiB
Markdown
123 lines
13 KiB
Markdown
# 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 (макроси, сценарії, логування станів) та інтегрувати з продакшн-скриптами.
|