ASCOM Treiberentwicklung, Arduino und Error handling

  • Ich bin (endlich) fertig mit meiner Gartensternwarte, der Antrieb der Kuppel läuft gut, gesteuert wird alles via Arduino. Den ASCOM Treiber habe ich in C# erstellt (aus dem ASCOM dome template).
    Auch das läuft wunderbar, die Kuppel dreht sauber synchron zum Teleskop, ich bin also am gewünschten Punkt angekommen - ich kann am Schreibtisch sitzen und alles fernsteuern :)


    Eine Sache ist aber noch offen, eventuell kann jemand helfen?


    Ich habe eine Überwachung im Arduino eingebaut. Wenn der Motor läuft, muss sich die Kuppel drehen (logisch...). Das wird mit einem Drehgeber kontrolliert (und zwar unabhängig von der Motorachse!).
    Wenn sich etwa zwei Sekunden nach Start des Motors die Position des Drehgebers nicht verändert hat, dann stimmt was nicht und der Motor stellt ab. Auch das klappt prima, aber.....ich sehe es nicht.


    In NINA gibt es ja diese roten/gelben/grünen Popups. Ich möchte also jetzt, dass im Falle von "Dach bewegt sich nicht" so ein rotes Popup in NINA erscheint. Aber wie macht man das?
    Es sind hier zwei Stufen im Spiel - zuerst muss der Arduino diesen Fehlerzustand an den ASCOM Treiber melden (wie?). Dann muss dieser seinerseits etwas tun, eine exception werfen, was NINA als Anlass für ein Popup erkennt.


    Grüsse
    Joerg

  • Hallo Jörg,


    Glückwunsch zur Gartensternwarte und natürlich zum eigenen ASCOM Treiber. Hab neulich einen CoverCalibrator Treiber gestrickt, ebenfalls in C#. Man muss sich erstmal in die ASCOM-Templates rein fuchsen und ein richtiges „How to“ gibt es kaum. Aber wenn man‘s einmal drin hat, läufts und ist alles sehr logisch aufgebaut.


    Bin jetzt in der ASCOM Dome Class nicht wirklich tief drin, aber du lässt die Kuppel doch sicher über SlewToAzimuth oder ähnlich verfahren.


    Dome.SlewToAzimuth Method


    und die kann doch, mit der Wartezeit, eine Fehlermeldung ausgeben, wenn sich nichts bewegt.


    Ein Error bzw. Exception erzeugt dann eigentlich automatisch ein Popup in NINA.


    Alternativ, dass der SlewBefehl einen Interrupt aktiviert, der nach 2 Sekunden kontrolliert, ob sich was bewegt und wenn nicht in einer eigenen kleinen Subroutine ein ThrowExeption ausgibt.


    Kennst du die Support Gruppe unter https://ascomtalk.groups.io/g/Developer schon? Sehr versierte Kollegen, die mit Rat und Tat unterstützen und mir bei der Entwicklung entscheidend weitergeholfen haben.



    Viele Grüße,

    Alex

  • Hallo Alex


    danke für die Antwort.

    Ja, das ist eben so eine Sache mit den Methoden. Es findet ja erst mal gar keine Rückmeldung statt seitens Arduino.
    Ich nehme dort ohnehin nur zwei mögliche Kommandos entgegen. Einmal ein simples "P", was meine Kuppel auf die Parkposition fahren lässt und sonst ein "T nnn.nn", wobei nnn.nn ein float Wert zwischen 0 und 359.99 ist. Aber das war es auch schon, die Kommunikation mit dem ASCOM Treiber ist also unidirektional, sofern man es dann überhaupt Kommunikation nennen will.


    Das Problem ist also ein Grundsätzliches, denn mir ist weiterhin nicht klar, wie das bidirektional implementiert werden muss. Zwar habe ich Beispiele in Visual Basic gefunden, aber die helfen für die C# Implementierung leider nicht weiter. Wenn ich einfach wüsste, wie ich eine mögliche Rückgabe über den seriellen Port im ASCOM Treiber lesen kann, dann wäre der Rest wohl kein Problem. Ich müsste nur ein Signal definieren, was der Arduino sendet und mein ASCOM Treiber dann sehen und eine exception werfen kann.
    Ich bin mir sicher, dass es trivial ist. Aber halt erst, wenn man weiss, wie es geht :)


    Mit dem ascomtalk hatte ich überhaupt kein Glück. Ich habe mich dort schon vor etwa vier Monaten registriert, drei Mal eine Frage gestellt, welche drei Mal nicht publiziert wurde.
    Das waren völlig normale Fragen, also nichts, was irgendwie gegen Regeln verstossen würde. Am Ende dachte ich mir dann, dass ich das echt nicht brauche und habe den Account wieder gelöscht.


    Grüsse
    Joerg

  • Poste mal die VB Routine die du gefunden hast, die können wir sicher zusammen umstricken.


    Ansonsten in deine T nnn.nn Routine einbauen.


    Befehl an Arduino senden, Treiber wartet bis Antwort vom Arduino „läuft oder läuft nicht“ und die Antwort entsprechend verarbeiten.


    Hier unten ein snippet aus meinem Code dazu.



  • Hmm...nun, es IST einfach, aber am Ziel bin ich noch nicht.

    Ich kann z.B, Folgendes tun:


    Code
    try
    {
        string response = serialPort.ReceiveTerminated(terminator);
    }
    catch (Exception e)
    {
        System.Windows.Forms.MessageBox.Show("timeout");
        throw new ASCOM.DriverException("timeout " + e);
    }

    Das tut auch, wenn der "terminator" nicht binnen timeout (default 5 Sek) kommt, dann triggered die Exception und meine MessageBox erscheint, aber NINA reagiert leider nicht (wie erhofft mit so einem roten popup). Finde ich jetzt merkwürdig, denn der Dome Driver tut an anderer Stelle im code exakt dasaselbe, wenn er nicht auf den für den Dome konfigurierten COM Port zugreifen kann.
    Dort geht es aber.


    Grüsse
    Joerg


    Edit:
    Ich habe im NINA discord gefragt - geht nicht, exceptions müssen entweder sofort triggern oder gar nicht. Eine "verzögerte" exception, wie ich sie wollte, ist nicht möglich.
    Schade, dann muss es bei der MessageBox bleiben. Besser als nix

  • Nein, geht nicht.
    Eine Exception in NINA tut nur, wenn sie SOFORT geworfen wird. Also Du kannst z.B. irgendein feature abfragen, was true oder false zurück gibt. Z.B. war mein "mach-den-COM-port auf"-call erfolgreich oder nicht? Je nach response (also meistens wenn "false") kannst du dann eine Exception werfen.


    Aber es ist nicht möglich, einen Funktionsaufruf zu machen, auf das Ergebnis zu warten und dann zu entscheiden, ob Dir das Ergebnis gefällt oder nicht und DANN zu sagen "wirf 'ne Exception".
    Ich habe mit den NINA Leuten debattiert und die wollen so was nicht. Ich versteh's jetzt nicht wirklich , aber wenn sie nicht wollen, wollen sie nicht.
    Man kann da eventuell drum herum programmieren, aber mir langt jetzt auch die MessageBox. Ich sage slew auf irgendeinen Azimuth, prüfe auf ein "X" via ReceiveTerminated und wenn das NICHT kommt, dann war der slew erfolgreich. Wenn die Kuppel hängen bleibt, kriegt der Arduino das mit und schreibt eben dieses "X" raus.


    Aber auch hier nochmal danke für die Hilfe!
    Ich habe das zwar in der Doku gesehen, aber den Wald vor lauter Bäumen dann nicht...


    Grüsse
    Joerg

  • Hallo zusammen,


    vielleicht schreibe ich einem falschen Thema, aber es geht hier auch um Arduino, Ascom und Error- Handling.

    Über den ASCOM Device Hub steuere ich meine Geräte für Astrofotografie : Steuerung Montierung (OnStep) und (OnFocus) in Kombination mit APT und PHD2. Das lief immer ohne Probleme, aber nun habe ich beim Verbinden mit dem Focuser diese Fehlermeldung erhalten.


    Den vorhandenen ASCOM Treiber habe deinstalliert und im gleichen Ordner "Focuser" neu installiert, aber das zeigt auch keine Wirkung.

    Die Verbindung mit der Montierung funktioniert weiterhin ohne Fehlermeldung.


    Hat jemand eine Idee, was diese Ursache dieses Problems sein kann ?


    Viele Grüße

    Carsten




  • Hallo Carsten,


    nehme an es geht um einen selbstgestrickten ASCOM Focuser Treiber bzw. einen der zu einem DIY Projekt gehört ?


    Scheinbar passt was mit dem COM Port und dessen Initialisierung nicht.


    Man müsste in den Code schauen, um was konkretes sagen zu können.


    Wenn du alle anderen comports deaktivieret, also die jeweiligen Geräte raus ziehst und nur den Focuser dran hast, funktioniert es dann?


    Wird der COM Port im Gerätemanager richtig erkannt ? vielleicht brauchst du da noch einen Treiber, je nach UART-USB Chip der in deinem Arduino verbaut ist.


    Grüße,

    Alexander

  • Hallo Alexander,


    der Treiber wurde von Howard Dutton entwickelt. Auch die OnStep (Montierungssteuerung) ist von ihm : https://github.com/hjd1964/OnStep

    Vor ein paar Jahren habe ich diese Steuerung nachgebaut, der nächste Schritt war der Motorfokus, auch als Selbstbau.


    Heute kann man das viel einfacher machen und und es auch nicht sehr teuer:

    OnStep Custom Drive


    Die Motorfocus Steuerung ist in dem Paket mit enthalten. Die ASCOM Treiber sind aber ähnlich, wie ich sie auch verwende.


    Das Problem ist behoben. Es lag aber nicht an den COM Ports, der Arduino wurde erkannt. Ein Treiberfehler war es auch nicht.

    Im ASCOM Forum wurde mir empfohlen, Microsoft .NET Framework 3.5.1 zu deinstallieren und neu zu laden. Letzte Woche habe das Upgrade für ASCOM Version 6.6 installiert und auch bei anderen Usern gab nach es der Installation wohl ähnliche Probleme mit Framework.


    Aber nach der Neuinstallation von Framework läuft jetzt alles wieder rund. Aber warum nur die Focuser- und nicht auch die Montierungsteuerung betroffen war, finde ich merkwürdig.

    Auf meinem Astro Notebook läuft noch Windows 7, vielleicht hängt das damit zusammen.


    Trotzdem vielen Dank für deinen Tipp, so konnte ich zumindest die COM Ports als Fehlerquelle ausschließen.


    Viele Grüße

    Carsten

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!