Picoballoon 2019

Lightweight high altitude balloon probe

STM32 RF probe solar

In 2019 Brno Observatory and Planetarium together with Slovak Organisation for Space Activities organised a competition of high altitude balloon probes. The rules were simple, build a probe that weights below 20 grams. It should be able to send it's own position. They will launch it on a small balloon up to stratosphere (well, the final altitude depends on probe weight, could be between about 2 km and 15 km) and the last probe alive wins. The deadline for registration was quite close and almost all my free time was gone because I was working on my master thesis back than. Anyway, launching my own probe into the space (almost)? Yeah, let's postpone the thesis a bit.


Question number one, how to power the probe? The power source must be light and must survive in freezing cold temperature (around -50 degrees Celsius). Some teams used batteries expecting the probe to work for day or two. Most people decided to use solar cells. As the competition goal was to send position for as long as possible, batteries were no-go for very limited lifetime. I had few solar panels lying in my mess box, quite bulky and heavy (around 4 grams), I've ordered box of solar cells from China, but shipping took too long and the parcel arrived a week after probe launch, so I had to use the heavy panel from the mess box.

As the radio link requires quire a lot of power (it takes dozens of mA during data sending) I needed some kind of a power storage in addition to solar cell. The 3.3 F/3V supercap I bought some time ago out of curiosity was the choice. So, solar panel charges the supercap, supercap powers the probe. There's one catch though, I need stable 3.3 V to power the MCU, GPS and RF modules. Therefore the supercap voltage is increased by boost switching power supply (MCP1640) to 3.3 V.

The power supply can't run all the time, imagine a simple situation - sunlight hits the solar panel, voltage on supercap starts rising from almost zero to around 800 mV where the boost regulator starts to operate, MCU and GPS wakes up, current consumption jumps to several mA, solar panel is not able to supply enough current, supercap discharges and boost regulator dies before any data were sent to ground. I tried to design a simple latching circuit from two transistors and few passive parts. The principle is simple.

  • Vcc is slowly rising, D2 is closed, no current is flowing through R1 and R3, voltage on Q2 base is same as on the emitter, Q2 is therefore closed.
  • Once Vcc is higher then zener voltage of the D2, D2 opens, voltage on Q2 base is same as D2 zener voltage, once Vcc gets over D2 voltage + 0.6 V, Q2 opens.
  • Current flowing through Q2 causes voltage on R5 to rise, therefore enabling the buck power regulator.
  • Voltage on R5 opens Q1 which holds Q2 opened until Vcc falls below about 0,6 V.
  • Positive feedback between Q1 and Q2 causes Q2 to open very fast and keeps it open until supercap discharges.

This was the theory, unfortunately nothing is perfect in real life. It turned to be very hard to tune the tripping point to the required value. The positive feedback allows very tiny currents to open the Q2 long time before expected voltage is reached. These currents additionally depend on temperature, each transistor has a little different parameters, etc. Anyway, I've experimented with resistors a bit to get behavior at least remotely similar to one I needed and kept the circuit unchanged as the launch was few days away and I had no time to redesign the PCB.

Today, I would go a different way and use some kind of voltage watchdog or something like that. It will consume few uAmps in idle state, but the tripping point will be stable and reliable.


To know where the probe is I needed a GPS module. As light as possible. And cheap, the probe is disposable. Originally I wanted to use SIM28ML I found in one of the local suppliers, but after I designed the board, this module just went out of stock, so I've bough much more expensive U-Blox MAX-M8 which fortunately had same footprint and almost same pinout, so only minor changes to the PCB were needed.


The biggest problem I encountered during the design was radio to send data to ground. It has to work everywhere, the probe could fly away from Europe to Asia or America. If I were a HAM, it would be simple. APRS tracker with working frequency selection tied to GPS position would work perfectly around the globe. But without the HAM license, I had to found a band that could be used by anyone for free. I thought PMR radios (walkie-talkie) are using same frequency across most of the countries! Well, no, I need some kind of ground station network spanning the Earth. Fortunately in the age of IoT crap, there's community IoT network with base stations in almost every country The Things Network. LoRa modules are cheap, so this was the way to go.

Unfortunately there are three major LoRa bands, for Europe, Asia and America. The frequencies are not far from each other, it should be possible to modify the LoRa module output filters and retune between them based on position obtained from GPS, but I was running out of time, so only European frequency band was used.

The module I used was the well known SX1276. There's even an official LoRa library from IBM. The development ended a long time ago, but the library was released as opensource, so someone continued with development and ported the library on arduino (arduino-lmic). The source code is far from perfect, it could be written much better, but it works and I'm running out of time. Let's move forward.

I've registered the probe in TTN and sent few packets to the network, so this was working. There are multiple storage backends for received data, the simplest one is keeping the data for about a week, enough for my purposes. It's even possible to write custom data decoder directly in the TTN Console panel.

MCU and rest of the circuit

The probe is controlled by STM32F070, there's also a digital thermometer and a pressure sensor. Unfortunately I was not able to make the pressure sensor working before the launch, so only temperature was measured.

Once the power was applied to the MCU, it started connecting to the LoRa network. In the meanwhile the GPS module was getting a fix. Once the GPS fix was obtained, the MCU sent position together with the ambient temperature, supercap voltage and few other values over LoRa to the cloud and killed the power supply.


As the launch date was just few days away I had to make the PCB at home. That's the reason I had to design the PCB onesided and therefore big and heavy. And when I say heavy, I mean heavy, the 1,6 mm thick PCB weights too much. With a belt sander and few minutes of time, I was able to reduce the PCB thickness by 70 % and save 4 grams of weight!

Launch and competition results

At the launch date, 9 (out of 17 registered) teams arrived to the Brno Observatory. It was a windy day, so we launched our balloons from the roof of the observatory. The coordination of the event was quite poor, just before the launch the organisers decided to provide 2 balloons instead of one to all teams with probes heavier than 10 grams. The windy weather complicated the launch a bit, but I was lucky and the probe went up smoothly without hitting anything.

I could see network authentication requests from the probe during whole day, but no data made it through. I'm not sure why, maybe the antenna was damaged or the LoRa module was not using full tx power due to a bug in the software, who knows. The wind carried balloons to North-East. Other teams reported position somewhere above Poland. Last probe sent it's position during the night (battery powered) and no probes lived to see another day. From other teams logs I guess balloons were brought down by a local storm.


Previous Post Next Post