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_status liefert 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_tests

Abhä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 build

Einbindung in ein Projekt per add_subdirectory(../../libraries/skywatcher …), Header über den Include-Pfad <skywatcher/skywatcher.h>.

Quellen

Verwandte Artikel