0

ARC Sentinel

ARC Sentinel is a fully open-source CubeSAT (nanosatellite) platform built from consumer electronics. It transmits real-time telemetry - gyroscope data, temperature, humidity, camera images - to a ground station over a 433 MHz LoRa radio link up to 5 kilometers away.

ARC SENTINEL

Autonomous Remote CubeSAT - Sentinel Platform v1.0

System Architecture

ARC SENTINEL (Flight Computer) <---- LoRa 433 MHz ----> Ground Station

Flight Computer stack:
- ESP32 flight computer
- MPU6050 IMU
- DHT11 sensor
- LoRa SX1276
- ESP32-CAM over UART

Ground stack:
- Arduino/ESP32 + LoRa receiver
- USB serial to PC
- ground_station_bridge.py (WebSocket :8765)
- Next.js dashboard (:3000)

OTA uplink path:
PC -> Ground Receiver (USB) -> LoRa RF -> Flight Computer -> FC or CAM

Downlink flow:

  1. Flight computer reads sensors every 2 seconds and transmits JSON over LoRa.
  2. Ground receiver injects RSSI/SNR and forwards via USB serial.
  3. Python bridge detects packet loss and broadcasts to WebSocket clients.
  4. Next.js dashboard renders telemetry panels in real time.

Wiring - Flight Computer

LoRa SX1276 / Ra-02:

  • VCC -> 3.3V
  • GND -> GND
  • SCK -> GPIO 18
  • MISO -> GPIO 19
  • MOSI -> GPIO 23
  • NSS -> GPIO 5 (CS)
  • RST -> GPIO 14
  • DIO0 -> GPIO 2

MPU6050:

  • VCC -> 3.3V
  • GND -> GND
  • SDA -> GPIO 21
  • SCL -> GPIO 22

DHT11:

  • VCC -> 3.3V
  • GND -> GND
  • DATA -> GPIO 4 with 10k pull-up to 3.3V

ESP32-CAM via UART:

  • 5V -> 5V
  • GND -> GND
  • TX -> GPIO 16 (ESP32 RX2)
  • RX -> GPIO 17 (ESP32 TX2)

Wiring - Ground Receiver

Use a second LoRa SX1276 with an Arduino/ESP32 connected to your PC:

  • VCC -> 3.3V
  • GND -> GND
  • SCK -> GPIO 18
  • MISO -> GPIO 19
  • MOSI -> GPIO 23
  • NSS -> GPIO 5
  • RST -> GPIO 14
  • DIO0 -> GPIO 2

Ground receiver firmware injects rssi_gs and snr into each packet before forwarding at 115200 baud.

Core Firmware Files

  • firmware/flight_computer_ota/flight_computer_ota.ino
  • firmware/esp32cam_ota/esp32cam_ota.ino
  • firmware/lora_ground_receiver/lora_ground_receiver.ino
  • ground-station/ground_station_bridge.py
  • tools/arc_uplink.py

Key flight firmware constants:

#define LORA_FREQ          433E6
#define TELEMETRY_INTERVAL 2000
#define OTA_CHUNK_SIZE     128
#define APP_VERSION        "1.0.0"
#define SATELLITE_ID       "ARC-SENTINEL-01"

Increment APP_VERSION before OTA updates to verify remote flash success in telemetry.

ESP32-CAM Commands

CommandAction
CAPTURECapture JPEG, base64 encode, and send between IMG_START and IMG_END
STATUSReply with camera state and firmware version
OTA_BEGIN \<size\> \<chunks\>Prepare OTA
OTA_CHUNK \<seq\> \<len\>Write OTA chunk
OTA_END \<md5\>Validate firmware and reboot
OTA_ABORTCancel OTA session

Ground Bridge

Install and run:

pip install pyserial websockets
 
python ground_station_bridge.py --port /dev/ttyUSB0
python ground_station_bridge.py --port COM3

Bridge responsibilities:

  • Parse serial telemetry JSON
  • Detect sequence gaps and packet loss
  • Broadcast over WebSocket :8765
  • Forward UI uplink commands back to serial

Ground Station UI

cd ground-station
npm install
npm run dev

Open http://localhost:3000.

If the bridge is offline, demo mode starts after about 4 seconds.

pip install pyserial tqdm
 
python arc_uplink.py ping
python arc_uplink.py status
python arc_uplink.py flash-fc  firmware/flight_computer_ota/flight_computer_ota.ino
python arc_uplink.py flash-cam firmware/esp32cam_ota/esp32cam_ota.ino
python arc_uplink.py flash-bin my_firmware.bin FC
python arc_uplink.py set interval 5000
python arc_uplink.py abort

Set SERIAL_PORT in arc_uplink.py to your ground receiver USB port.

LoRa Radio Configuration

Both radios must match exactly.

ParameterValue
Frequency433 MHz (or 915E6 for US/Canada)
Spreading FactorSF10
Bandwidth125 kHz
Coding Rate4/5
TX Power20 dBm
Sync Word0xF3
Telemetry Interval2000 ms
Expected Range5-15 km line of sight

Telemetry Packet Format

{
	"id": "ARC-SENTINEL-01",
	"pkt": 42,
	"t": 84.0,
	"ver": "1.0.0",
	"accel": { "x": 0.010, "y": 0.050, "z": 0.980 },
	"gyro": { "x": 1.23, "y": -0.45, "z": 0.78 },
	"roll": 3.2,
	"pitch": -1.1,
	"mpu_temp": 27.4,
	"env": { "temp": 22.5, "hum": 55.0, "hi": 24.1 },
	"rssi": -72,
	"rssi_gs": -75,
	"snr": 8.5
}

Setup Summary

  1. Install ESP32 board support in Arduino IDE.
  2. Install libraries: LoRa, MPU6050, DHT, ArduinoJson, Base64.
  3. Set partition scheme: Minimal SPIFFS (1.9MB APP with OTA).
  4. Flash flight_computer_ota, esp32cam_ota, and lora_ground_receiver once over USB.
  5. Install Python tools: pyserial, tqdm, websockets.
  6. Run bridge and dashboard, then perform OTA via arc_uplink.py.

License

MIT License.

ARC SENTINEL v1.0 - 433 MHz - SF10 - BW125 - CR4/5 - OTA enabled.