The rocket avionics consisted of a Teensy 4.1 for the main microcontoller, a low-g IMU (BNO055), a high-g accelerometer (ADXL377), a pressure sensor (BMP280), a GPS (NEO-6M) and a 433 MHz radio transciever (RFM96W).
The purpose of the rocket was to collect acceleration and gyroscope data such that we could test our IMU based position estimation algorithm (also called dead reckoning).
The code
folder contains code for all the sensors and telemetry onboard and for the ground station. The masterCode
folder contains the final code loaded onto the rocket.
- BNO055: Our low-g IMU, containing accelerometers capable of ±16G, as well as very accurate gyroscopes and magnetometers. Big thanks to SunrIde's Tom Danvers for writing the library we used to interface with the BNO055:
Arduino-BNO055
. - ADXL377: Our high-g IMU, capable of up to ±200G. This is an analogue sensor and is very noisy, so both hardware filters (capacitors) and software filters (Kalman filters) were used to get accurate data.
- BMP280: A pressure based altimeter used in conjunction with the brilliant Adafruit library.
- NEO-6M: A cheap but capable GPS module from ublox. In order to get a fast GPS lock, we implemented assisted GPS loading using the ublox AssistNow service. See
code/NEO6mWithAssistNow
. - RFM96W: A 433MHz SX1272 based tranciever module that was used both onboard and on our ground station. We used the LoRa protocol for greater range. We implemented an interrupt driven method using
RadioLib
.
The ground station used an old arduino nano with the RFM96W to recieve live telemetrics from the rocket. The launch commit button was used to put the rocket into a launch ready state remotely.
It passed this data to Grafana and InfluxDB using the line protocol. Big thanks to SunrIde's Yomi, Tom and Sebastiano for building the software to do this TeamSunride/GroundStation
. Our live telemetry Grafana Dashboard is shown below:
- Ensure ground station is booted and ready.
- Compile masterCode/main.cpp and upload to teensy so that the RTC syncs.
- Setup sensors, datalogging and telemety on the ground.
- Full system test with serial output to double check sensor values look reasonable.
- Load avionics into rocket.
- Wait for "Launch commit" from ground station.
- When rocket is loaded on the launch rail, press launch commit button on ground station (wait for confirmation - ground station light should go green).
- Start data acquisition, datalogging and transmitting data.
- Launch!
Loading avionics:
This rocket used breakout boards to house components. This made testing and verification easier before ordering the final PCB. The PCB was designed in EAGLE using many custom libraries.
The final schematic:
The final pcb board design:
The manufactured PCB (from china):
The assembled pcb with breakouts soldered and mounted:
The avionics recovered after flight:
The launch was a success!... it went up anyway. We suspect excess friction on the launch rail caused it to fly off course at about a 45° angle. (See https://www.youtube.com/watch?v=rMJzLpDIJ3U)
The rocket still achieved an apogee of 641m according to the BMP280 altimeter (note that the spike at apogee caused by the pressure from the ejection charge). The GPS lost satellite lock on launch as predicted, but regrained lock after apogee:
The acceleration data followed our expectations from the OpenRocket simulation, with a slightly lower max acceleration of 14.4g. Unfortunately, the BNO055 maxed out at 4G, rather than the desired 16g, despite having configured it to read up to 16g. The ADXL377 data is decent though: (note the spike at ejection charge)
The onboard dead reckoning algorithm also didn't work as expected, due to the BNO055 maxing out earlier than anticipated and due to the initial launch being so oscillatory (which threw off orientation estimation) the data is not an accurate measurement of position. Much has been learned from this launch and will be refined in future rockets. :)
The telemetry range was not very good, likely due to bad antennas, and because of UK regulations which limited our transmit power down to 10dbm at a max duty cycle of 10%. :(