# πŸ“‘ ДокумСнтация ΠΏΠΎ MQTT интСрфСйсу (ESP32 + TMC2209 + Servo + VL53L0X) ## πŸ“Œ ΠžΠ±Ρ‰Π°Ρ информация - **АрхитСктура**: ESP32 (FreeRTOS Π·Π°Π΄Π°Ρ‡Π° `mqttTask`). - **ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ опроса Ρ‚Π΅Π»Π΅ΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ**: 500 мс. - **ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°**: 1. ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… происходит **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ значСния** (строгоС ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅). 2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСский Π±ΡƒΡ„Π΅Ρ€ (`intToString`/`uintToString`) вмСсто динамичСского класса `String` для экономии памяти ΠΈ прСдотвращСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΡƒΡ‡ΠΈ. - **ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΡ‹**: - `.../control/...` β€” Ρ‚ΠΎΠΏΠΈΠΊΠΈ для **ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄** устройству (подписка). - `.../feedback/...` β€” Ρ‚ΠΎΠΏΠΈΠΊΠΈ для **получСния статуса/Ρ‚Π΅Π»Π΅ΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ** ΠΎΡ‚ устройства (публикация). --- ## βš™οΈ 1. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»Π΅ΠΌ (Motor Control) | Π’ΠΎΠΏΠΈΠΊ | Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Payload | | :--- | :---: | :--- | :--- | | `motor/control/rpm` | Integer | ЦСлСвая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² ΠΎΠ±/ΠΌΠΈΠ½ (RPM). ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ рСвСрс. | `-150`, `0`, `300` | | `motor/control/driver` | String | АппаратноС Π²ΠΊΠ»/Π²Ρ‹ΠΊΠ» Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° (ΠΏΠΈΠ½ `EN_PIN`). `on` = LOW (Π²ΠΊΠ»), ΠΈΠ½Π°Ρ‡Π΅ = HIGH (Π²Ρ‹ΠΊΠ»). | `on`, `off` | | `motor/control/totalsteps/reset`| Any | Бброс счСтчика шагов Π² ноль. Устройство сразу ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ `"0"` Π² feedback. | `1`, `reset` | ### ВСлСмСтрия двигатСля (Motor Feedback) *(ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ)* - `motor/feedback/rpm` (Integer): ВСкущая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. - `motor/feedback/totalsteps` (Integer): ΠžΠ±Ρ‰Π΅Π΅ количСство шагов. - `motor/feedback/is_run` (String: `true`/`false`): Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ двиТСтся. - `motor/feedback/driver/status` (String: `on`/`off`): ΠžΠ±Ρ‰ΠΈΠΉ статус Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. - `motor/feedback/tmc/status` (String: `on`/`off`): Бтатус ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ TMC. #### Π”Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ тСлСмСтрия TMC2209 (`motor/feedback/tmc/...`) - `current_percent` (Integer): Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ % Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Ρ‚ΠΎΠΊΠ°. - `microsteps` (Integer): Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΌΠΈΠΊΡ€ΠΎΡˆΠ°Π³Π°. - `sg_result` (Integer): Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ StallGuard (Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°). - `interstep_duration` (Integer): Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ шагами. - `status/over_temp` (String: `true`/`false`): ΠŸΠ΅Ρ€Π΅Π³Ρ€Π΅Π². - `status/short_to_ground` (String: `true`/`false`): ΠšΠ— Π½Π° зСмлю. - `status/open_load` (String: `true`/`false`): ΠžΠ±Ρ€Ρ‹Π² Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. - `status/stealth_chop_active` (String: `true`/`false`): АктивСн Π»ΠΈ StealthChop. - `status/standstill` (String: `true`/`false`): Π”Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ Π² ΠΏΠΎΠΊΠΎΠ΅. - `status/current_scaling` (Integer): Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ коэффициСнт Ρ‚ΠΎΠΊΠ°. --- ## 🦾 2. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сСрвоприводами (Servo Control) ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² (`{channel}` ΠΎΡ‚ `0` Π΄ΠΎ `MAX_SERVOS - 1`). ### ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ | Π’ΠΎΠΏΠΈΠΊ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ΠΊΠ°Π½Π°Π»Π° 0) | Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Payload | | :--- | :---: | :--- | :--- | | `servo/control/0/angle` | Integer (0-180) | Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°. | `90` | | `servo/control/0/enable` | String | Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ (`on`, `1`, `true`) ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ. | `on` | ### ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ связь - `servo/0/feedback/status` (String: `on`/`off`): Бтатус питания сСрвопривода. - `servo/0/feedback/angle` (Integer): Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ установлСнный ΡƒΠ³ΠΎΠ». --- ## πŸ“ 3. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ VL53L0X (Sensor Control) **(ΠΠžΠ’ΠžΠ•)** ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄ΠΎ 8 ΠΊΠ°Π½Π°Π»ΠΎΠ² (`VL53L0X_MAX_CHANNELS = 8`). Π’ΠΎΠΏΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `{channel}` (0–7). | Π’ΠΎΠΏΠΈΠΊ | Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Payload | | :--- | :---: | :--- | :--- | | `sensor/control/mode` | Integer | Установка глобального Ρ€Π΅ΠΆΠΈΠΌΠ° измСрСния (0 Π΄ΠΎ `MODE_COUNT - 1`). | `0`, `1` | | `sensor/control/mode_name` | String | *Π—Π°Π³Π»ΡƒΡˆΠΊΠ°/Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.* ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ имя Ρ€Π΅ΠΆΠΈΠΌΠ° для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. | `LongRange` | | `sensor/control/calibrate/start/{ch}`| Integer | Начало ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΠΈ: ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±Π»ΠΈΠ·ΠΊΠΎΠ΅ расстояниС Π² ΠΌΠΌ. | `50` | | `sensor/control/calibrate/finish/{ch}`| Integer | Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΠΈ: ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ дальнСС расстояниС Π² ΠΌΠΌ. | `500` | | `sensor/control/clear_cal/{ch}` | Any | Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΡƒ для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. | `1` | | `sensor/control/enable/{ch}` | String | Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ (`on`, `1`, `true`) ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π». | `on` | | `sensor/control/publish_all` | Any | **ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сброс кэша.** ЗаставляСт устройство Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния всСх Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ², Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ измСнились. | `1` | --- ## πŸ“Š 4. ВСлСмСтрия Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² VL53L0X (Sensor Feedback) **(ΠΠžΠ’ΠžΠ•)** ### Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ информация ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ смСнС Ρ€Π΅ΠΆΠΈΠΌΠ° измСрСния: - `sensor/feedback/mode` (String): Π§Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅ имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "Default", "LongRange"). - `sensor/feedback/mode_id` (Integer): Числовой ID Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°. - `sensor/feedback/max_range` (Integer): Максимальная Π΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° (Π² ΠΌΠΌ). ### ΠŸΠΎΡΡ‚Π°Ρ‚ΡƒΡΠ½Π°Ρ информация ΠΏΠΎ ΠΊΠ°Π½Π°Π»Π°ΠΌ (`{channel}` = 0..7) *(ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния ΠΈΠ»ΠΈ значСния)* | Π’ΠΎΠΏΠΈΠΊ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ΠΊΠ°Π½Π°Π»Π° 0) | Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… | ОписаниС | | :--- | :---: | :--- | | `sensor/feedback/0/status` | String (`on`/`off`) | Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ Π»ΠΈ логичСски Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π». | | `sensor/feedback/0/calibrated` | String (`true`/`false`)| Π‘Ρ‹Π»Π° Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π° ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΠ° для этого ΠΊΠ°Π½Π°Π»Π°. | | `sensor/feedback/0/distance` | Integer ΠΈΠ»ΠΈ String | **ΠšΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅** расстояниС Π² ΠΌΠΌ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `65535` (ошибка/Π²Π½Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°), публикуСтся строка `"out_of_range"`. | | `sensor/feedback/0/raw` | Integer | **Π‘Ρ‹Ρ€ΠΎΠ΅** (Π½Π΅ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ расстояния Π² ΠΌΠΌ. | *ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ΠΎΠΏΠΈΠΊΠΈ `distance` ΠΈ `raw` ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΊΠ°Π½Π°Π» Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ (`vl53l0xIsChannelActive`).*