
# 🎯 激光射击系统（双版本）

适用于 **MaixPy** 平台，支持远程控制、电池监测、Wi-Fi 连接及 OTA 升级。

提供两个独立实现版本，共享相同网络协议与 OTA 机制，便于统一部署管理：

- `main.py`：**视觉测距版**
- `laser.py`：**激光测距版**

---

## 📁 项目结构

```
laser_shooting_system/
├── README.md
├── main.py       # 视觉测距版主程序
└── laser.py      # 激光测距版主程序
```

---

## ⚙️ 硬件依赖

| 版本       | 必需硬件                                   |
|------------|----------------------------------------|
| `main.py`  | Maix 系列开发板 + 摄像头 + 其他硬件                |
| `laser.py` | Maix 系列开发板 + 激光测距模块（I²C） + 摄像头 + 其他硬件） |

> 💡 **注意：引脚复用风险**  
> Maix 开发板部分 GPIO 兼容多协议（如 Wi-Fi / I²C 复用 A15/A27）。  
> **Wi-Fi 初始化前禁止提前配置 I²C 引脚！**

### ❗ 关键提示

| 问题场景 | 后果 |
|---------|------|
| 提前初始化 I²C | Wi-Fi 初始化失败、OTA 中断、系统重启 |

✅ **正确做法：**

- **`main.py`（视觉版）&`laser.py`（激光版）**  
  使用wifi时启用下面代码，注释与WiFi复用的：
  ```python
  # 以下代码（如有，请启用）：
  # pinmap.set_pin_function("A15", "I2C5_SCL")
  # pinmap.set_pin_function("A27", "I2C5_SDA")
  ```




## 📡 网络通信协议（TCP / JSON）

设备上电后自动连预设服务器，支持以下指令：

```json
{"data": {"cmd": N, "ssid": "...", "password": "..."}}
```

| `cmd` | 参数                | 功能说明                     |
|-------|---------------------|------------------------------|
| 2     | —                   | 开启激光校准模式             |
| 3     | —                   | 关闭激光                     |
| 4     | —                   | 查询电池电量 & 电压          |
| 5     | `ssid`, `password`  | 配置 Wi-Fi + 触发 OTA 升级   |
| 6     | —                   | 返回当前 IP 地址             |
| 7     | —                   | 已联网时，直接执行 OTA 下载  |

### 示例交互

▶️ 下发指令（服务器 → 设备）：
```json
{"data": {"cmd": 6}}
```

◀️ 设备响应（设备 → 服务器）：
```json
{"result": "current_ip", "ip": "192.168.1.105"}
```

---

## 🛠️ 部署步骤

1. **选择版本**
   - 固定场景 / 低成本 → `main.py`
   - 高精度需求 → `laser.py`

2. **烧录程序**
   - 将选定文件重命名为 `main.py`，或通过 MaixPy IDE 直接运行

3. **首次配置 Wi-Fi**
   - 串口下发，或服务器推送 `cmd=5`：
     ```json
     {"data": {"cmd": 5, "ssid": "YourWiFi", "password": "12345678"}}
     ```

4. **后续 OTA 升级**
   - 确保设备在线后，下发 `cmd=7` 即可触发 OTA

---

## 📝 注意事项

- 🔗 **OTA 地址**：由全局变量 `url` 定义，部署前务必修改为实际地址  
- 🧵 **线程安全**：通过 `update_thread_started` 标志防止 OTA 并发下载  
- ☀️ **视觉版**：光照敏感，建议在均匀光源环境使用  
- 📏 **激光版**：确认模块 I²C 地址（默认 `0x29`），避免长线干扰  
- 🌐 **网络操作**：均在子线程执行，主线程保持实时响应

## 🔧 打包步骤（命令行）
- 以t11的名称打包，或者修改代码升级路径
---
> 文档版本：v1.2  
> 更新时间：2025-11-21  
> 维护人：ZZH
```

