MASA Avionics Telemetry System

Project Lead for Radio Firmware & Telemetry

Project Overview

This project, as part of the Michigan Aeronautical Science Association (MASA), focuses on developing a robust, long-range telemetry system for high-altitude rockets. The primary goal is to ensure reliable, real-time data transmission from the rocket to a ground station, even at altitudes up to 75,000 feet.

The system utilizes LoRa (Long Range) communication in the 2.4GHz band, leveraging Chirp Spread Spectrum (CSS) modulation to achieve a resilient communication link. This is critical for post-flight analysis, especially in scenarios where the primary black box data recorder may be unrecoverable. This project addresses a key failure point from past launches by creating a redundant, live telemetry backup.

Avionics Hardware Placeholder

Technical Approach

LoRa Communication & Antennas

The core of the system is built around the SX1280 LoRa transceiver module. On the rocket, a patch antenna is integrated into one of the tailfins to provide a compact and aerodynamic solution for transmitting data. This placement helps maintain a clear signal path, especially during the rocket's descent phase.

LoRa modulation provides excellent resilience to interference and requires low power, making it ideal for a rocket's constrained environment. Our target is a 40Kbps telemetry data rate, which is a balance between data throughput and link reliability over long distances.

Dual-Antenna Ground Station

To maximize signal reception, the ground station employs a dual-antenna setup. This includes a high-gain directional Yagi antenna that must be aimed at the rocket and a semi-omni-directional dome antenna. This diversity helps mitigate signal loss due to rocket orientation changes during flight. An antenna splitter combines the signals before they are processed.

Link Budget Analysis

A critical part of the design process is the RF link budget analysis. By accounting for transmitter power (12.5 dBm), antenna gains (8 dBi ground, 6 dBi rocket), free-space path loss at 20km, and other system losses, we calculated a received power of -108.9 dBm. This is well within the SX1280's receive sensitivity of -132 dBm, providing a healthy link margin to ensure reliable communication.

Data Analysis & Results

Initial testing of the transmitter and receiver test boards has yielded promising data. The following plots show the Received Signal Strength Indicator (RSSI) and Signal-to-Noise Ratio (SNR) over time during a hotfire test, demonstrating a stable link against rocket plume.

RSSI Over Time

RSSI Plume Data

RSSI remains consistently around -75 dBm, indicating a strong signal.

SNR Over Time

SNR Plume Data

SNR is stable above 10 dB, indicating a clear signal with low noise.

Firmware Driver Development

As the Radio Lead, I am pioneering the development of a bare-metal C driver for the Semtech SX1280 transceiver. A key challenge is ensuring data integrity in a multi-threaded environment. The firmware is architected for radio configuration, packet handling, and data buffering, and leverages FreeRTOS critical sections for thread-safe SPI communication.

SX1280.c - Thread-Safe SPI

static void SX1280_SPI_TransmitReceive(uint8_t *pTxData, uint8_t *pRxData, uint16_t size)
{
    // wait for radio to not be busy before starting SPI transaction
    SX1280_WaitForReady(100); // 100ms timeout

    // enter critical section for thread safety
    taskENTER_CRITICAL();

    // set NSS low to select the radio
    HAL_GPIO_WritePin(sx1280_hal_config->nssPort, sx1280_hal_config->nssPin, GPIO_PIN_RESET);

    // perform SPI transaction
    if (pRxData == NULL)
    {
        HAL_SPI_Transmit(sx1280_hal_config->spiHandle, pTxData, size, HAL_MAX_DELAY);
    }
    else
    {
        HAL_SPI_TransmitReceive(sx1280_hal_config->spiHandle, pTxData, pRxData, size, HAL_MAX_DELAY);
    }
    // set NSS high to deselect the radio
    HAL_GPIO_WritePin(sx1280_hal_config->nssPort, sx1280_hal_config->nssPin, GPIO_PIN_SET);
    
    // exit critical section
    taskEXIT_CRITICAL();

    // wait for radio to be ready after transaction
    SX1280_WaitForReady(100); // 100ms timeout
}
                    
Back to Portfolio