SF-HAB High-Altitude Balloon Launch #5

After the recent success flying and recovering the Launch 4 latex bursting balloon, the SF-HAB team wanted to launch again. This time, we would do some science and fly a RadSense Mini Geiger tube to measure radiation up at altitude.

Additionally, some folks at the Noisebridge hackerspace in San Francisco were also planning to launch another Meshtastic balloon. We decided to try some Meshtastic experiments: could we send messages between the two balloons in-flight? What about uplinking messages to one balloon, cross-linking to the other balloon, and downlinking it? Ideally, the balloons would launch from different locations within 15 minutes of each other.

Preflight Planning and Coordination

One of the main lessons learned from Launch 4 was that we needed to spend more time getting our payloads working before the morning of the launch. During launch 4, we wasted almost an hour debugging network and RF problems (that didn't turn out to be RF problems) before launch, wasting valuable time.

The team got together at the Noisebridge space the weekend before the flight. I mostly worked with the Noisebridge people on getting their RS41 tracker programmed. Walter K6ATV got his LoRa trackers working and sending packets to the LoRa network, and Martin W6MRR got his mobile Horus Binary receive station working.

We decided to fly eight payloads on this flight. From the balloon (top) end:

  • 1500 gram Kaymont balloon
  • Parachute
  • 431.05 MHz Reprogrammed Vaisala RS41 Radiosonde
  • 144.39 MHz APRS Tracker
  • 433.775 MHz LoRa Tracker
  • Radar reflector
  • VHF/UHF Cross-band Repeater, Meshtastic nodes, and Geiger tube
  • GoPro Camera pointed down

Flight Predictions

It's always best to pick your launch location based on the predicted landing location. Here in California, landing in the Central Valley is ideal because there are lots of roads in a regular grid, wide open fields in between, and not many people. However, getting to the Central Valley from San Francisco requires flying over the Coastal Range mountains. When flying over the Coastal Range into the Central Valley, it is crucial to pass over the Westside Freeway (Highway 5). Landing to the west of the highway means you're in the foothills with few roads, trees, and lots of fences. Landing to the east means you can pretty much drive to the landing site.

The winds are pretty strong in a westerly direction in Northern California in the winter. Playing around with ascent and descent rates on the flight predictions during the week before launch showed that a 5 meter/sec ascent rate launch from the Berkeley Marina would land in the Central Valley between Newman and Patterson. Any faster than 5 meters/sec ascent rate would cause the balloon to spend less time in the easterly winds, and therefore land in the Coastal Range to the west of Highway 5. Not good.

After discussion and planning with the Noisebridge folks, launch was scheduled for Saturday March 29th.

Flight prediction from the night before

Using the Sondehub burst calculator (which is from cusf-burst-calc), we find that a 5 meters/sec ascent rate requires a (calculated) neck lift of about 2.7 kg. This time we made sure to use hydrogen as the lifting gas in the calculator.

Sondehub burst calculator

Balloon Assembly, Filling, and Launch

Balloon and payload train assembly this time went much smoother than the previous launch. All of the payloads and networking configurations had been tested before the launch morning, so it was really turning on the transmitters and tying everything together. Very easy, although it still took about 30 minutes to do this.

Assembling the balloon train

Filling the balloon also went a bit smoother than last time. We had plenty of hands, and the whole filling process took less than 10 minutes. Neck lift was measured at just under 2.7 kg, ensuring that we would ascent slowly, spend more time in the westerly winds, and (hopefully) land east of Highway 5 in the Central Valley.

Filling the balloon

Launch occurred at 17:07:45 UTC, 10:07 am Pacific time. Steve K6WW brought his drone and took a video of the launch. Next time we should plan this a bit better to get better video of the balloon just after release, to check that none of the antennas or payloads were damaged during release.

Drone shot of balloon release

Ben KO6CNT decided to livestream the launch, chase, and (hopeful) recovery on the 323 Labs' Meshtastic youtube channel. There was audio problems, so the video and audio get progressively more out of sync as the video goes on. In this video, launch occurs at the 30 minute mark, the Noisebridge launch occurs at the 6 hour 22 minute mark, and Ben and Walter recover the evening Oakland radiosonde around the 8 hour 15 minute mark.

Tracking Stations

Another lesson learned from Launch 4 was the need for more Horus Binary receiving stations in Northern California. David WB6TOU, a SF-HAB member that lives in Lodi, agreed to host a receive station. To make things easy, we decided to just add a RF splitter and another RTL-SDR dongle to his Docker radiosonde_auto_rx station.

David WB6TOU receive antenna

While his quarter wave ground plane antenna is cut for 400 MHz, it will probably work fine at 430 MHz. This receive antenna is approximately 3 ft above the roof gutter line, but is blocked to the south and the north at the horizon by the building roof. It should have good coverage to the west, where the balloon will launch from.

Martin W6MRR also added a Horus Binary receive station at his home in Berkeley. It should have good coverage of the launch site, but will probably loose the balloon once it goes over the East Bay Hills. Additionally, Martin built at mobile tracking station with a Raspberry Pi for his car. His setup was powered from a USB-C portable charger power bank.

Fixed Horusdemod receive stations for launch

For this launch, I used a very similar setup to the mobile tracking station that I used previously. The only upgrades were on the networking side to ensure that packets were being uploaded to Amateur Sondehub.

Mobile tracking station

Flight and Landing

After we released balloon, it took us only a few minutes to pack up the launch site and hit the road. This was a dramatic improvement over last time, when it took us 20 minutes or so to find the crescent wrench to remove the regulator on the hydrogen tank.

The balloon was launched at 17:07:57 UTC, burst at 31,839 meters (~104.5k feet) at 19:07:43, and landed at 19:43:45 UTC. Flight time was 15 seconds short of 120 minutes long, and it took 36 minutes to fall.

We had three chase cars, and staged in the town of Patterson at a local taqueria. Soon after we got our tacos, the balloon burst. We started driving immediately, as Chasemapper predicted it would be landing in about 20 minutes. After driving very close to the predicted landing spot, we just hung around and waited for the balloon to come to us.

This Chasemapper display shows our current location, balloon current location, any other chasers in the vicinity (Steve K6WW was still at the taqueria), predicted landing location, and time until landing. The "Data Age" numbers on the left side show how stale the plotted data is. Since my mobile station had line-of-sight with the balloon, the payload age value is only 13 seconds. Remember that it transmits every 15 seconds.

Chasemapper display of the balloon falling

Since we were parked and waiting very close to the predicted landing spot, I started scanning the sky for the balloon as it was falling. I saw the balloon when it was at 1,032 meters (~3,400 ft) altitude, according to the timestamp on my pictures. The parachute was deployed, but there was also still a lot of latex still attached. Looking a the telemetry afterwards, the balloon was falling at -11 meters/sec, which seems pretty fast. There was only 95 seconds between when I first saw the balloon and it hitting the ground.

Balloon falling

After knocking on a few doors but finding nobody at home, it was a quick drive among the almond trees to the landing site. The balloon and parachute were within arm's reach in a tree. The GoPro camera payload and meshtastic/crossband repeater made a hard landing at the bottom of the train.

Balloon on the ground

The recovery team was Bryan KF6ZEO, Kevin Sarmiento, Walter K6ATV, and Ben KO6CNT. Not shown in this pic is Martin W6MRR and Steve K6WW, who arrived a few minutes later. Unfortunately, I forgot my pliers so we had no way to turn off some of the transmitters. We put everything in the car and drove back to the taqueria.

Balloon recovery team

Horus Binary Transmitter (KF6ZEO)

I re-flew the same reprogrammed RS41 as I did on the previous launch, with the same Energizer Lithium batteries that I had grabbed from a radiosonde. The transmit "dial" frequency was 431.05 MHz, which is the standard Horus Binary transmit frequency in the Western US. Once more, the Horus Binary telemetry system worked extremely well. Based on the lessons learned from the previous launch, we had added another Horus Binary receive station in Berkeley and Lodi, bringing the total number of receive stations to four.

The telemetry below is based on the Sondehub Amateur grafana dashboard of this flight. The balloon burst at 31,839 meters (104.4k feet). This was a bit lower than predicted, but this didn't really affect the balloon position because the winds above 26k meters (~85k feet) were less than 25 kilometers per hour (~15 MPH).

KF6ZEO Horus Binary altitude

The ascent and descent rates were pretty standard.

KF6ZEO Horus Binary Ascent/descent rates

Zooming in on the ascent rate before balloon burst, we can see that we started off around 5 meters/sec, which is what we were targeting with the (calculated) neck lift of 2.7 kg. So the calculations worked! And just like previous launch, the ascent rate dropped by about 1 meters/sec at ~8800 meters altitude.

KF6ZEO Horus Binary Ascent rate (Zoom)

This launch we received good descent rate telemetry all the way down to landing. The final descent rate, below about 7000 meters (23k feet), was -11 meters/sec. This is pretty fast considering the parachute was inflated. This is where the air is thick enough to start slowing the payload. The previous launch was -8 meters/sec, with a similar mass payload and failed parachute.

KF6ZEO Horus Binary Descent rate (Zoom)

A total of 570 packets were transmitted by the tracker in flight, and the four ground stations received 568 packets (99.6%). Only two packets were transmitted by the balloon that weren't received, which is pretty incredible! Once again, the W6SUN folks in San Diego started receiving the balloon at 22.8k meters (~75k feet), and received almost every packet until the payload fell below 23.2k meters.

KF6ZEO Horus Binary RX packet count

The receiver-reported transmit frequency shows a pretty good plot of when each station heard the balloon. My mobile station heard the balloon from before launch until after landing, as I was very close to the balloon at the launch and landing sites. David WB6TOU and my home station KF6ZEO-H2 heard the balloon soon after it was launched until just before landing. The San Diego stations (W6SUN and KQ6RS) heard the balloon as soon as the balloon got high enough.

KF6ZEO Horus Binary recevier-reported payload transmit frequency

Looking closer at this graph, we see that even the 1 ppm RTL-SDR dongles have some temperature drift. We also see the receiver frequencies rise and fall in tandem about 40 minutes after launch, most likely due to the transmitter cooling down. And the rise in transmit frequency around 19:30 UTC is when the payload was warming up as the air on the ground. But zooming in on the spike in receive frequency just after burst shows something pretty interesting.

KF6ZEO Horus Binary doppler shift graph

Doppler shift is the relative speed between the transmitter and receiver, and as the payload is free falling down to earth with no air to slow the descent, it got going pretty fast! My mobile station KF6ZEO-H2 measured a 94 Hz Doppler shift, indicating a -65.4 meter/second rate. This is pretty spot on to what the RS41 GPS reported as the -53.9 meters/sec. However, I was about 21 km away from the balloon at 31 km altitude, so the Doppler shift should be less. David WB6TOU's receiver was about 70 km away from the balloon and measured 44 Hz of Doppler shift. The San Diego stations were too far away to show any Doppler shift.

KF6ZEO Horus Binary SNR measurements

Looking at the SNR of the different receivers, I'm surprised at how well David WB6TOU's station performed. The antenna is a standard 1/4 wave ground plane antenna with ~20ft of RG-58 coax, blocked to the south by his roof. It consistently had the highest SNR readings, even higher than the mag-mount on my car.

KF6ZEO Horus Binary Voltage and Temperature graph

The tracker battery voltage and temp plot is pretty standard, getting down to -20 deg Celsius.

The final landing location of the balloon was only ~12 km (~7.5 miles) from the prediction from the previous night.

KF6ZEO Horus Binary Flight Map

LoRa Payload (K6ATV-7)

Walter K6ATV reflew his LoRa PicoTrack, based on an Ebyte E77-400MBL-01 which transmits in the 433 MHz ISM band. For this flight, the transmission period was increased to every 30 seconds.

Telemetry was received by ground stations for most of the ascent, and the highest packet was received just before balloon burst at 31,818 meters. But on the descent, only two packets were received at 19,960 and 19,408 meters (~64k feet). Once the tracker got near the ground (below 1748 meters), telemetry returned but it seemed that some packets were received delayed by several minutes. It's not clear if this telemetry gap is from GPS lock problems, or buffering on the microcontroller.

Telemetry from this tracker can be viewed on the Sondehub amateur grafana dashboard

K6ATV-7 LoRa tracker

APRS Transmitter (K6ATV-11)

Kazu AG6NS provided his Raspberry Pi RP2040 tracker again. While this can do HF WSPR transmissions, this one was programmed for 144.390 MHz APRS. Three Energizer lithium batteries provided the power source. Transmitter power was about 5 mW (+6 dBm).

The Sondehub Amateur grafana dashboard shows all the telemetry recorded from this transmitter.

K6ATV-11 APRS tracker

Once again, this tracker transmitted stale GPS coordinate for the first ~10 minutes (5 packets) after liftoff. Since this problem occurred during the last launch as well, this launch included the raw NMEA frames inside the APRS packet, showing that the negative altitude and stale lat/long was being reported by the GPS receiver. Kazu isn't sure what is actually going on, as the Chinese knock-off GPS receivers work fine the rest of the time.

Meshtastic Units

There were two Meshtastic transceivers in the same insulated lunchbox case. The Rak Wireless Mini with baseboard transmitted location data, using a 1/4 wave ground plane antenna. This antenna probably broke during liftoff, as this antenna was zip-tied to the main flight line. We only got a few packets on the ground from this node.

Meshtastic antenna after landing

The other Mestastic transceiver was a Heltec v3 node, acting as a "router" node to pass messages. It used a patch antenna with modified GPS firmware. Raw packets are here.

The Heltec node also had a RadSens Mini Geiger tube connected to it, using I2C as the interface. Extra insulation (shown in red below) was added to the high voltage terminals on the PCB to reduce the effects of Paschen's Law, where high-voltage arcing occurs at a lower ambient pressure.

Geiger tube after landing

Unfortunately, during the hard landing, the crossband repeater (located in the same insulated lunchbox case) smashed into the Geiger tube and damaged it. The Geiger Tube data is shown below. Due to data transmission problems, all of this data was downloaded from the Heltec memory after balloon recovery.

Radiation monitor results

Crossband Repeater

For this flight, we just decided to use a cheap Wouxum KG-UV9D+ as the cross-band repeater. The uplink frequency was 441.0 MHz PL 162.2, and the downlink was 147.58 MHz. This worked pretty well, as we had good communications throughout most of the flight. Close to the landing location in Patterson, we heard a terrestrial repeater being used on the output 147.58 MHz frequency, which was weird because the NARCC band plans showed that this was not a repeater frequency. Maybe someone was just testing their repeater.

The cross-band repeater was packaged in the same insulated fabric case as the two Meshtastic nodes, and used a flexible twin-lead dual band antenna sticking out the bottom.

GoPro

This time, the GoPro cameras took pretty nice video. This payload was at the very bottom of the train, so there was no string below to focus on.

GoPro looking sideways

This still image is from near the peak of the flight before balloon burst, you can clearly see the Highway 5 dividing line between the hills and the fields of the Central Valley. The town of Patterson (and final landing location) is at the very bottom right corner of this image.

GoPro looking down

Noisebridge Balloon

The folks at the San Francisco hackerspace Noisebridge also planned on launching at the same time, to do some Meshtastic balloon-to-balloon communications experiments. They wanted help tracking their balloon during flight, so Elan KC3ZFN and I programmed up a Vaisala RS41 radiosonde and got their Horusdemodlib station working.

The RS41ng and horusdemodlib projects have several different methods for flying muliple trackers at the same time:

  • Flying the trackers on different frequencies allows "continuous" transmission on each frequency. However, the receiver configuration is slightly more complicated, using either a multi-RX horusdemod script or different physical RTL-SDR dongles.

  • RS41ng allows a rough time-division multiple access scheme with #define HORUS_V2_TIME_SYNC_SECONDS and #define HORUS_V2_TIME_SYNC_OFFSET_SECONDS. The time sync period and offset can be set differently for each transmitter, allowing both to use the same frequency without jamming eachother

We ended up deciding on the TDMA scheme. The SF-HAB balloon would transmit at 0, 15, 30, and 45 seconds after the minute, and the Noisebridge balloon would transmit at 7, 22, 37, and 52 seconds after each minute. Each Horus Binary packet is approximately 4 seconds long, so we could tighten the repeat period up to 10 seconds and still probably be fine. This might be an option for future launches. Using this TDMA method meant that all of the existing receive stations didn't need any changes or reconfiguration.

The reprogrammed RS41ng tracker was kept in the stock Styrofoam case. Additionally, the Noisebridge team built a larger Styrofoam case for the Meshtastic and other payloads, but software and hardware issues prevented them from flying this larger payload. Next time.

Noisebridge balloon payload package

Noisebridge Balloon Launch

While they had targeted launching the balloon around 10am local time (1900 UTC), the Noisebridge team had several delays. The Meshtastic node was programmed wrong, and their other larger payload had electrical issues. Several trips were made from the launch site back to the Noisebridge hackerspace. The team hauled the hydrogen tank up to the top of Bernal Hill in downtown San Francisco and filled the balloon in the strong winds. In the end, launch time was 4pm local time (2300 UTC), after the SF-HAB recovery teams had arrived back at home.

Here are several still images from the launch video, taken by the Noisebridge team. The only payloads that were actually launched were the reprogrammed RS41 Horus Binary tracker and a Meshtastic node in a small cloth bag.

Noisebridge launch video still image

Noisebridge launch video still image

Noisebridge launch video still image

As one can see from the third image from the launch, taken about 15 seconds after release, the balloon is not really rising. And in the earlier video grabs, one can see that the latex balloon isn't fully inflated, it looks more like a superpressure balloon on the ground.

Noisebridge Balloon Flight Results (KC3ZFN)

Immediately after launch, it was apparent that something was wrong with balloon ascent rate. It appeared to be slowly descending, and only started rising about 20 seconds after release. Telemetry confirms that the balloon didn't start ascending until ~30 seconds after launch. This was probably due to the wind flowing over the top of Bernal Hill and pulling the balloon down on the backside.

The Sondehub Amateur grafana dashboard shows the telemetry for this flight. Click and drag on the dashboard to highlight to zoom.

KC3ZFN Horus Binary

Looking at the altitude, ascent and descent rates, we see that the launch ascent rate was only ~0.5 meters/second, until the balloon reached about 5,500 meters (~18,000 ft). At that point, the ascent rate started decreasing into negative territory, signaling that the balloon was slowly falling. This can only happen when there is a small leak in the balloon. Max altitude of the balloon was 6,036 meters (19,800 feet).

KC3ZFN Horus Binary Receive packet count

The Horus Binary receive network set up by the SF-HAB group worked very well for the Noisebridge flight. A total of 763 packets were transmitted by the balloon during the flight, and the ground station network received 665 packets (87%). 84 of these missing packets were in the last 30 minutes of flight, where the WB6TOU receive station was blocked by trees and a roof. Most packets were received by multiple stations, leading to the 1083 total packets received. Based on the slow ascent rate and late launch time, the Noisebridge team decided not to chase the balloon.

KC3ZFN Horus Binary TX frequency

Again, the Receiver-Reported TX frequency graph is actually a pretty good graph of when each of the receive stations was able to hear the balloon. My home station KF6ZEO-H2 was able to hear the balloon about 10 minutes before release, as I have pretty good line-of-sight with Bernal Hill. When the balloon passed directly over downtown San Francisco at ~1,500 meters altitude (~5,000 feet), Martin W6MRR's station in Berkeley started receiving it, with solid copy until the East Bay hills blocked his view. David WB6TOU started receiving it when it passed over the East Bay hills, and had good reception in the Central Valley until the last packet in Elk Grove.

The last packet received from the balloon was at 7:20pm local time (0220 UTC) at 1,766 meters (~5,800 ft) above Elk Grove, approximately 10 miles south of Sacramento.

KC3ZFN Horus Binary

So what caused this small leak in the latex balloon? Usually it's problems sealing the balloon neck after filling, but closer inspection of the first 9 frames of the video posted above may show the cause.

During release, the latex balloon rubbed up against the releasing person's backpack, and maybe even snagged on a zipper or backpack hook. Frames 1 thru 3 show the balloon underneath the backpack, and frames 4 and 5 show the balloon rubbing up against the bottom of the backpack, and maybe snagging on the backpack. The latex deformation is still apparent in the last frame 9. The neck of the balloon is not visible.

KC3ZFN balloon release pinhole leak snag

This is only a theory though, as this video only shows the last few seconds before release. The balloon could have already had a small pinhole or tear from the factory (unlikely), or the hole could have happened during filling. Once the altitude got high enough and the latex envelope started expanding, it would have stretched the hole open even more, allowing more hydrogen to escape. Eventually, enough hydrogen escapes and the ascent rate turns negative. The balloon filling and release team should wear latex gloves, and launching from a non-windy location would have prevented the balloon from rubbing against the backpack.

Lessons Learned

Looking at the list of Lessons Learned from Launch 4, we did a pretty good job of correcting all the past problems:

  • 😐 Shorten pre-launch setup: Martin and I arrived 30 minutes before the team to setup and chitchat, and we used all of that time effectively. Most of the team was only at the launch site for 30 minutes.
  • ✅ Shorten balloon filling time: We shaved a few minutes off of the filling and launch time.
  • ✅ Verify Sondehub burst calculator inputs: I spent a lot of time the night before going through the various ascent profiles, and verifying that the numbers were correct. This helped us really nail down the required neck lift.
  • ✅ Launch site cleanup: This time we had the hydrogen regulator off and tank capped before balloon release. The rest of the site cleanup was only a minute or two.
  • ✅ Expand Horus receive network in Central Valley: Martin W6MRR and David WB6TOU added Horus Binary receiving stations at their homes.
  • ✅ Cross-band repeater electronics and antenna upgrade: We used a commercial unit that worked really well.
  • ✅ Camera focus: No strings in the way.
  • 😐 Backup frequencies: Using the simplex frequency 446.5 MHz worked pretty well, but a high-level UHF repeater would have been better to keep us all in contact with each other. Luckily, the crossband repeater on the balloon worked well and we didn't need to really use the back frequencies, except before launch and at the landing site.
  • ✅ Discord voice channel: While I didn't join the Discord voice chat, several people were on it during the chase, and the livestream also happened.

For this launch, we had several new lessons learned:

  • Predictions should use a final (sea level) descent rate 10 meter/sec, not the default 5 meters/sec on Sondehub. The three previous balloons came down quickly.
  • The team needs at least 45 minutes to set up train, even if all the payloads are working. This is just time to power all electronics on, verify they are working, and tie everything together. Maybe increase this to 1 hr, including margin?
  • A longer train didn't help with keeping the latex balloon from tangling up with all the payloads after burst. The parachute didn't get tangled up this time, but most of the latex balloon was recovered, which added weight and increased the descent rate.
  • At the launch site, we needed more tools (sharp knife, scissors) to cut the strings and assemble the train.
  • If there is a drone at the launch site, we should take a video of the entire train after release to verify that all the antennas are still attached and functional. Also, take some glamour shots of the balloon before launch.
  • Don't use 1/4 wave ground plane antennas, or any other spiky antennas, for any payloads. Elements always shear off at some point in the flight.
  • At the landing site, we needed a leatherman or pliers to disassemble the RS41 cases and turn off the various transmitters. Sharp scissors or a knife would have been helpful to separate the payloads.
  • Provide better Horus Binary reception near the landing zone. Car stations are great, but 50% of the car receivers for this launch didn't work. Permanent stations can be tested beforehand.
  • Put more separation between the payloads and latex balloon, to prevent tangling of the latex around the payloads after burst.
  • Each payload should have it's own case and spot on the flight train. This keeps damage to a minimum during landing.

links