Connected Star Tracker

Connected Star Tracker

An improved version of the initial star tracker I built with smartphone control over wifi using an ESP32 and Rust.

EngineeringEmbedded RustIoTESP32
10 min read

Ausgangslage

In der Astrofotografie stellt die Erdrotation eine grosse Herausforderung dar. Damit Himmelsobjekte mit langer Belichtungszeit fotografiert werden können, wird ein ''Star Tracker'' benötigt, der die Erdrotation ausgleicht und das gewünschte Objekt nachführt. Professionelle Star Tracker sind oft teuer, deshalb habe ich vor einiger Zeit selbst einen ''Barn Door Tracker'' konstruiert und gebaut, der auf Polaris ausgerichtet wird und dadurch ebenfalls die Erdrotation für Fotos kompensiert.

Erste Version des Trackers
Erste Version des Trackers
Aufgenommenes Bild: M31
Aufgenommenes Bild: M31
Aufgenommenes Bild: M101
Aufgenommenes Bild: M101

Wie in den Bildern ersichtlich ist, funktioniert der Tracker grundsätzlich, jedoch gibt es einige Probleme, Unschönheiten und Schwierigkeiten bei der Benutzung unterwegs:

  • Die Bedienung erfolgt über einen einzigen Knopf, was sich unterwegs als umständlich erwiesen hat. Teilweise müssen Einstellungen/Ausrichtung verändert werden und der Tracker herauf- oder heruntergelassen werden, oder das Tracking muss gestartet und gestoppt werden, etc.
  • Die Elektronik wurde nicht sauber verbaut. Die Komponenten wurden auf ein Prototype-Board gelötet und die Angst bezüglich eines Kurzschlusses ist da. Bereits in der Bauphase gab es einen solchen und die Komponenten mussten ausgetauscht werden.
  • Der Tracker benötigt zwei Spannungsquellen (eine für das Devboard und eine für den Schrittmotor).
  • Die Software wurde kurzerhand mit der Arduino-Library geschrieben und ist nicht wirklich robust. Auch der Tracking-Algorithmus beachtet streng genommen nicht die mechanische Konstruktion und kompensiert deshalb die Erdrotation ungenau.

Ziele des Projektes

Entsprechend dieser Problemstellung ist das Ziel dieses Projektes, die Überarbeitung des Star Trackers sowohl elektronisch als auch softwaretechnisch. Konkret:

  • Die Bedienung soll über das Smartphone erfolgen. Konkret soll der Tracker ein WLAN-Netzwerk bereitstellen, und das System soll über den Browser gesteuert werden können. Der aktuelle Zustand soll jederzeit ersichtlich sein und verändert werden können.
  • Die Elektronik soll (wenn möglich) sauber untergebracht werden. Die Idee ist, die Komponenten auf einer eigenen Leiterplatte (PCB) unterzubringen. Zudem soll der ganze Tracker nur mit einer Spannungsquelle betrieben werden können, was den Transport und das Setup erleichtert.
  • Die Software soll komplett neu und modular aufgebaut und Tracking-Algorithmen verbessert werden. Anlässlich eines besuchten Moduls an der BFH soll sie in Rust (ESP-IDF Rust) geschrieben werden.
  • Bei der Elektronik soll neu au ch eine Schnittstelle für allfällige (optionale) Sensoren integriert werden (über I2C), damit bspw. Ausrichtung des Trackers oder der Kamera gemessen werden kann. Zudem soll neu der Auslöser der Kamera direkt über den Tracker (bzw. das Smartphone) gesteuert werden können.

Aufbau

Das System ist wie folgt aufgebaut:

Geplanter Systemaufbau

Die Steuerung erfolgt über den Browser am Smartphone. Die Webapp wird von einem ESP32-C3 Supermini über einen HTTP-Server zur Verfügung gestellt. Die Kommunikation erfolgt nach dem Verbindungsaufbau in Echtzeit und asynchron über ein eigenes Websocket-Protokoll. Der ESP steuert anschliessend den Schrittmotor über einen TMC2208 Stepper Motor Driver. Dieses Modell wurde gewählt, da dadurch der Schrittmotor besonders leise ist und so gut wie keine Vibrationen auslöst. Des Weiteren steuert der ESP über einen Optokoppler und einen 2.5mm Klinkenstecker den Auslöser der Kamera. Es wird zudem ein Limit-Switch an den ESP angeschlossen, damit der Tracker sich kalibrieren kann und merkt, wann die beiden Holzplatten aufeinandertreffen. Schliesslich wird noch eine I2C Schnittstelle zur Verfügung gestellt (über einen XH2.54 Stecker) damit in Zukunft weitere nützliche Sensoren angeschlossen werden können.

Konzeption und Umsetzung

Prototyping und erster Aufbau

Um die technische Machbarkeit zu überprüfen, wurden in einem ersten Schritt sämtliche Komponenten zunächst auf einem Breadboard zusammengesetzt. Folgende Komponenten kamen zum Einsatz:

  • ESP32-C3 SuperMini: Dev-Board als zentrale Steuereinheit
  • TMC2208 Stepper Motor Driver: Leiser Schrittmotortreiber zur Steuerung des Schrittmotors
  • NEMA 17 Schrittmotor: Mechanischer Antrieb für den Tracker
  • Optokoppler: Elektrische Entkopplung für den Kameraauslöser
  • Schottky-Diode: Verpolungsschutz für die Stromversorgung
  • Variabler DC/DC Step-Down-Wandler: Anpassung der Batteriespannung auf die 5V-Versorgung für den ESP32
  • Limit-Switch: Schalter für die Kalibrierung des Trackers
  • XH2.54-Anschlüsse: Anschlüsse für Limit-Switch, Klinkenstecker der Kamera, weitere I2C Sensoren und Stepper

Schaltung auf dem Breadboard

Vom Breadboard zur eigenen Leiterplatte (PCB)

Nachdem das System auf dem Breadboard stabil funktionierte, wurde die gesamte Schaltung als PCB in ''EasyEDA'' ausgelegt und bei JLCPCB gefertigt.

Folgende Abbildung zeigt das Schema der Leiterplatte:

Schema der PCB-Leiterplatte

Bereits nach einer Woche kam ich die bestückbare Platine an und es konnten sämtliche Bauteile eingelötet und getestet werden. Der Umstieg vom Breadboard auf das PCB verlief erstaunlich reibungslos. Ein erster Test zeigte, dass der Schrittmotor mit der Schaltung des PCBs funktionierte:

Erster Test mit dem neuen PCB

Rückblickend wäre die Verbesserung von kleineren Aspekten im Design notwendig:

  • Eine Möglichkeit den Motortreiber über den ESP zu resetten mit dem Enable-Pin
  • Korrekter Anschluss für die Batterie: XT-60 statt XT-30
  • Möglicherweise das Auslesen des Diagnosepins vom Motortreiber über den ESP

Diese Änderungen würden Änderungen an dem Design der Leiterplatte benötigen und sind daher nur durch Bestellen einer neuen Leiterplatte möglich.

Wahl der Stromversorgung

Eine besondere Herausforderung stellte die richtige Auswahl der Stromquelle dar. Der Schrittmotortreiber benötigt rund 5V bis 36V, der ESP32 hingegen darf mit maximal 5V betrieben werden. Daher wurde ein DC-DC Step-Down-Wandler zwischen Batterie und ESP eingebaut.

Spannungseinstellung des DC-DC-Wandlers

Verschiedene Tests mit 24V (6S) und 12V (3S) LiPo-Batterien zeigten, dass nicht jede Kombination stabil funktioniert. Der Motortreiber schien beim Einschalten zu viel Strom zieht zu ziehen. Der Treiber zeigte über den Diagnose-Pin unmittelbar einen Fehler und schaltete sich aus. Bei der 6S Batterie war dies oft der Fall. Mit einer 3S Batterie funktionierte es zuverlässiger, wenn auch nicht immer. Möglicherweise müsste zwischen Stromversorgung und Treiber einen grösserer Kondensator oder einen anderen Schutzmechanismus eingebaut werden. Rückblickend wäre es gut gewesen, wenn man bei der PCB-Gestaltung den Motortreiber über den ESP resetten bzw. ein- und ausschalten hätte können.

Erster Test mit einer 3S LIPO Batterie

Software

Die gesamte Logik wird auf dem ESP32-C3 unter Verwendung von ESP-IDF und Rust ausgeführt. Das System stellt ein eigenes WLAN bereit und hostet eine Webanwendung, die direkt über den Browser eines Smartphones bedient werden kann. Die Kommunikation zwischen Smartphone und Tracker erfolgt bidirektional und in Echtzeit über ein eigenes Web-Socket-Protokoll. Das Frontend zeigt den aktuellen Zustand des Trackers an und ermöglicht das Starten und Stoppen des Trackings, das Verstellen der Höhe, das Auslösen der Kamera sowie das Einrichten eines Intervallometers. Besonderer Fokus wurde darauf gelegt, den Nachführalgorithmus speziell auf die Mechanik des Trackers abzustimmen, um eine möglichst präzise Kompensation der Erdrotation zu erreichen. Die vollständige Software ist unter https://github.com/yannherren/stellavue zu finden.

Komponentenübersicht

  • src/stepper/mod.rs: Steuert den Schrittmotor über einen TMC2208-Treiber, inklusive Kalibrierung, Tracking und Geschwindigkeitsregelung
  • src/camera/mod.rs: Steuert den Kameraauslöser und unterstützt Einzel- sowie Intervallaufnahmen
  • src/system/system_state.rs, src/system/system_event.rs: Zentrale Verwaltung der Systemzustände und Ereignisse (z.B. Tracking, Kalibrierung, Bewegung, Idle)
  • src/wifi/mod.rs: Initialisiert und konfiguriert das WLAN als Access Point
  • src/web/server.rs: Stellt eine HTTP- und Web-Socket-Schnittstelle bereit, über die Kommandos empfangen und Statusinformationen gesendet werden
  • src/web/protocol.rs: Definiert das binäre Protokoll für die Kommunikation zwischen Webanwendung und Firmware
  • src/stepper/rotation_state.rs, src/stepper/rotation_speeds.json: Speichert den Rotationszustand und liest JSON-Konfigurationsdatei mit Geschwindigkeitsprofilen für die Nachführung, generiert durch das Python-Tool
  • src/web/webapp/index.html, src/web/webapp/index.js, src/web/webapp/stylesheet.css: Benutzeroberfläche der Webapp zur Steuerung und Statusanzeige, läuft im Browser des Smartphones
  • util/stepper_rotation_speed.py: Skript zur Berechnung und Generierung der Geschwindigkeitsprofile

Software-Architektur des Projekts

Algorithmus zur Rotationsberechnung und Konfigurationsgenerierung

Die Berechnung der Rotationsprofile für die Nachführung erfolgt durch ein separates Python-Skript (stepper_rotation_speed.py). Dieses Skript berechnet für verschiedene Höhenwinkel (α) die jeweils erforderliche Anzahl an Motorumdrehungen und die dazugehörigen Schrittgeschwindigkeiten, um die Erdrotation möglichst präzise zu kompensieren.

Der Algorithmus geht dabei wie folgt vor:

  • Für jeden gewünschten Winkel im Bereich von 0 bis 60 Grad wird die notwendige Hubhöhe der Mechanik mittels trigonometrischer Beziehungen berechnet
  • Aus der resultierenden Hubhöhe wird die Anzahl der benötigten Umdrehungen des Spindelantriebs bestimmt (unter Berücksichtigung der Steigung der Spindel)
  • Die Schrittanzahl pro Umdrehung und die Zeit pro Grad werden genutzt, um die erforderliche Schrittgeschwindigkeit (in Schritten pro Sekunde) zu berechnen
  • Für jeden Winkel, bei dem sich die Geschwindigkeit ändert, wird ein Eintrag mit Winkel, Umdrehungen, Offset und Schrittgeschwindigkeit erzeugt
  • Die so erzeugte Konfiguration wird als JSON-Datei gespeichert und von der Software zur Laufzeit eingelesen

Durch diese Vorgehensweise kann die Software für jeden beliebigen Höhenwinkel die optimale Geschwindigkeit für den Schrittmotor auswählen und so eine gleichmässige und präzise Nachführung gewährleisten. Die Auslagerung der Berechnung in ein Python-Skript ermöglicht eine einfache Anpassung an verschiedene mechanische Parameter, ohne die Software selbst ändern zu müssen.

Web-Socket-Protokoll

Die Kommunikation zwischen Webanwendung und Software erfolgt über ein binäres Web-Socket-Protokoll. Kommandos und Statusmeldungen werden jeweils als 4-Byte-Nachrichten übertragen, wobei die unteren Bits die Art der Aktion bzw. des Ereignisses kodieren und die oberen Bits die zugehörigen Parameter enthalten.

  • Kommandos: Starten/Kalibrieren, konstante Bewegung, Tracking aktivieren/deaktivieren, Status abfragen, Kamera auslösen, Intervallaufnahme starten/stoppen
  • Antworten: Bestätigung von Bewegungen, Statusänderungen, Kalibrierung, Bildaufnahme, Tracking, Intervallaufnahme und Systemzustand

Eine vollständige Beschreibung der Kommandos und Antworttypen findet sich im Readme im Projekt unter: https://github.com/yannherren/stellavue/blob/master/docs/PROTOCOL.md

Mechanik und Gehäusefertigung

Nachdem die Elektronik funktionierte, wurde ein passendes Gehäuse entworfen und gefertigt. Auf Basis der exakten Masse der PCB-Leiterplatte wurde das Design in der Software Fusion 360 entworfen. Das Gehäuse besteht aus zwei Teilen: einer Bodenplatte zur Montage auf der unteren Holzplatte sowie einem Deckel zum Anschrauben. Die notwendigen Bohrungen für Stecker und Bedienelemente wurden ebenfalls berücksichtigt. Anschliessend wurden die Teile mit kleineren Anpassungen mehrmals 3D gedruckt und schliesslich montiert.

Erste Version des Trackers
Gehäuseplan
Aufgenommenes Bild: M31
Fertiges Gehäuse

Feldtest und Praxiserfahrung

Schliesslich folgte der praktische Test. Nach der vollständigen Integration folgte der praktische Test: In einer klaren Nacht konnte der Tracker in Feldbedingungen mit Kamera aufgebaut und gestartet werden.

Bereits ein Einzelbild mit Sekunden Belichtungszeit zeigte punktförmige Sterne ohne Verzerrungen. Durch die Aufnahme und Kombination von rund 170 solcher Einzelbilder (auch bekannt als ''Stacking'') und entsprechend einer Integrationszeit von etwa einer Stunde war die Galaxie M101 auf dem Bild klar sichtbar:

Erster Feldtest
Erster Feldtest
Aufgenommenes Bild, auf dem die Galaxie M101 zu sehen ist
Aufgenommenes Bild auf dem die Galaxie M101 zu sehen ist

Die Bedienung per Webapp war dabei ein grosser Vorteil. Testaufnahmen, Starten/Stoppen des Trackings sowie das Auslösen von Aufnahmeserien konnten komfortabel direkt am Smartphone durchgeführt und jederzeit angepasst werden. Der Feldtest bestätigte, dass alle Schwachstellen des alten Systems (Bedienkomfort, Zuverlässigkeit, Stromversorgung, Softwarestabilität) erfolgreich gelöst werden konnten. Die Nachführung mit dem neuen Algorithmus arbeitete präzise. Allerdings zeigte sich, dass nun eher das Stativ oder die Kameramontage als limitierende Faktoren auftraten. Bei Wind begann der Aufbau leicht zu schwanken, was die maximal mögliche Belichtungszeit reduzierte und einige Bilder verwackelt waren. Die Ausrichtung der Kamera am Stativkopf ist zudem eine Schwachstelle. Es ist sehr schwierig die Kamera präzise zu den kleinen Himmelsobjekten auszurichten, da keine Feinjustierungen mit dem Stativkopf möglich sin.

Fazit und Ausblick

Zusammenfassend funktioniert der neue Star Tracker zuverlässig und ist in der Bedienung ein enormer Fortschritt zur alten Version. Die Kombination aus Hardware, individueller PCB-Leiterplatte, zentraler Steuerung per Smartphone und verbessertem Tracking-Algorithmus macht das Gerät gut geeignet für die Astrofotografie. Es hat sich gezeigt, dass die grössten Schwachstellen nun ausserhalb des Trackers selbst liegen (Stativ, Montage).

In Zukunft könnte der Tracker mit zusätzlichen Sensoren wie Kameraausrichtung, Trackerausrichtung etc. erweitert werden. Dies würde die Bedienung und präzision noch weiter vereinfachen

Firmware auf Github ansehen