Miniature Satellite Communication System
Stanford Spacecraft Design Laboratory
In my Spacecraft Design course at Stanford University, I developed a miniature satellite communication system that emulated real-world satellite-to-ground station communication.
The system was built on a Feather M4 Express microcontroller and utilized CircuitPython and the Mu editor for embedded programming. The hardware setup included a radio (Featherwing RFM69HCW 900MHz) for communication, a 9-DoF IMU (LSM6DSOX + LIS3MDL FeatherWing), a DC motor, a DC motor driver (Stepper FeatherWing), and a display (FeatherWing OLED) for visual feedback, all integrated on a FeatherWing Tripler Mini Kit backplane.
Working in pairs, my partner and I were given the option to function as either a satellite or a ground station by simply toggling a boolean variable in the code. This flexibility allowed for each partner to experience both sides of the communication link. The system operated on a user-defined carrier frequency of 915 MHz in the ISM band. The RFM69 radio module, which employs Frequency-Shift Keying (FSK) modulation, was leveraged for radio transmission.
The communication protocol supported various commands, including "NOOP" (No Operation), "STOP" (halting motor operations), "EXEC" (executing motor speed changes), "HK" (requesting housekeeping data), and "DISP" (updating the onboard display). These commands were uplinked from the ground station to the satellite and were intended to simulate real satellite operations, from basic health checks to active control of onboard actuators. Moreover, on the ground station side, we implemented a command generation system using the IMU. The system continuously monitored accelerometer readings from an IMU interfaced with the ground station, and when these values exceeded a predefined threshold, it automatically generated commands to be sent to the satellite. While not realistic for actual ground stations, this approach was capable of generating many commands quickly without tedious typing, and served as a practical demonstration of event-driven programming and communication.
A typical sequence in our project demonstration involved the ground station sending a motor control command (generated by IMU movement), the satellite acknowledging receipt, and then executing the command. After that, we would manually send an "HK" (housekeeping) command from the ground station to the satellite, requesting telemetry data. This telemetry included queue statuses and command execution counts, which give an indication of how busy the satellite is and whether it's keeping up with incoming commands and outgoing data.
A significant technical challenge we faced was managing multiple concurrent operations, such as continuously listening for commands while simultaneously processing received data, controlling hardware, and sending periodic beacons. This was solved using Python's asyncio library, which allowed for the creation of coroutines that could run concurrently.
The code for this project can be viewed below: