Pinüberwachen am Arduino bei Senderausfall (Failsafe )

  • Hallo Leute,
    Jetzt steh ich hier da, und weiss nicht so recht weiter,
    Es geht darum einen Failsafe zu identifizieren. Ich habe 2 analoge Eingänge am Arduino, welche zum steuern meines Bootes gedacht sind.
    Nun möchte ich gerne diese 2 Eingänge überwachen, dass problem ist nun folgendes:
    ich bekomme an den Eingängen einen wert von 0...1023.
    um dies lesen zu können, brauche ich auch eine zahl die dieses kann, geht auch, aber was bekomme ich bei einem Failsafe ?, auch eine 0.!
    Die gehört aber in den Einstellbereich des hinten anhängenden Servos als -Anschlag ( -90 Grad ).
    Die Auswertung des Impulses geht aber leider nicht tiefer, -1, wäre da zB eindeutig.


    Denk ich jetzt falsch, oder wie muss ich da herangehen ?
    gibt es da eine Möglichkeit, am Empfänger irgendwas auszuwerten um ein Failsafe zu identifizieren ?
    Was mir mom einfällt wäre einen Extrakanal zu überwachen, welcher immer 1500mSec Impulssignal gibt( Nullstellung), und bei Ausfall des Senders dann auf Null PWM geht, also auf 0 PWM-Signal, obwohl ja ein 0 (-90 Grad ) ja den 0...1023 Lese-Bereich des Pins beteffend, ja sowieso 0 ergibt, denn bei der Auswertung ist zwar noch die minimal Impulslänge von 1000ms-50% vorhanden, aber diese werden als 0 gelesen.
    Ein richtiges 0 ist aber auch null. :bw:


    Hat da jemand ne Idee, was man am Empfänger(Signal) nutzen kann, denn ich wollte eigentlich kein Extra-kanal zur Überwachung mit einbauen.


    Edit:
    Der Wertebereich der Eingänge wurde von 0..255 auf 1023 berichtigt !

  • Hallo Uwe,


    hmm, ich ja mit der Materie nicht so vertraut bis garnicht, aber vll. hilft ja folgender Gedankengang.
    Ein Empfänger geht in den Failsafe wenn das Signal des Senders fehlt.
    Wie merkt der Empfänger das? Gute Frage, meine Vermutung liegt an der Signalstärke oder/und an der Änderung der Werte welche am Kanal übertragen werden pro Zeiteinheit.
    Wenn jetzt in der Zeit in welcher der Ardu in den Failsafe gehen soll sich keine Differenz des Eingangswertes ergibt dann stellt der Ausgang am Ardu einen programmierten Wert ein.
    Doof ausgedrückt, ist aber die Frage wie stabil die Werte sind welche eingelesen werden vom Empfänger wenn die Geber nicht betätigt werden.
    Ich weiss, aus dem Tal der Ahnungslosen geschrieben, aber vll. ein Denkanstoss.


    LG Martin

  • Wenn jetzt in der Zeit in welcher der Ardu in den Failsafe gehen soll sich keine Differenz des Eingangswertes ergibt dann stellt der Ausgang am Ardu einen programmierten Wert ein.
    Doof ausgedrückt, ist aber die Frage wie stabil die Werte sind welche eingelesen werden vom Empfänger wenn die Geber nicht betätigt werden.

    Nicht doof gedacht, genau das meine ich ja..
    der Sender muss nicht das PWM Signal ändern, zumal es sich im eine Steuerung handelt, welche per extra-Signal den Eingang erst zum Ausgang durchstellt. Gelesen wird die ganze Zeit über, dass ist nicht das Problem, aber ( in diesem Falle ist es der rechte Steuerknüppel ), können durchaus beide Kanäle im NullPunkt stehen, ohne dass sich an den beiden Ausgängen was ändern sollte,


    Aber vielleicht ist das jetzt genau der Ansatz:
    Der Steuerknüppel ist ja nicht auf Null, sonder auf 512, wenn das dann ausfällt hätte ich was zum Auswerten, oder ?
    Es sei dann.... ich drücke dann genau in diesem Zeitpunkt den Aktivierungstaster, und der Ardu denkt es sei ein Befehl auf -90Grad Servoausschlag zu gehen.


    Edit
    Wertebereich am Nullpunkt wurde auf 512 berichtigt !

  • Hallo Uwe,


    ist die Frage was dein Empfänger in genau diesem Fall an Signal am entsprechenden Kanal ausgibt.
    Kannst Du im Empfänger Failsafe programmieren, also stellt deine Anlage das bereit?
    Wohl eher nicht sonst würdest Du dir nicht solche Gedanken machen oder?


    LG Martin

  • noch ein kleines PS hinten dran.
    Wenn da sonst gar nicht geht, könnte man ja auch die digitale Auswertung von 0...1023
    auf 2...1023 beschränken. das wären dann etwa 0,2 Grad Einstell-Winkel Verlust,
    statt -90 ... +90 wären dann halt nur noch -89,8 ...+89,8 Grad einstellbar drin.
    oder ich kompensiere die fehlenden 0,2 Grad per Software, in dem ich die Werte umrechne / anpasse.
    ( :bhi: ...und keiner merkts )


    Edit:
    Wertebeich für digitale Auswertung wurde von 0 .. 254 auf 0 .. 1023 korrigiert. Weiterhin dementsprechend auch die Winkelangaben.

  • Du im Empfänger Failsafe programmieren, also stellt deine Anlage das bereit?

    kann ich einstellen, ich wollte das aber wie bei einem BL-Regler zB. per Ardu erkennbar machen, um meine Bibliothek im Arduino besser ausbauen zu können, denn du kannst später einstellen, ob der Servo xx auch bei Failsafe reagieren soll, und vor allem wie.

  • hallo Martin,
    Du hast mir mit Deiner angeblichen "Unkenntnis" doch auf eine sehr gut machbare Idee gebracht.
    Ich denke ich werde das mit dem 0,2Grad Reglerwegverlust machen, und dann die fehlende Signalauswertung im oberen und unteren Bereich per Umrechnung kompensieren.


    Ich danke Dir für den Gedankenaustauch - der bringt mich weiter .
    :d::clap:

  • Hi,
    ich finde, das die Aufgabenstellung unvollständig beschrieben ist.


    Was ist das für ein analoges Eingangssignal. Die Arduinos mit Atmega CPU haben 10Bit A/D Wandler mit einer Auflösung 1024, also 0 bis 1023. Was ist das für ein Eingangssignal, welche Quelle?


    Bitte nicht missverstehen aber kannst Du C programmieren und kennst die Funktionsweise von Mikrocontrollern?


    Also erst mal mehr Details.

  • Sorry Horst,
    Da hast du völlig Recht mit den 1024.
    Da hab ich wohl etwas ganz krass Durcheinandergebracht.
    Da ich hinter dem Ardu einen 16 Kanal-Servostein mit 4096er Auflösung habe, hab ich jetzt nicht so doll darüber nachgedacht ob der Wert nun wirklich stimmt., und wie ich überhaupt darauf gekommen bin auf die 255 ?


    Autsch.


    C++ ist nicht so mein Ding, ich komme aus dem Pascal-Bereich , sprich Delphi, aber für die Lib reicht es.
    und das Prinzip, welches ich auswerten möchte ist bei einer 1024er Auflösung das gleiche.
    Hätte es dann beim Testen gemerkt , dass der Eingang weit höher als nur bis 255 geht :cry:


    edit:
    Wenn der Bereich die 0..1023 ist, wäre jetzt die Frage, ob es ein -1 geben kann. ich denke mal nicht, denn es kommt ja vom A/D-Wandler, und der gibt nun mal nur 0..1023 heraus.

  • Hallo Uwe,
    mal so ganz dämlich nachgefragt:
    Es geht ja um Erkennung des Ausfalls des Empfängersignal, du sprichst aber immer von den Analogeingängen, die dir dann ja den Wertebereich 0-1023 ausgeben. Der Empfänger gibt dir ja aber keinen Analogwert aus sondern Impulse ( normal 1 ms bis 2 ms), so dass mir grad die Verbindung fehlt.


    Failsave habe ich dadurch gelöst, dass ich die Eingangsimpulse nach dem Einlesen auf Gültigkeit prüfe ( Zeitbereich von 0,8 ms - 2,2 ms) und dann bei Über- oder Unterschreitung einen fest vorgewählten Ausgangswert setze.


    Gruß
    Chris :)

    Einmal editiert, zuletzt von CHZAADW () aus folgendem Grund: Natürlich 1000 MICRO-Sekunden und nicht Milli-Sekunden, Sorry ;-)

  • hallo Chris,
    Der Empänger gibt mit tatsächlich nur Impulse mit einer definerten breite.
    Ich möchte aber dieser Auswertung über den Aduino erledigen, und dieser hat eine A/D-Wandler. Dieser A/D-Wandler spukt mir dann quasi eine Übersetzung im Bereich 0...1023 aus.
    Diese werte ich dann aus.
    Da ich zusätzlich noch die Zeitspanne habe, ab wann ein Senderausfall erkannt werden kann, und nicht nur ein zufällig gewollter Steuerbefehl, war für mich erstmal alles unklar. ( Ich hatte das Zeitlimit nicht beachtet )
    Ich kann beim Ardu entweder Kanal_A, Kanal_B, oder beide überwachen. Eine einzelne Kanalauswertung ist dann nicht so sicher wie beide, daher meine Anfrage.


    Inzwischen ist das Thema für mich erledigt, da ich es schon umgesetzt habe.
    Ich werde zwar weiter Beiträge verfolgen und auch beantworten, vielleicht kommt da noch ne andere coole Variante, aber im Prinzip werte ich die 0 des A/D-Wandlers mit analogRead() aus.

  • Hallo Uwe,
    OK...
    Das mit dem A/D-Wandler war klar.
    Ich lese die Impulse direkt mit dem Arduino ein und kann somit für jeden eingelesenen Kanal definieren, was im Failsafe-Fall passieren soll.


    Wandelst du die Impulse extern in ein analoges Signal um? :kratz:

  • Hallo Chris,
    Ich schicke 2 Empfängerkanäle zum Arduino, und über meine Lib dann einfach weiter zum 16Kanal 12Bit PWM-Baustein.
    Der dritte analoge wird über Arduino ausgewertet , in ( wie Du das jeweils möchtest ) in 2-10 Bereiche , oder mehr aufgeteilt. Eine direkte Impulszählung oä. mache ich nicht. Ein weiterer digitaler Kanal entscheidet über aktiv/ reset/ reset all.
    näheres findest du hier in Kurzform, wobei aber schon wieder einige Funktionen dazu gekommen sind.
    ( wie zum Beispiel: ein-kanal-Betrieb, , welcher durchgeschaltet wird, [ einstellbar ] , und eine interne Fehlerauswertung per LED .....usw )
    Alles von dir einstellbar mit ein paar Zeilen. um den Rest kümmert sich meine Lib.

  • Ich schicke 2 Empfängerkanäle zum Arduino, und über meine Lib dann einfach weiter

    Hallo Uwe,
    Soweit , so klar.
    Wenn du den Signalausgang vom Empfänger ( 50Hz, Impulse von 1-2 Millisekunden) an einen AnalogIn-Pin des Arduino schickst, und du das mit "analogRead" auswertest, dann dürfte da aber kein (digitalisierter) Wert von 0- 1023 bei rauskommen, sondern während der aktiven Impulse ein Wert der der Impulshöhe entspricht ( je nach Empfänger was zwischen 3,3 V und ca. 5 V, entsprechend digitalisiert) und in der Impulspause dann eben 0.


    Ich habe mich erst vor ein paar Wochen in die Arduino-Welt vorgekämpft, um meine Antriebssteuerung so zu verwirklichen, wie ich sie mir vorstelle und habe dabei einige Parallelen zu deinem Projekt.
    Auch bei mir werden grundlegend 3 Kanäle des Empfängers ausgewertet. Neben den Achsen eines Kreuzknüppels noch ein Poti, mit dem der gewünschte "Fahrtmodus" vorgewählt wird um dann entsprechend 4 Ausgänge ( Querstromruder, Ruder, sowie linker und rechter Antriebsmotor getrennt) anzusteuern.
    Hierzu lese ich die Impulse mit " pulseIn" ein, was ja direkt den ermittelten Wert in Microsekunden ergibt und dann mittels "map" in den gewünschten Zahlenbereich umgesetzt wird. Aus dieser Konstellation sind Dinge wie automatischer Nullpunktabgleich, Failsave etc. natürlich recht simpel umsetzbar, indem man direkt am eingelesen Impuls zugreift.
    Von daher fehlt mir in deiner Beschreibung der Weg vom RC-Impuls zum digtalen Wert "0 - 1023".....


    Ich hoffe, ich habe das einigermaßen verständlich ausgedrückt...


    Gruß
    Chris :)

  • Hallo Chris,
    schau doch mal hier rein Arduino-Referenz
    ich benutze im Prinzip nur eine andere Auswertung des Pins,
    da deine Variante eine zu grobe ( ungenaue ) bei längeren Zeiten darstellt, gerade zwecks FailSafe-Timing.
    Ausserdem kann ich den gelesenen Wert mit map() verändern und gleich zum Ausgang schicken.


    ( ich arbeite leider nebenbei noch an der PDF zu meiner Lib, alllerdings wenn sich was ändert, mus ich diese auch ändern. Daher ist die ebenso nur "fast" fertig )

  • da deine Variante eine zu grobe ( ungenaue ) bei längeren Zeiten darstellt, gerade zwecks FailSafe-Timing.

    Ähm.....
    ..... bei LÄNGEREN Impulsen können Ungenauigkeiten auftreten.... "pulseIn" misst bis 3 Minuten, wir reden von Impulsen mit maximaler Dauer von 2,2 Millisekunden.
    Failsave-Erkennung bei Standartparametern nach 1 Sekunde mit entsprechender Parametrierung schon nach >20 MIllisekunden. Wie schnell brauchst du das?
    Der Wert läßt sich ebenso per "map" anpassen..


    Warum das Rad neu erfinden, wenn die Karre mit den mitgelieferten Rädern prima läuft?


    Gruß
    Chris :)

  • Hallo Chris,
    Da hast Du völlig Recht, und deshalb habe ich das soeben bei mir mit der Auswertung abgeändert.
    Alleine schon deshalb, weil ich hier ein Signal auswerten kann, oder besser keins, das eben wirklich eine Null darstellt, und nicht die nach dem A/D-Wandler ausgegeben Null, welche durchaus ein Steuerbefehl sein könnte. Dieser bleibt bis zur nächsten Änderung bestehen, so dass ich durchaus dann ins Zeitlimit für ein automatisches Zurückfahren aller Servos kommen würde. Nur die Zeitmessung bis zum Auslösen, die mache ich weiterhin intern in der Lib.
    Nicht etwa wegen der Genauigkeit, das wäre jetzt egal ob nach 3Sekunden oder 3,125 Sekunden alles in Nullstellung gefahren wird. Ich müsste an der Auswertung zu vieles abändern.


    Im Prinzip habe ich jetzt ja genau das gefunden, was ich mir "gewünscht" habe.
    Manchmal sieht man halt den Wald vor lauter Bäume nicht.
    :d: Chris, mit pulseln() ist's übersichtlicher geworden.

Jetzt mitmachen!

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