188 lines
7.2 KiB
Markdown
188 lines
7.2 KiB
Markdown
# Полная инструкция: 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. [ ] При объекте срабатывает нужный серво, лента крутится
|