Stratopie – Mit dem RPi in die Stratosphäre

"Kurze Rede langer Sinn" – Wir haben uns vorgenommen einen RPi mithilfe eines Wetterballons in die Stratosphäre zu schicken …YAY!

Um das Ganze erst einmal technisch umzusetzen, habe ich mir nach entsprechender Planung folgende Komponenten besorgt:

  • RPi 2 Modell B
  • 64GB SD-Karte
  • Logitech C920 Webcam
  • ZTE USB-Stick
  • GPS NEO-6M(B)-Modul
  • 1-wire Temperatursensor DS1820
  • 4.7kΩ Pullup-Widerstand für DS1820
  • Anker PowerCore 10000mAh

Der RPi soll das Herzstück bilden. Er ist dann für die Kamerasteuerung, Verarbeitung der Sensoren sowie den Versand der Daten an den Server zuständig.

Die Powerbank soll den RPi während des gesamten Fluges mit Strom versorgen. Da in der Stratosphäre Temperaturen bis -60 Grad herrschen, habe ich bei der Auswahl der Powerbank darauf geachtet, dass diese leicht und robust ist - nach Hersteller sogar bis -40 Grad.

Aufbau & Verkabelung

Das GPS-Modul habe ich wie folgt angeschlossen:

  • PIN VCC 3,3V -> PIN 1 (3.3V)
  • PIN GND -> PIN 6 (GND)
  • PIN RX -> PIN 8 (TXD0)
  • PIN TX -> PIN 10 (RXD0)
  • PIN PPS -> PIN 12 (GPIO18)

Sowie den 1-Wire Temperatursensor:

  • PIN 1 (GND) -> PIN 9 (GND)
  • PIN 2 (DQ) -> PIN 7 (GPIO4)
  • PIN 3 (VDD) -> PIN 17 (3.3V)
  • Den Pullup-Widerstand habe ich mithilfe einer Lochrasterplatine zwischen DQ und VDD gelötet.

Nach dem Verkabeln, habe ich den RPi installiert. Als Betriebssystem habe ich Raspbian Jessi Lite gewählt.
Der UMTS-Stick, sowie die Webcam werden über die USB-Ports versorgt.

Webcam (C920)

Für die Steuerung der Webcam habe ich mich für MotionEye entschieden. Die Installation habe ich entsprechend der folgenden Anleitung durchgeführt.

Eingestellt habe ich die Kamera auf 2 Bilder pro Sekunde, bei einer Auflösung von 2304x1536.

UMTS-Stick (ZTE MF110)

Um den Ballon nach der Landung zu orten, sollen die Daten über das Mobilfunknetz und entsprechender Webschnittstelle an meinen Server übertragen werden.

Nach der Umkonfiguration des Sticks und diversen Einwahlparametern mit wvdial, war die Verbindung zum Internet gegeben.

GPS-Modul (NEO-6M)

Die GPS-Daten sollen zum einen während des gesamten Fluges aufgezeichnet werden und zudem zum Auffinden des Ballons dienen.

Nach dem Verkabeln des Moduls, sowie der Installation der zugehörigen Pakete, konnte ich die GPS-Daten einsehen.

Um die JSON-GPS-Daten, die über gpspipe ausgegeben werden zu verarbeiten, hatte ich mir JQ kompiliert.

Mithilfe meines Shell-Scripts, habe ich die Möglichkeit, relevante Daten in Variablen zu packen und an meinem Webserver via HTTPS-Request zu versenden.

Ein kleiner Auszug aus dem Script:

# Hole GPS-Daten max 10s
gpsdata=$(timeout 10 gpspipe -w | grep -m 1 lat | jq '.' )

# Check
if [ -n "${gpsdata}" ]; then

 # Parse
 parse_climb=$(echo "$gpsdata" | jq -r '.climb')
 parse_speed=$(echo "$gpsdata" | jq -r '.speed')
 parse_alt=$(echo "$gpsdata" | jq -r '.alt')
 parse_lat=$(echo "$gpsdata" | jq -r '.lat')
 parse_lon=$(echo "$gpsdata" | jq -r '.lon')

 # Final link
 link="http://domain.de/transfer.php?climb=${parse_climb}&speed=${parse_speed}&alt=${parse_alt}&class=${parse_class}&lat=${parse_lat}&lon=${parse_lon}"
 
 # Web transfer
 curl "$link" --connect-timeout 30 -m 50
fi

Dieses Script schaut dann jede Minute für 10 Sekunden auf den gpsstream und schickt die Daten an den Server. Dieses habe ich über Cron geschedult:

* * * * * /root/scripte/gps_logger.sh

Temperatursensor (DS1820)

Die Temperaturdaten, sollen genau wie die GPS-Daten, während des gesamten Fluges aufgezeichnet werden.

Um den Sensor überhaupt ansprechen zu können, musste ich zuerst das 1Wire-Modul laden.

Für das Auslesen der Temperaturwerte, habe ich mir ein Python-Script erstellt und in mein "Logger-Script" eingebaut.

Das Script zum Auslesen der aktuellen Temperatur sieht wie folgt aus:

# 1-wire Slave extrahieren
file = open('/sys/bus/w1/devices/28-000005d40823/w1_slave')
filecontent = file.read()
file.close()
# Temperaturwerte auslesen und konvertieren
stringvalue = filecontent.split("\n")[1].split(" ")[9]
temperature = float(stringvalue[2:]) / 1000
# Temperatur ausgeben 
print('%.2f' % temperature)

Damit kann ich jetzt auch zusätzlich die Temperaturdaten über die Webschnittstelle übertragen.

Ausfallsicherheit

Bezüglich der Ausfallsicherheit habe ich mir noch weitere Scripte eingebaut.

Zum einen ein Ausfallschutz. Ist das Netzwerk für 180 Minuten nicht mehr erreichbar, wird der RPi neu gestartet:

# Deklaration
Log_path='/root/scripte/logs/network_log.log'

# Check File
if [ ! -e "$Log_path" ]; then
 touch "$Log_path"
fi

# Check Ping
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
 echo $(date) >> "$Log_path"
else
 echo "IPv4 is down"
fi

# Uptime 30 min + Datei älter als 180 Minuten > reboot
upSeconds="$(cat /proc/uptime | grep -o '^[0-9]\+')"
upMins=$((${upSeconds} / 60))

if [ "${upMins}" -gt "30" ]; then
 /usr/bin/find $Log_path -mmin +180 -exec /sbin/shutdown -r now \;
fi

Des Weiteren werden Logs und das letzte Bild der Webcam im Intervall via Curl auf einen FTP-Server hochgeladen.

Zudem wird wvdial alle 15 Minuten aufgerufen, falls dieser nicht mehr laufen sollte.

Die Crontab sieht aktuell wie folgt aus:

@reboot sleep 30 && /sbin/ifup ppp0
* * * * * /root/scripte/gps_logger.sh
*/5 * * * * /root/scripte/network_check.sh
*/10 * * * * /root/scripte/ftp_upload.sh
*/15 * * * * wvdial

Gehäuse

Für das Gehäuse haben wir zwei Styroporplatten sowie etwas Balsaholz verwendet. Als kleinen Zusatz noch mit Action-Cam. Hier einmal das Innenleben:

Fallschirm und Ballon

Den Fallschirm sowie den Ballon haben wir bei Stratoflights gekauft. Im Detail den Wetterballon 1600 und Fallschirm 2500.

Da wir nur eine Nutzlast von ca. 850g haben, war dies mehr als ausreichend.

Befestig haben wir die Komponenten dann wie folgt:

Der Ballon wird zwischen Fallschirm und Ballon mit 5 m Schnur verbunden.

Zwischen Fallschirm und "Box" mit 10 m.

Ballongas

Um die gewünschte Höhe von 35 km zu erreichen, haben wir eine Flasche Ballongas gekauft, da dieses um einiges weniger kostet als Helium und wir damit den gleichen Effekt erzielen.

Die Flasche hat 20 l Inhalt, was ca. 3.600 Gasliter bei 200 bar entspricht. Den Ballon haben wir später mit der kompletten Flasche gefüllt.

Start / Vorbereitung (06.08.2017)

Begonnen haben wir mit dem ausrollen und befüllen des Wetterballons.

Da wir genügend Helfer hatten, konnte ich während des Befüllens den RPi starten und die Technik auf Funktion prüfen.

Um den Ballon luftdicht zu verschließen, haben wir Kabelbinder verwendet. Die Schnur wurde mit am Kabelbinder befestigt:

Im Anschluss wurde die Box entsprechend geschlossen und es konnte endlich losgehen:

Abflug (12:18)

Nach dem Start habe ich noch bis zu 7 km Daten über UMTS empfangen. Dies waren Flugdaten (Temperatur und Höhe) sowie Bilder.

Leider konnte das GPS-Modul nur bis 12 km Messen, sodass uns ab dieser Grenze keine Höhendaten mehr zur Verfügung standen.

Wir hatten eine Aufstiegsgeschwindigkeit von ca. 4 m/s.

Zeit Höhe
12:18 - 760 m
12:20 - 1107 m
12:25 - 2182 m
12:30 - 3347 m
12:35 - 4577 m
12:40 - 6031 m
12:45 - 7629 m
12:50 - 9334 m
12:55 - 11116 m
13:00 - 12063 m

Das waren die ersten Livebilder vom Ballon, kurz nach Abflug:

12:20Uhr

12:30 Uhr

12:40 Uhr

Landung (15:30)

Das erste Signal haben wir um 15:08 Uhr in 4 km Höhe empfangen. Die Geschwindigkeit mit geöffnetem Fallschirm betrug ca. 3,5 m/s. Die Landung erfolgte nach Auswertung der Daten wie folgt:

Zeit Höhe
14:41 - 11919 m
14:45 - 10605 m
14:55 - 7829 m
15:05 - 5394 m
15:15 - 3306 m
15:25 - 1542 m
15:30 - 395 m

Die Livebilder wärend der Landung:

15:10 Uhr

15:20 Uhr

15:30 Uhr

15:40 Uhr

Temperaturverlauf

Die niedrigsten Temperaturen von weniger als -40 °C, haben wir jeweils auf ca. 12 km Höhe beim Auf- sowie Abstieg erreicht:

Gesamthöhe

Da das GPS-Modul nur eine Höhe von maximal 12 km messen konnte, haben wir die Gesamthöhe mithilfe der gesammelten Daten berechnet:

Hier kommen wir auf eine Gesamthöhe von 36031 m bei einer Flugzeit von 97 min nach Start.

Facts

  • Der Ballon hat eine Strecke von insgesamt 160 km zurückgelegt
  • Der höchste Punkt von 36 km wurde nach 97 min erreicht
  • Der Ballon war 191 min unterwegs
  • Die niedrigste Temperatur betrug -47,25 °C
  • Es wurden 49,2 GB Bild- und Videomaterial erzeugt
  • Es wurden 360 Datensätze mitgeschrieben
  • Die Gesamtkosten belaufen sich auf ca. 600 €

Videoausschnitt auf ca. 36 km Höhe

Posted in Raspberry Pi and tagged , , , .