# Полная инструкция: Vision + Arduino + шаговик (трек 3) Код в `arduino_code/Test` **не меняем**. Связка идёт только через MQTT — те же топики, что уже использует SCADA (`backend_control/gui.py`). ## Архитектура ``` RealSense D415 ──► Orange PI (vision_classifier) │ ▼ MQTT ┌──── mosquitto :1883 ────┐ │ │ ▼ ▼ ESP32 (уже прошит) SCADA gui.py • motor/control/* (опционально) • servo/control/* │ ▼ TMC2209 + шаговик ленты серво-селекторы зон B/C/D ``` ## 1. Сеть и MQTT (важно) На Orange PI уже крутится Docker-контейнер **mosquitto** на порту **1883** (логин/пароль: `test` / `1234` — как в SCADA). | Кто | Куда подключается | |-----|-------------------| | `vision_classifier` | `127.0.0.1:1883` (уже в `config.yaml`) | | SCADA `gui.py` | `192.168.31.225` или `127.0.0.1` | | ESP32 (прошивка) | `MQTT_SERVER = "192.168.31.225"` (уже в `arduino_code/Test`) | Orange PI в сети: **`192.168.31.225`**. Vision ходит на локальный брокер `127.0.0.1`; ESP и SCADA — на `192.168.31.225:1883`. Краткая шпаргалка запуска/стопа: **[START.md](START.md)**. Проверка с Orange PI: ```bash # локальный брокер на OPI python3 -c " import paho.mqtt.client as m, time c=m.Client(m.CallbackAPIVersion.VERSION2); c.username_pw_set('test','1234') c.connect('127.0.0.1',1883); c.loop_start(); time.sleep(0.5); print('MQTT OK'); c.disconnect() " ``` MQTT Explorer: http://localhost:3000 (контейнер `mqtt-explorer`). ## 2. Что уже должно работать на Arduino Не трогая `arduino_code/Test`, убедитесь что ESP32 в сети и отвечает на команды (через SCADA или mosquitto): | Действие | Топик | Payload | |----------|-------|---------| | Вкл. драйвер | `motor/control/driver` | `on` | | Вкл. TMC | `motor/control/tmc/enable` | `on` | | Ток % | `motor/control/tmc/current_percent` | `50` | | Микрошаг | `motor/control/tmc/microsteps` | `16` | | Скорость RPM | `motor/control/rpm` | `-200` (у вас направление с минусом; диапазон примерно −1000…1000) | | Серво угол | `servo/control/{N}/angle` | `0`…`180` | | Серво вкл | `servo/control/{N}/enable` | `on` | Телеметрия: `motor/feedback/#`, `servo/+/feedback/#`. Ручной тест ленты (если `mosquitto_pub` есть): ```bash mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/driver -m on mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/tmc/enable -m on mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/rpm -m -200 # стоп: mosquitto_pub -h 127.0.0.1 -u test -P 1234 -t motor/control/rpm -m 0 ``` Или откройте `backend_control/gui.py` (`MQTT_BROKER = "192.168.31.225"`). ## 3. Камера RealSense D415 1. USB3 (скорость 5000M в `lsusb -t`). 2. Камера **сверху** над лентой, **0.5–1.5 м**. 3. В `config.yaml` задайте `belt_distance_mm` = реальная высота в мм. ```bash lsusb | grep -i RealSense v4l2-ctl --list-devices ``` ## 4. Запуск vision (Orange PI) ```bash cd ~/workdir/vision_classifier # один кадр без железа ./run.sh --once --no-mqtt --no-motor # превью без движения (JPEG обновляются на диске) ./run.sh --preview --dry-route --no-motor # смотреть: debug_frames/live_color.jpg и live_depth.jpg # полный контур: камера → класс → MQTT → мотор + серво PYTHONUNBUFFERED=1 ./run.sh --preview # стоп: Ctrl+C (rpm сбросится в 0) ``` Превью **не открывает окна** (у вас OpenCV headless) — пишет файлы: - `debug_frames/live_color.jpg` - `debug_frames/live_depth.jpg` Откройте их в Cursor/VS Code или: ```bash eog debug_frames/live_color.jpg & # или периодически обновлять в браузере/просмотрщике ``` ## 5. Настройка зон под вашу механику В `config.yaml` → `routing.zones` и `motor`: ```yaml motor: enabled: true rpm: -200 # у вас направление ленты — отрицательный RPM mqtt: broker: "127.0.0.1" # mosquitto на Orange PI; ESP и SCADA → 192.168.31.225 routing: zones: B: { servo: 0, idle_angle: 0, divert_angle: 0, hold_ms: 500 } C: { servo: 1, idle_angle: 0, divert_angle: 90, hold_ms: 800 } D: { servo: 2, idle_angle: 0, divert_angle: 90, hold_ms: 800 } ``` Подставьте **номера каналов PCA9685** и углы, которые уже проверены в SCADA. Логика ТЗ: | Класс | Зона | Действие | |-------|------|----------| | Подходит | B | лента едет, серво idle | | Не по габаритам | C | серво C на `divert_angle`, потом idle | | Круг (доупаковка) | D | серво D на `divert_angle`, потом idle | ## 6. SCADA параллельно Можно держать GUI открытым для телеметрии: ```bash cd ~/workdir/backend_control # в gui.py: MQTT_BROKER = "192.168.31.225" (или 127.0.0.1 с OPI) source testing/bin/activate # или свой venv python gui.py ``` Vision и SCADA могут работать вместе на одном брокере. ## 7. Docker (опционально) ```bash cd ~/workdir/vision_classifier sudo docker compose up -d --build sudo docker compose logs -f ``` ## 8. Типичные проблемы | Симптом | Что сделать | |---------|-------------| | `cv2.imshow` / GTK error | уже исправлено: `--preview` пишет JPEG | | `mqtt timed out` | брокер на OPI → `broker: "127.0.0.1"`; ESP → `192.168.31.225` | | ESP не реагирует | одна Wi‑Fi сеть, брокер `192.168.31.225:1883`, логин `test`/`1234` | | depth valid < 30% | USB3, высота 0.5–1.5 м, не чёрная лента в упор | | серво не те | поправьте `routing.zones.*.servo` под SCADA | | лента не едет | `motor.enabled: true`, проверьте SCADA rpm вручную | ## 9. Чеклист «всё связано» 1. [ ] `mosquitto` Up (`docker ps`) 2. [ ] ESP32 в Wi‑Fi, в MQTT Explorer видны `motor/feedback/*` 3. [ ] Из SCADA крутится шаговик и двигаются серво 4. [ ] `config.yaml`: `mqtt.broker` = тот же брокер 5. [ ] `belt_distance_mm` и углы серво подогнаны 6. [ ] `./run.sh` печатает зону B/C/D и в Explorer появляются `vision/feedback/*` 7. [ ] При объекте срабатывает нужный серво, лента крутится