WORK IN PROGRESS - Please do not rely on this as your only tracking system. Tiny4FSK is still in the R&D phase of development and testing.
NEW - Significant repository structure overhaul (6/27/24).
STATE - Fully working tracker board! In the phase of testing and minor tweaks.
Tiny4FSK aims to be an ultra-tiny high-altitude tracking system. It runs on 1 AA battery that lasts for 10-17 hours (a few seconds between position updates, can run longer if there's a longer delay). It runs on 4FSK (4-frequency shift keying), which means that it separates tones into 4 separate frequencies. Upon this, it uses the Horus Binary v2 system, which is a relatively modern system popularly used with RS41ng.
High-Altitude Ballooning (HAB) offers a formally structured yet thrilling hobby, launching payloads to near-space (30km) for atmospheric research, breathtaking imagery, and scientific experimentation. While demanding meticulous planning, safety adherence, and technical skill in electronics and mechanics, HAB rewards hobbyists with hands-on engineering challenges and atmospheric understanding.
This codebase is meant to work with the Tiny4FSK PCB, also available on this GitHub repository. Key components include:
- Microcontroller - SAMD21G18A. A modern Cortex-M0+ microcontroller by Microchip.
- TX Module - Si4063. A transceiver from Silicon Labs, similar to the Si4032 on RS41 radiosondes.
- GPS RX Module - MAX-M10S. A high-performance GPS module from Ublox.
- Environmental Sensor - BME280. A proven sensor from Bosch for measuring temperature, pressure, and humidity.
- Boost Converter - TPS61200. Boosts 1.5V battery level to 3.3V for the rest of the board.
- LDO Step-Down - MCP1700. A step-down converter from Microchip.
This list is not exhaustive. Additional components and passives are detailed in the schematic files.
This code is modular and separated into several different files for easy expansion. These files are listed below:
- Tiny4FSK.ino - Main Arduino file with control flow.
- config.h - Configuration file for user parameters.
- crc_calc.cpp and crc_calc.h - CRC16 generator files for parity bits.
- horus_l2.cpp and horus_l2.h - Horus layer 2 file, Golay error correction algorithm.
- voltage.cpp and voltage.h - Voltage detection using ADC values.
- si4063.cpp and si4063.h - Si4063 driver files for radio transmission.
- fsk4_mod.cpp and fsk4_mod.h - 4FSK modulation functions.
- delay_timer.cpp and delay_timer.h - Low-level delay functions based on timers.
- i2c_scan.cpp and i2c_scan.h - I2C scanning for debugging utility.
This project is based on the Arduino IDE workflow. Below steps outline steps necessary to install Arduino IDE and configure it for the SAMD microcontroller.
- Install Arduino IDE from here.
- Download the Arduino SAMD core.
- Download necessary libraries from library manager: a. ArduinoLowPower b. Sparkfun GNSS v3
- To following needs to be downloaded directly from GitHub: a. TinyBME280
- Open Tiny4FSK.ino by double-clicking it (should open Arduino IDE).
The SAMD goes to sleep to save power. To achieve proper sleep, some edits to the SAMD core are necessary. To locate the wiring.c file on your computer, follow this guide. Once there, comment out or completely delete this line as shown:
// Defining VERY_LOW_POWER breaks Arduino APIs since all pins are considered INPUT at startup
// However, it really lowers the power consumption by a factor of 20 in low power mode (0.03mA vs 0.6mA)
#ifndef VERY_LOW_POWER
// Setup all pins (digital and analog) in INPUT mode (default is nothing)
for (uint32_t ul = 0 ; ul < NUM_DIGITAL_PINS ; ul++ )
{
pinMode( ul, INPUT ) ;
}
#endif
Arduino gives you an official warning: "This breaks Arduino APIs since all pins are considered INPUT at startup. However, it really lowers the power consumption by a factor of 20 in low power mode (0.03mA vs 0.6mA)". Testing has shown no adverse effects.
User configuration of this tracker is required. As this system uses amateur radio, you will need at least a Technician's level license (US). Configuration file is located in config.h. Here are the parameters that need to be changed.
HORUS_ID
- This setting is your Horus ID number. Information on how to get one in next section.FSK_FREQ
- This is setting for your preferred TX frequency. If in US, best to keep the same as the PCB is built around 433.200 MHz. Minor modifications in the 70 cm band are fine though.FSK_BAUD
- FSK baud rate. No need to change, as most RX station use the baud rate.FSK_SPACING
- FSK spacing in Hz. Once again, most station are set to this value.STATUS_LED
- Comment out to disable verbose status LEDs on PCB.DEV_MODE
- Comment out for flight mode. Disables Serial and enables deep sleep modes for lower power consumption.
Everything below the above values in the configuration file can go unchanged. These are pin numbers, and unless you are making your own PCB, leave them be.
NSS_PIN
- Si4063 SS pinRESET_PIN
- Si4063 RST pinDIO0_PIN
- Si4063 GPIO0 pinDIO1_PIN
- Si4063 GPIO1 pinEXTINT
- GPS EXTINT pin for longer packet delays.SUCCESS_LED
- Success LED pin.ERROR_LED
- Error LED pin.
If you are going to fly your own payload using Horus Binary, you must get a payload ID allocated for your use. This can be done by submitting an issue or a pull request to this repository, or e-mailing VK5QI: vk5qi@rfhead.net
Do not use the testing (4FSKTEST-V2) payload ID on an actual launch! (ID 256)
The Tiny4FSK PCB has many configurable operating modes, pins and power sources. This section will outline these parts of the PCB.
The PCB contains two jumpers, JP1 and JP2.
- JP1 - Cut (desolder) to enable SW3 for power.
- JP2 - Control power source (USB and center for USB mode, center and BATT for battery mode).
There are also two switches/buttons, SW1 and SW2.
- SW1 - Reset button for the microcontroller.
- SW2 - Battery power switch. Connects battery output to boost converter input.
There are two antenna pads, AE1 and AE2.
- AE1 - L1 GPS band antenna
- AE2 - 70cm antenna pad. For a guide to cut a proper antenna, refer to the following section.
This system relies on 70cm (420-450 MHz in the US). There is a pad that supports a quarter-wave monopole, but also provides grounding pads for a more advanced antenna. Generally, a length of magnet wire ~16cm should work just fine.
To ask questions, kindly donate, or even say hi, feel free to contact me at this email: tiny4fsk@gmail.com. Thanks!
- RS41ng Project
- Horus Binary modulator and decoder repository
- SAMD21 product page
- Si4063 product page
- MAX-M10 product page
- BME280 product page
- TPS61200 product page
- MCP1700 product page
This project would not be possible without the following individuals:
- Charlie Nicholson KC1SFR for collaboration.
- Mark Jessop VK5QI for extensive support.
- Mike Hojnowski KD2EAT for helping out with software and hardware issues.
- Bob Phinney K5TEC for providing funding for this project.
- Brett Miwa for schematic and PCB design help.
- Joe KM1P for RF help.
- My parents for motivation.
And these entities:
- PCBWay for PCB prototyping and sponsorship!
- Bagel Fund for sponsorship!
- Hack Club for support and sponsorship!
- New England Sci-Tech for providing a makerspace.
- Sci-Tech Amateur Radio Society for expertise.
- New England Weather Balloon Society for insights.
- Digikey for part sourcing.
Software and Documentation:
- GNU GPL v3 license Hardware License
- OSHW (US002611) and CERN Open Hardware Licence Version 2 - Weakly Reciprocal