384 lines
13 KiB
Markdown
384 lines
13 KiB
Markdown
# 1. 打猎相机外置MCU软件设计
|
||
|
||
  为满足打猎相机的低功耗需求,使用外置MCU的硬件设计框架,在非工作状态下保持外置MCU供电,CPU断电,满足低功耗的产品需求。
|
||
|
||
| 版本 | 时间 | 说明 |
|
||
| ---- | ---- | ---- |
|
||
| V1.0 | 2024-5-14 | 首次评审。 |
|
||
| V1.1 | 2024-5-16 | 完善时序图。 |
|
||
| V1.2 | 2024-5-20 | MCU默认关闭喂狗。 |
|
||
|
||
## 1.1. 基本概念
|
||
|
||
* **工作状态:**
|
||
|
||
| 工作状态 | 说明 |
|
||
| ---- | ---- |
|
||
| OFF状态 | 整机处于断电状态,包括外置MCU和主控。 |
|
||
| TEST状态 | 非正常工作状态,此时主控常通电,除非无操作时自动切换到ON状态。 |
|
||
| ON状态 | 设备正常工作状态,必须保证低功耗性能,PIR触发抓拍后必须快速关机(主控断电)。 |
|
||
|
||
**评审补充:**
|
||
|
||
1. 首次整机上电,必须CPU物理上电,完成SD卡产测文件检测,实现产测功能;
|
||
2. 动态切换到TEST/ON状态,需要CPU物理上电;
|
||
|
||
* **启动模式:决定CPU单次启动的任务内容;**
|
||
|
||
  每次启动的时间都是有限的,由CPU完成单次启动完成任务后发送断电关机指令给MCU,MCU给CPU断开物理电源;启动模式可以由CPU主动询问,也可以由MCU主动发送。
|
||
|
||
| 启动模式 | 说明 |
|
||
| ---- | ---- |
|
||
| PIR启动 | PIR触发启动。 |
|
||
| TEST启动 | 三档拨键拨到“TEST”,常通电的工作模式。 |
|
||
| ON启动 | 三档拨键拨到“ON”,正常工作模式。 |
|
||
| 连拍启动 | PIR触发场景下,用户可以设置连拍的张数和连拍的间隔,CPU通过协议告诉MCU在多少时间之后进行连拍启动。 |
|
||
| PIR延时启动 | 同PIR启动,只是PIR触发后,需要延时一段时间再给CPU上电。 |
|
||
| 定时启动 | 间隔固定时间启动一次,例如:60min/次 **待定** |
|
||
| 关机启动 | 某种场景下需要关机,给CPU上电一次,由CPU正式下发“关机”指令。 |
|
||
| 低电关机 | 电池低电需要关机,给CPU上电一次,由CPU正式下发“关机”指令。 |
|
||
| 异常启动 | CPU不正常时断电重启,例如:喂狗异常,超时启动异常。 |
|
||
|
||
  工作模式对应板子上的三档拨键,有三个工作模式:关机/TEST/ON。
|
||
|
||
**评审补充:**
|
||
|
||
* 一个PIR连拍周期内忽略PIR触发;
|
||
|
||
## 1.2. MCU基本功能
|
||
|
||
* 外围连接RTC,PIR传感器,电量计;
|
||
* 保存数据包括:CPU的启动模式,CPU定时启动时间,工作时间周期,PIR灵敏度;
|
||
* 使用串口协议与CPU进行数据/功能协议交互;
|
||
|
||
| 需要保存的数据 | 说明 |
|
||
| ---- | ---- |
|
||
| 启动模式 | ---- |
|
||
| 定时启动时间 | 例如:60min/次 |
|
||
| 工作时间 | 打猎机正常PIR触发的时间周期,例如:2:00 ~ 20:00 |
|
||
| PIR灵敏度 | PIR灵敏度设置 |
|
||
|
||
**存疑:**
|
||
|
||
硬件光敏接在主控上,先由主控内置MCU控制,正常启动后Linux是否可以复用此GPIO口。
|
||
|
||
## 1.3. 功能UML时序图
|
||
|
||
### 1.3.1. 整机物理上电启动
|
||
|
||
  整机物理上电时,设备一定会进入TEST或者ON状态,主控Linux启动一次。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
MCU ->> MCU:物理上电
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> MCU:查询启动模式
|
||
alt 检测到TEST拨档挡位
|
||
MCU -->> CPU:回复TEST启动
|
||
CPU ->> CPU:TEST启动
|
||
loop 无操作
|
||
CPU ->> MCU:发送关机指令
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
else 检测到ON拨档挡位
|
||
note over MCU:正常工作模式,PIR触发后可给主控上电
|
||
MCU -->> CPU:回复ON启动
|
||
CPU ->> CPU:ON启动
|
||
CPU ->> MCU:发送关机指令
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
loop 默认开启喂狗
|
||
opt 喂狗超时
|
||
MCU ->> CPU:断电重启
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复喂狗异常启动
|
||
CPU ->> MCU:发送关机指令
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
MCU ->> MCU:休眠
|
||
note over MCU:休眠后进入正常工作模式:当发生PIR触发时,<br>给CPU物理上电并发送PIR启动命令
|
||
```
|
||
|
||
### 1.3.2. MCU休眠逻辑
|
||
|
||
  合理的休眠设计,最大降低产品功耗,延长单次换电的使用周期。
|
||
|
||
定时中断待确认;
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
loop 常通电待机
|
||
opt PIR触发中断
|
||
MCU ->> MCU:休眠唤醒
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复PIR启动
|
||
end
|
||
opt TEST/ON按键中断
|
||
MCU ->> MCU:休眠唤醒
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复TEST/ON启动
|
||
end
|
||
opt 设置定时唤醒
|
||
CPU ->> MCU:发送设置定时唤醒协议
|
||
opt 定时唤醒中断
|
||
MCU ->> MCU:休眠唤醒
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复喂狗异常启动
|
||
end
|
||
end
|
||
MCU ->> MCU:休眠
|
||
end
|
||
```
|
||
|
||
### 1.3.3. 常通电待机
|
||
|
||
  描述上电后的各种场景。
|
||
|
||
#### 1.3.3.1. 定时唤醒刷新环境数据(**待定,忽略**)
|
||
|
||
  MCU定时唤醒更新环境参数,保证工作触发时的环境参数正确性。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
loop 常通电待机
|
||
loop 大循环定时中断(20min/次)
|
||
note over MCU:大循环定时中断负责定时触发小循环定时中断
|
||
opt 定时唤醒中断
|
||
loop 小循环采集数据(1s/次,共30次)
|
||
note over MCU:小循环定时器,短时间间隔唤醒,多次采集环境数据,<br>计算出合理稳定的环境参数并保存,在工作时可快速响应。
|
||
MCU ->> MCU:采集环境数据
|
||
note right of MCU:采集光敏数据
|
||
opt 采集30次完成
|
||
note over MCU:计算平均值作为单次采集的真实数据
|
||
MCU ->> MCU:计算30次平均值
|
||
opt 对比上次发生翻转
|
||
MCU ->> MCU:保存最新数据(白天/黑夜)
|
||
MCU ->> +CPU:发送数据同步任务
|
||
CPU -->> -MCU:回复OK
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> +MCU:读取白天黑夜数据
|
||
MCU -->> -CPU:回复白天黑夜数据
|
||
CPU ->> MCU:断电关机
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
```
|
||
|
||
#### 1.3.3.2. 喂狗
|
||
|
||
  外置MCU充当硬件狗,在系统异常时断电重启系统。喂狗逻辑和启动模式无关。默认关闭喂狗功能,主控喂狗之后,开启喂狗功能。
|
||
|
||
**注意:物理通电后如果主控从未进行喂狗,MCU喂狗功能一直关闭。**
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
MCU ->> MCU:物理上电
|
||
MCU ->> MCU:默认关闭喂狗功能
|
||
MCU ->> CPU:某种启动模式触发物理上电
|
||
alt 主控喂狗
|
||
MCU ->> MCU:开启喂狗功能
|
||
loop 喂狗
|
||
opt 设置喂狗周期
|
||
note over CPU:主控选择性设置喂狗周期
|
||
CPU ->> +MCU:开启狗/设置喂狗周期
|
||
MCU -->> -CPU:回复OK
|
||
end
|
||
opt 主控喂狗
|
||
note over MCU:喂狗不需要回复
|
||
CPU ->> MCU:喂狗
|
||
end
|
||
alt 主控喂狗异常
|
||
MCU ->> CPU:断电重启
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复喂狗异常启动
|
||
CPU ->> MCU:断电关机
|
||
end
|
||
end
|
||
else 主控未喂狗
|
||
note over MCU:如果主控在物理通电后从来没有喂狗,<br>MCU关闭喂狗功能
|
||
end
|
||
CPU ->> MCU:断电关机
|
||
MCU ->> CPU:物理断电
|
||
MCU ->> MCU:休眠
|
||
note over MCU:休眠后进入正常工作模式:当发生PIR触发时,<br>给CPU物理上电并发送PIR启动命令
|
||
```
|
||
|
||
#### 1.3.3.3. 超时异常启动
|
||
|
||
  CPU单次上电时间都是有限的,在主控未正常发送关机指令时,**10min**后断电进行异常启动。TEST/产测模式等需要一直开机的场景,主控关闭喂狗功能即可。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
MCU ->> MCU:物理上电
|
||
MCU ->> CPU:某种启动模式触发物理上电
|
||
alt 主控未关闭喂狗
|
||
note over MCU:如果主控关闭喂狗的功能,<br>也同时关闭超时异常启动功能
|
||
opt 主控未正常发送关机指令
|
||
MCU ->> CPU:物理断电
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复喂狗异常启动
|
||
end
|
||
end
|
||
CPU ->> MCU:断电关机
|
||
MCU ->> CPU:物理断电
|
||
MCU ->> MCU:休眠
|
||
```
|
||
|
||
#### 1.3.3.4. PIR触发任务
|
||
|
||
  PIR触发是相机的正常工作模式,相机会快速启动抓拍,并快速关机。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
loop 常通电待机
|
||
opt PIR触发中断
|
||
MCU ->> MCU:休眠唤醒
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复PIR触发启动
|
||
CPU ->> CPU:Do something
|
||
CPU ->> MCU:断电关机
|
||
MCU ->> CPU:物理断电
|
||
MCU ->> MCU:休眠
|
||
end
|
||
end
|
||
```
|
||
|
||
#### 1.3.3.5. TEST拨键启动
|
||
|
||
  TEST模式,相机处于一个长通电状态,功耗较高,长时间无操作会进入正常工作状态。
|
||
|
||
**存疑:** 实际使用时,当有人把按键从ON拨到TEST时,大概率会先触发PIR启动,再触发TEST启动。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
MCU ->> MCU:常电待机
|
||
opt 拨键从ON/OFF拨到TEST
|
||
note over MCU:TEST模式启动,只会发生在从ON/OFF切换到TEST的瞬间,<br>如果PIR触发时,已经处于TEST挡位,此时不影响PIR模式启动
|
||
MCU ->> CPU:物理上电
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复TEST启动
|
||
CPU ->> CPU:Do something
|
||
opt CPU关机
|
||
note over MCU:超时关机时,<br>此时拨键还是处于“TEST”挡位的
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
MCU ->> MCU:休眠
|
||
```
|
||
|
||
#### 1.3.3.6. 主控通电时发生启动事件
|
||
|
||
  如果主控在通电后(主控发送关机指令之前)发生启动事件的动态变化,需要先主动发送启动事件,有主控发送关机指令后,再断电重启触发新的启动事件。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
MCU ->> MCU:主控已经上电,常电待机
|
||
note over MCU:此处不管由于何总原因的主控上电,<br>如果发生启动事件动态变化,需要先发送启动命令给主控
|
||
opt 拨键从ON拨到TEST
|
||
MCU ->> +CPU:发送启动模式:TEST启动
|
||
CPU ->> CPU:Do something
|
||
CPU -->> -MCU:回复OK
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电重启
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复TEST启动
|
||
CPU ->> CPU:TEST启动
|
||
opt CPU关机
|
||
note over MCU:超时关机时,<br>此时拨键还是处于“TEST”挡位的
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
opt 拨键从TEST拨到ON
|
||
MCU ->> +CPU:发送启动模式:ON启动
|
||
CPU ->> CPU:Do something
|
||
CPU -->> -MCU:回复OK
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电重启
|
||
CPU ->> +MCU:查询启动模式
|
||
MCU -->> -CPU:回复ON启动
|
||
CPU ->> CPU:ON启动
|
||
opt CPU关机
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
opt PIR触发
|
||
note over MCU:上电后发生PIR触发,主控立即处理抓拍流程,无需断电重启。
|
||
MCU ->> +CPU:发送启动模式:PIR启动
|
||
CPU ->> CPU:Do something
|
||
CPU -->> -MCU:回复OK
|
||
opt CPU关机
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
opt 定时启动
|
||
note over MCU:上电后发生定时启动,主控立即处理抓拍流程,无需断电重启。
|
||
MCU ->> +CPU:发送启动模式:定时启动
|
||
CPU ->> CPU:Do something
|
||
CPU -->> -MCU:回复OK
|
||
opt CPU关机
|
||
CPU ->> MCU:发送断电关机
|
||
MCU ->> CPU:物理断电
|
||
end
|
||
end
|
||
MCU ->> MCU:休眠
|
||
```
|
||
|
||
#### 1.3.3.7. 数据同步
|
||
|
||
  主控和外置MCU之间数据同步,包括主控发给外置MCU的,也包括外置MCU发给主控的。数据同步流程可以在任意的工作状态下进行。
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant CPU
|
||
participant MCU
|
||
MCU ->> MCU:物理上电
|
||
MCU ->> CPU:某种启动模式触发物理上电
|
||
opt 数据同步
|
||
note over MCU:此处根据协议只做一个数据示例,其它协议雷同。
|
||
MCU ->> +CPU:获取灵敏度
|
||
CPU -->> -MCU:回复数据
|
||
end
|
||
CPU ->> MCU:断电关机
|
||
MCU ->> CPU:物理断电
|
||
MCU ->> MCU:休眠
|
||
note over MCU:休眠后进入正常工作模式:当发生PIR触发时,<br>给CPU物理上电并发送PIR启动命令
|
||
```
|
||
|
||
### 1.3.4. 连拍
|
||
|
||
  打猎机可以设置连拍张数和连拍间隔。连拍张数1-3,连拍间隔0-60s;
|
||
|
||
**备注:竞品的连拍间隔为0/1/2s。先做0/1/2s连拍,此时与外置MCU无关。**
|
||
|
||
## 1.4. MCU协议
|
||
|
||
  负责对MCU协议进行封包/解包,协议封包/解包功能独立封装成库,详见[协议文档](../../utils/McuProtocol/README.md)。 |