Files
esp32s3-ld2453/orangepi-server/ORANGE_PI_GUIDE.md
T

6.6 KiB

ESP32-S3 LD2453 Radar — Orange Pi Visualizer

Hướng dẫn cài đặt và sử dụng script Python trên Orange Pi để visualize dữ liệu radar realtime.


1. Chuẩn bị

1.1 Yêu cầu hệ thống

  • Orange Pi (mọi model đều được, cần Python 3.8+)
  • Kết nối mạng cùng LAN với ESP32 (WiFi hoặc LAN cổng)
  • Biết IP của ESP32 (xem Serial Monitor khi boot, hoặc vào router check)

1.2 Cài đặt thư viện hệ thống (nếu dùng GUI tkinter)

sudo apt update
sudo apt install -y python3-tk python3-pip

1.3 Copy file lên Orange Pi

Copy 2 file này vào Orange Pi:

  • orange_pi_visualizer.py
  • orange_pi_requirements.txt

Ví dụ dùng SCP:

scp orange_pi_visualizer.py orange_pi_requirements.txt orangepi@<ORANGE_PI_IP>:/home/orangepi/

Hoặc dùng USB, hoặc clone repo trực tiếp.


2. Cài đặt Python dependencies

cd /home/orangepi
python3 -m venv venv
source venv/bin/activate

pip install -r orange_pi_requirements.txt

Hoặc cài global (không khuyến nghị nhưng nhanh):

pip3 install websockets aiohttp

3. Sử dụng

3.1 Bật ESP32 ở chế độ Full Stage

Trong config.h trên Arduino IDE:

#define DIAGNOSTIC_MODE 0   // Full mode: WiFi + WebSocket + REST API

Flash code, mở Serial Monitor lấy IP ESP32. Ví dụ: 192.168.1.100

3.2 Chạy Visualizer trên Orange Pi

Chế độ GUI (Tkinter) — Mặc định

Cần môi trường desktop (có màn hình gắn vào Orange Pi):

source venv/bin/activate
python3 orange_pi_visualizer.py 192.168.1.100

Chế độ Headless (Console)

Dùng khi Orange Pi không có màn hình, chạy SSH remote:

python3 orange_pi_visualizer.py 192.168.1.100 --headless

4. Mô tả giao diện

4.1 GUI Tkinter

  • Canvas 900x700: Biểu diễn không gian phòng theo tỷ lệ thực (mm)
    • Trục X (ngang): -5m ← 0 (radar) → +5m
    • Trục Y (dọc): 0 (radar ở dưới cùng) ↑ đến 7m (phía trước)
  • Grid: Mỗi ô = 1 mét
  • Radar: Hình tròn màu đỏ ở cạnh dưới giữa
  • 3 Zones:
    • Zone 1 (Xanh lá): Bên trái radar (-4m → -1mm, 1mm → 4m)
    • Zone 2 (Cam): Bên phải radar (1mm → 4m, 1mm → 4m)
    • Zone 3 (Đỏ): Khu vực xa hơn (từ 4m → 6m, toàn bộ bề ngang)
    • Khi có người: Màu đậm, chữ CO
    • Khi trống: Màu nhạt, gạch nét, chữ TRONG
  • Targets (3 điểm):
    • Màu: Vàng (Slot1), Tím (Slot2), Xanh (Slot3)
    • Mũi tên: Tốc độ (độ dài tỉ lệ với tốc độ cm/s)
    • Label: T1 X,Y mm speed cm/s

4.2 Console (headless)

Cập nhật 2 lần/giây, hiển thị:

============================================================
  ESP32 LD2453 — Node: RADAR_A   Seq: 12345
============================================================
  Frames received: 1200
  Target count    : 2/3
  Last update     : 0.1s ago
------------------------------------------------------------
  Slot 1: DETECTED
    X=  850mm  Y= 2340mm  Speed=+12cm/s  Dist= 2488mm  Angle=+19.9°
  Slot 2: FREE
  Slot 3: RECENT (2s)
------------------------------------------------------------
  Zone 1:   TRONG  [-4000,    1] -> [   -1, 4000]
  Zone 2: X CO     [    1,    1] -> [ 4000, 4000]
  Zone 3:   TRONG  [-4001, 4001] -> [ 4001, 6000]
============================================================

5. Tùy chỉnh

5.1 Thay đổi zone layout

Cách 1: Từ giao diện web ESP32

  • Mở trình duyệt vào http://<ESP32_IP>/zones xem hiện tại
  • Cập nhật bằng POST request:
curl -X POST http://192.168.1.100/updateZones -H "Content-Type: application/json" -d '[
  {"id":1,"x1":-3000,"y1":500,"x2":-1,"y2":3000},
  {"id":2,"x1":1,"y1":500,"x2":3000,"y2":3000},
  {"id":3,"x1":-3000,"y1":3001,"x2":3000,"y2":5000}
]'

Script visualizer sẽ tự động lấy zones mới sau khi reconnect WebSocket (hoặc restart script).

Cách 2: Edit hằng số đầu file orange_pi_visualizer.py:

# Default zones (giong ESP32)
state.zones[0] = Zone(1, x1=-4000, y1=1, x2=-1, y2=4000)
state.zones[1] = Zone(2, x1=1, y1=1, x2=4000, y2=4000)
state.zones[2] = Zone(3, x1=-4001, y1=4001, x2=4001, y2=6000)

5.2 Thay đổi kích thước/range hiển thị

Trong class TkinterVisualizer:

CANVAS_W = 900
CANVAS_H = 700
ROOM_X_MIN = -5000
ROOM_X_MAX = 5000
ROOM_Y_MIN = 0
ROOM_Y_MAX = 7000

5.3 Chạy nền (background) trên Orange Pi

Dùng tmux hoặc systemd:

tmux

tmux new -s radar
python3 orange_pi_visualizer.py 192.168.1.100 --headless
# Ctrl+B D de detach
# tmux attach -t radar de quay lai

systemd service (tự chạy khi boot)

Tạo file /etc/systemd/system/radar-vis.service:

[Unit]
Description=LD2453 Radar Visualizer
After=network-online.target

[Service]
Type=simple
User=orangepi
WorkingDirectory=/home/orangepi
ExecStart=/home/orangepi/venv/bin/python3 /home/orangepi/orange_pi_visualizer.py 192.168.1.100 --headless
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Sau đó:

sudo systemctl daemon-reload
sudo systemctl enable radar-vis
sudo systemctl start radar-vis
journalctl -u radar-vis -f   # xem log realtime

6. Troubleshooting

"No such file directory python3-tk"

sudo apt update && sudo apt install -y python3-tk

Không kết nối được WebSocket

  1. Ping ESP32: ping 192.168.1.100
  2. Test REST API: curl http://192.168.1.100/status → phải trả về {"status":"ok",...}
  3. Tường lửa Orange Pi? sudo ufw status
  4. ESP32 ở chế độ DIAGNOSTIC_MODE 1? → phải 0 mới có WiFi/WebSocket.

Tốc độ cập nhật chậm

  • Mặc định LD2453 gửi ~2 fps. Đây là giới hạn của radar.
  • Để giảm lag GUI: tăng giảm _last_print trong ConsoleVisualizer (dòng now - self._last_print < 0.5)

Target số không chính xác/khớp

  • Parser trên ESP32 đang trong giai đoạn đầu. Nếu thấy dữ liệu kỳ lạ (tọa độ không hợp lý, target nhảy lung tung):
    1. Bật DEBUG_RADAR_RAW 1 trên ESP32, lấy RAW dump
    2. Gửi cho việc điều chỉnh lại byte layout.

7. Đối chiếu với dự án gốc ESP32-LD2450

File này dựa trên pattern của https://github.com/thanhtantran/ESP32-LD2450:

  • Cùng WebSocket path /ws
  • Cùng format JSON (node_id, sequence, targets[] với x, y, speed)
  • Cùng REST API /zones + /updateZones + /status
  • Thêm vào đây: target_count tổng hợp, fields distance & angle cho tiện tính toán.