CanSat Test and Training Program
Telemetry-based mini satellite program at Sabancı University, from firmware to payload release to the training site.
Sabancı University's CanSat program (PURE'23) needed a miniature satellite that could survive being dropped from a drone at 100 meters, transmit live telemetry and images on the way down, and reliably release its payload - plus a public site to train new participants on the process. I worked on the firmware, the release mechanism, and the training website.
Firmware and telemetry
The satellite runs on an ESP32 talking to a BMP180 (pressure/altitude), MPU6050 (accelerometer), HMC5883L (magnetometer, via the QMC5883L-compatible library since our chip was an alternative variant), and a GY-NEO6MV2 GPS module over Serial2 - ESP32 doesn't support Arduino's SoftwareSerial, so the GPS gets its own hardware UART. A four-state mission state machine drives everything, and every sensor reading gets packed into one telemetry struct per packet:
enum State {
standby = 0,
ascent = 1,
descent = 2,
landed = 3
};
struct CollectiveSensorData {
std::string MISSION_ID, MISSION_TIME, PACKET_COUNT, MODE, STATE,
ALTITUDE, PC_DEPLOYED, TEMPERATURE, PRESSURE, GPS_TIME,
GPS_ALTITUDE, GPS_LATITUDE, GPS_LONGITUDE,
GPS_SATS, ACC_X, ACC_Y, ACC_Z, MAG_X, MAG_Y, MAG_Z, CMD_ECHO;
};Telemetry goes out over ESP-NOW (chosen for range over classic serial/Bluetooth) to a second ESP32 acting as a ground-station bridge, and is logged to an SD card in parallel so a mission survives a dropped radio packet. A separate ESP32-CAM module waits for a B{MISSION_ID} trigger over serial from the main board, then free-runs taking descent photos to its own storage.
Ground control and payload release
The ground station is a Python GUI that sends command strings (STA/DSC/FIN map to buttons for start-mission, force-descent, and finish-mission) and reads back the telemetry stream. Releasing the payload is a separate concern from telemetry entirely: a third ESP32 in the release module just waits for a release command and drives a servo to drop position. I designed and iterated that servo-driven mechanism in SolidWorks and 3D printed it, tuning the geometry across several real drop tests before it released reliably under load.
Training site
Separately from the flight hardware, I built the program's training website in Next.js, live at pure-website.vercel.app, to document the CanSat curriculum, rules, and past test reports so future cohorts don't have to relearn the same lessons - including the ones we only figured out after the fact, like the aluminum payload case attenuating our ESP-NOW range far more than the open-air tests predicted.
Result
A flight-tested CanSat with working telemetry, in-flight imaging, and payload release, plus a live training site onboarding new participants to the program.