skywatcher – Sky-Watcher Montierungs-Steuerung
Zusammenfassung
skywatcher ist eine C-Bibliothek zur Steuerung von Sky-Watcher
GoTo-Montierungen über das Sky-Watcher Motor-Controller-Protokoll
(TCP/UDP, Standard-Port 11880). Die Montierung wird automatisch per
UDP-Broadcast-Discovery im lokalen Netz gefunden – keine hartkodierte
IP-Adresse nötig. Umfang: Initialisierung, Kalibrierung, Positionierung,
Goto, Tracking und Geschwindigkeitssteuerung für beide Achsen.
Konzept
Das Protokoll ist ein zeilenbasiertes Telegramm-Format: Jeder Befehl
beginnt mit : und endet mit CR (\r). Empfangene Werte sind
hexadezimal kodiert (6 Stellen) und um einen Positions-Offset verschoben.
Alle Aktionen laufen über eine gemeinsame kritische Sektion
(threading), da die Kommunikation über einen einzigen Socket verläuft.
Ein Hintergrund-Thread kann pro Achse den Achsenzustand monitoren.
Discovery: Die Montierung ist ein Server; der Client sendet per
UDP-Broadcast das Telegramm : an 255.255.255.255:11880. Geräte, die
auf diesem Port lauschen (praktisch nur die Montierung), antworten mit
ihrer IP. Die eigene IP wird dabei ignoriert (socket_get_own_ip).
API (Kern)
bool skywatcher_open(const char* ip); /* Verbindung */
void skywatcher_close();
bool skywatcher_discover(char* ip, size_t ip_size); /* Auto-Erkennung */
bool skywatcher_initialize_axis();
bool skywatcher_get_axis_status(enum skywatcher_axis axis, skywatcher_axis_status_t status);
bool skywatcher_get_position(enum skywatcher_axis axis, int32_t* position);
bool skywatcher_set_position(enum skywatcher_axis axis, int32_t position);
bool skywatcher_get_axis_position(enum skywatcher_axis axis, int32_t* position);
bool skywatcher_set_goto_target(enum skywatcher_axis axis, int32_t target);
bool skywatcher_get_goto_target(enum skywatcher_axis axis, int32_t* target);
void skywatcher_goto_deg(enum skywatcher_axis axis, double degree);
void skywatcher_goto_home(enum skywatcher_axis axis, bool instant_stop);
bool skywatcher_get_speed(enum skywatcher_axis axis, double* angular_speed_degrees_per_s);
bool skywatcher_set_ra_siderial_speed();
bool skywatcher_set_axis_speed_and_start(double w_deg_per_s, enum skywatcher_axis axis);
bool skywatcher_start_motion(enum skywatcher_axis axis);
bool skywatcher_stop_motion(enum skywatcher_axis axis);
bool skywatcher_instant_stop(enum skywatcher_axis axis);
bool skywatcher_set_axis_sleep(enum skywatcher_axis axis, bool sleep);
bool skywatcher_set_aux(enum skywatcher_axis axis, bool on);
void skywatcher_start_thread(skywatcher_status_t status, void* user_data);
void skywatcher_stop_thread();Nutzung
#include <skywatcher/skywatcher.h>
int main(void)
{
char ip[64] = {0};
if (skywatcher_discover(ip, sizeof(ip)))
{
skywatcher_open(ip);
skywatcher_initialize_axis();
skywatcher_goto_deg(SA_AXIS_1, 45.0);
/* ... */
skywatcher_close();
}
return 0;
}Achsen & Zustand
- Achsen:
SA_AXIS_1,SA_AXIS_2(RA/DE bzw. AZ/ALT). skywatcher_axis_statusliefert Mode (SM_TRACKING/SM_GOTO), Direction (SD_CW/SD_CCW), Speed (SSM_SLOW/SSM_FAST), Action (SAA_STOPPED/SAA_RUNNING), Axis-State (SAS_NORMAL/SAS_BLOCKED) und Init-State (SIS_NOT_INIT/SIS_DONE).
Tests
Test-App tests/ führt die öffentliche API aus (ohne Test-Framework).
Die IP wird automatisch per skywatcher_discover() erkannt; ohne
angeschlossene Montierung (Discovery-Timeout) werden die Hardware-Tests
als SKIPPED gemeldet.
cmake -S tests -B tests/build
cmake --build tests/build
./tests/build/bin/skywatcher_testsAbhängigkeiten
socket(Verbindung, eigene IP, UDP-Broadcast-Discovery)threading(kritische Sektion, Thread-/Sleep-Wrapper)string,logging,api,physics(Sichtbarkeit, Logging, Winkel-Mathematik/Modulo)
Build
cmake -S . -B build
cmake --build buildEinbindung in ein Projekt per
add_subdirectory(../../libraries/skywatcher …), Header über den
Include-Pfad <skywatcher/skywatcher.h>.
Quellen
- Repo: https://github.com/deppenkaiser/skywatcher (public, Apache-2.0)
libraries/skywatcher/skywatcher/{skywatcher.h,types.h}libraries/skywatcher/{skywatcher.c,skywatcher_communication.c}
Verwandte Artikel
- socket – TCP/UDP-Socket-Bibliothek (UDP-Broadcast, eigene IP)
- threading – Thread- und Synchronisations-Helfer