refactor code with orangepi-server
This commit is contained in:
1 parent
37b551c0ed
commit
649edec6ca
14 files changed
+680
No files matched your search
@@ -0,0 +1,221 @@
|
||||
# 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)
|
||||
```bash
|
||||
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:
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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):**
|
||||
```bash
|
||||
pip3 install websockets aiohttp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Sử dụng
|
||||
|
||||
### 3.1 Bật ESP32 ở chế độ Full Stage
|
||||
Trong `config.h` trên Arduino IDE:
|
||||
```cpp
|
||||
#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):
|
||||
```bash
|
||||
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:
|
||||
```bash
|
||||
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:
|
||||
```bash
|
||||
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`:
|
||||
```python
|
||||
# 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`:
|
||||
```python
|
||||
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
|
||||
```bash
|
||||
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`:
|
||||
```ini
|
||||
[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 đó:
|
||||
```bash
|
||||
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"
|
||||
```bash
|
||||
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.
|
||||
Reference in new issue
Block a user