---
# System prepended metadata

title: Avionics Software Development
tags: [Avionics, FAR2023]

---

# Avionics Software Development
###### tags: `Avionics`

## Architecture

SoC: ESP32S3
Framework: FreeRTOS
Source Code: https://github.com/wilicw/Avionics-RTOS/blob/features/FreeRTOS/main/main.c

<!-- ![](https://i.imgur.com/8xRNucm.png) -->
<!-- 
## Tasks -->

## FSM Design

- Init
    - Initialize all peripheral
    - Check all sensors
- Ground
    - Buzzer
- Counting
    - Count form 30 to 0
- Launch
    - Igintion
    - Accelerate detection
- Apogee
- Deploy
    - Deploy cubesat
- DeAcce
    - Deploy parachute
    - Altitude Detection
- TouchGround
- Crash

## Tasks

### Overview

航電程式由多個優先級不同的任務（Task）組成，這些任務負責資料蒐集、記錄與控制火箭本身，底層使用 FreeRTOS 分配 CPU 時間與任務間的通訊。

![Untitled Diagram.drawio](https://hackmd.io/_uploads/r1RBo19Sa.png)

### Control Logic

`void fsm_task(void* args)`

Control Logic 為整個系統中優先級最高的 Task，其中包含了一個有限狀態機（FSM）並定義了所有載具可能會出現的狀態，包含 `FSM_INIT`（初始化）、 `FSM_GROUND`（地面狀態）、 `FSM_RASING`（上升階段）、 `FSM_APOGEE`（最高點)、`FSM_PARACHUTE`（開啟主降落傘）、 `FSM_DETACH`（部署立方衛星）、 `FSM_FALING`（下降階段）、 `FSM_DEPLOY` （部署酬載）、`FSM_TOUCH_GROUND`（觸地）、`FSM_END`（結束記錄），並依據系統時間、Sensors Driver Task 所讀取到的感測器數值進行狀態間的變換。

### Sensors Driver 

`static void sensors_loop(TimerHandle_t xTimervoid)`

Sensors Driver Task 以 1000Hz 的頻率運行（除其中 GPS 為 1Hz ），負責蒐集慣性測量單元、氣壓計與衛星定位模組的資料，分別寫入到 `imu_instance` `pressure_altitude_instance` 等 structure 中供 control logic 讀取，同時將資料寫入到 ESP-IDF 提供的 log 中。

![Untitled Diagram-Page-2.drawio](https://hackmd.io/_uploads/By8pvx5Ba.png)

### Communication

原先規劃將通訊部分獨立成一個單獨的 Task，單由於實際執行的工作與 Logger 相似，故併入 Logger Task。

### Logger

Logger 使用了 ESP-IDF 中 `esp_log_` 的記錄函式庫進行資料記錄，藉由 Virtual filesystem (VFS) component 將航電板上的 microSD 掛載成可供 C 函式庫讀寫的界面（file-like interface）並講 log 中的資料寫入 microSD 卡與藉由 LoRa 模組發送到地面接收端。

![Untitled Diagram-Page-2.drawio](https://hackmd.io/_uploads/rJKfOl9rp.png)

<!-- 
## Reference

https://docs.zephyrproject.org/latest/boards/xtensa/esp32/doc/index.html -->