- Jason Huang - Co-Captain and Lead Engineer
- Electrical Design Lead
- PCB Design and Assembly
- Mechanical Design and Fabrication
- CanSat Integration
- Tristan Yan-Klassen - Co-Captain and Mission Leader
- Mechanical Design and Fabrication Lead
- Drilling Apparatus Design and Assembly
- CanSat Body and Systems Integration
- Hinson Chan - Software Lead
- Ground Station Software
- Map Library Development
- Website Development
- John Xu - Hardware Lead
- Landing Apparatus
- Soil Sample Intake
- Ground Station Hardware
- Anthony Lu - External Communications
- Outreach
- Parachute Testing
- Mendel Rieseberg - Ground Control
- Radio Communications
The goal of CanSat is to design and build a small satellite that fits inside a 330mL soda can. The satellite will be launched to an altitude of 1km and will be deployed to land safely on the ground. We must equip the satellite with sensors to measure temperature, pressure, altitude, and location.
The project is split into six subdirectories:
- 'backend': The backend server for the ground station
- 'mission-control': The frontend dashboard for the ground station
- 'landing': The landing page for the website
- 'embedded': The Arduino code for the CanSat microcontroller
- 'electrical': The electrical schematics and PCB manufacturing files
- 'mechanical': The CAD files of our CanSat
The embedded code consists of sensors detecting temperature, pressure, altitude, and location. The data is sent to the ground station via radio communication, which is relayed via socket communication to the frontend dashboard. The dashboard then visualizes that information in the form of graphs, a map showing the CanSat's location, and the live 3D rotation of the CanSat.
This CanSat is designed to complete the primary mission, which is to send temperature and pressure data to the ground station live, at least once a second via radio. The CanSat also has a secondary mission, which is to drill into soil, take a soil sample, and test it with a ninhydrin chemical test within the CanSat's internal chamber. Using the CanSat's FPV live camera, we will determine the presence of amino acids in the soil if a change of color is shown in the ninhydrin.
To accomplish this, the CanSat will be first launched in a rocket to around 1km, then deployed with a parachute to descend at around 6m/s. When the CanSat lands, it will be on its side; we will send a command through our ground station to release the landing legs, which will spring the CanSat upright. We will then initiate the drill, which will drill a hole through our waterproof water chamber, releasing the water onto the soil to dampen it. The CanSat will then continue drilling into the soil, picking up a sample of wet soil, and then stop drilling and retracting up into the CanSat body. The ninhydrin chamber will swivel into place, where then the drill will lower into the chemical, allowing the soil to begin the chemical test. All of this will be remotely controlled from our dashboard.
- Designed in SolidWorks and 3D printed by Tristan, Jason, and John.
- Custom drill bit and other parts machined to fit inside the CanSat body.
- 4 motors used: GB 2208 Gimbal motor for drilling, 5g servo for testing chamber, N20 worm gear motor for leg release, and 2.5g servo for lead screw.
- Designed and hand-assembled by Jason on KiCad.
- Onboard sensors: GPS, 6 axis IMU, and 2 redundant barometers.
- Includes MOSFETs for motor control, 5V buck converter, and TVS diodes for ESD protection.
- CanSat onboard programming written in Arduino
- Written for Teensy 4.0, so it supports 'multithreading' (with careful process jumping)
- Nextjs frontend + ExpressJS backend, written by Hinson
- Data path: Onboard sensors -> Arduino serial -> Radio -> WebSocket backend -> Nextjs graph
- Graphs showing live data updates (temperature, pressure, calculated altitude)
- Fully-functional offline (no WIFI) slippy map
- You can also embed it as a react component with
bun i react-offline-maps
- OSM tile layers; tile caching
- You can also embed it as a react component with
- Gyrometer data 3D (threejs)
- Control motors live with Bidirectional communication
- Buttons send message via. data path in reverse:
- Websockets -> Radio -> Serial read -> parse as commands -> send power to pin