Gestaltung einer Allrad-Lenkung mittels Arduino

  • Hallo,


    ich möchte für meinen Modelltraktor ein Allradlenkung realisieren. Es sollen 3 Programme über einen Kanal an der Fernsteuerung auswählbar sein.


    Ich favorisiere die Programme "Standardlenkung", "Allradlenkung" und "Großer Hundegang".


    Nähere Beschreibung findet man hier: Beschreibung Claas Xerion



    Die verwendeten Komponeten sind:


    Sender : FC-16 (umgebaut auf Jeti duplex 2,4GHz)

    Empfänger : Jeti duplex REX6

    Fahrregler : Servonaut S22

    Akku : 12V Ni-MH

    Servo : jetzt 2 billige aus der Bastelkiste


    Der Empfänger, der Uno und die Servos wurden am BEC-Ausgang des Fahrreglers angeschlossen, da dort laut Datenblatt 5V und bis zu 3A zur Verfügung stehen.



    Für den Modus "Standardlenkung" habe ich im Moment dieses kleine Programm von Rainer (dqb312) in Verwendung.


    Quelle: Mehrachser Lenkung von 2 Achsen über einen Fernsteuerkanal


    Der Versuchsaufbau funktioniert ganz gut. Lediglich die Servos zittern mehr oder weniger in der Ruhestellung.


    Ich hatte mal spaßeshalber den in dem diesen Beitrag Arduino Tipps erwähnten Sketch ausprobiert und da war das Servozittern nicht bemerkbar. Allerdings sind die Servopostionen dort fix programmiert worden.


    Im Moment suche ich also einen Ideenanstoß für die Gestaltung eines Programmes, wo man per einem Kanal zwischen 3 Positionen schalten kann (so in der Art 1 Sekunde Ausschlag = Pos. 1 usw.)

    und einer Routine, die das Servozittern in der Neutralstellung verringert bzw. ganz ausschaltet.


    Hat jemand vielleicht eine Idee und könnte mir weiterhelfen?

  • Je nach dem, wie Du den einen Kanal schalten kannst, 0.1.0 oder in Stufen kannst Du recht übersichtlich mit Switch Cases arbeiten.


    Oder eben mit if, else. If Schalterposition soundso dann diesunddas.


    Ich hab bei mir Lichtprogramme je nachdem, wie oft ich einen Button an der Funke kurz gedrückt habe.

  • Hier schaue ich gerne zu. Die Lenkung über einen Arduino zu steuern weckt mein Interesse. Das kann ich dann für meinen Xerion nutzen.

    Kurz mal nicht nachgedacht -zack- Glücklich!

  • Das Servozittern tritt beim Arduino unter anderem bei ungünstiger Verwendung von PWM Ausgängen und der Servo-Lib auf. Allerdings nicht nur in Neutralstellung, sondern immer.

    Bei deinem Beispiel ist dies nicht der Fall. Trotzdem kannst du aber mal probieren, ob es besser ist, wenn du die Servos an Pin 7 und 8 klemmst, statt 9 und 10.


    Kann der Kanal, mit dem du zwischen den Funktionen umschalten willst, nur Maximalausschlag wegen Schaltkanal oder auch Proportional?

    Wie man aus verschiedenen Kanal-Auslenkungen verschiedene Schalterstellungen generiert müsste irgendwo bei den Arduino Beispielen hier im Forum drin sein. Das müsste man nur an deine Aufgabenstellung adaptieren.

    Unterschiedlich lange Auslenkungs/Auslösezeiten zu ermitteln ist eine ziemlich "bescheidene" Programmieraufgabe. Insbesondere dann, wenn parallel dazu noch andere Aufgaben erledigt werden sollen.

  • Guten Tag,

    Hier schaue ich gerne zu. Die Lenkung über einen Arduino zu steuern weckt mein Interesse. Das kann ich dann für meinen Xerion nutzen.


    :D, auch bei mir ist die Schaltung für einen Bruder Xerion gedacht.


    Wenn man n Drehpoti an der Funke hat, kann man das auch prozentual mitlenkend machen bis hin zum Krabbengang


    Die Fernsteuerung ist bis auf einen Umschalter für das 2,4GHz-Modul und einer CamPac-Erweiterung original.

    Im Moment bin ich mit der Fernsteuerung nicht so glücklich (Größe und die verfügbaren Mischerprogramme sind mehr / speziell auf FLugzeuge und Helis ausgerichtet). Daher möchte ich, das die ganze Steuerung für die Lenkung usw. im Modell stattfindet, so daß man ggf. die Fernsteuerung / Empfänger tauschen kann und nicht wieder groß einrichten muss.




    Gedacht ist, das der Kanal 3 (linker Steuerknüppel hoch / runter) für die Schaltung der Lenkprogramme genommen wird.


    Oben schreibst Du, das ich mal Pin 7 benutzen soll. Ich dachte immer, das ich zur Ansteuerung eines Servos einen PWM-Ausgang brauche. Liege ich hier falsch?

  • Gedacht ist, das der Kanal 3 (linker Steuerknüppel hoch / runter) für die Schaltung der Lenkprogramme genommen wird.


    Oben schreibst Du, das ich mal Pin 7 benutzen soll. Ich dachte immer, das ich zur Ansteuerung eines Servos einen PWM-Ausgang brauche. Liege ich hier falsch?

    Dann könntest du doch einen proportionalen Mischer machen. Je weiter der Kanal/Knüppel nach vorne ausgelenkt ist, desto mehr wird gegensinnig mitgelenkt. Kanal/Knüppel nach hinten gleichsinnige Auslenkung. Kannst aber genausogut einfach eine Schwelle definieren, sodaß entweder das eine oder das andere ausgeführt wird.


    Für die Servo-Funktion braucht man keinen PWM-Ausgang. Es ist sogar umgekehrt, man verliert PWM-Ausgänge. Beim Uno sind das konkret genau Pin 9 und 10 die du ja verwendest. Ich vermute, dass es da ggf. einen Konflikt gibt.

    Eine zweite Fehlerquelle kann die Impulserfassung sein. Bei so kleinen überschaubaren Progrämmchen ist das aber eigentlich kein Thema.

  • Wenn man statt der hier viel benutzen PulseIn-Funktion mit Interrupt arbeitet, geht kein Impuls verloren.

    Die Servo.h ist ein Grauss, weil's den halben Arduino drosselt und PWM auf 50Hz reduziert wenn ich's noch recht im Kopf hab.

  • Das mit der Servo.h und den Ausbremsen habe ich auch schon woanders gelesen. Aber als Arduino-Anfänger ist die Interrupt-Funktion noch ein Buch mit vielen Siegeln.


    Hier jetzt mal ein Programmversuch mit einem einfachen Filter der Signale um die Mittelstellung (ist die Programmzeile mit der if-Funktion). Das Servo-Zittern um den Mittelpunkt / Nullbereich ist dadurch schon merklich weniger geworden. :)


  • Ich vermute das Zittern kommt auch daher, dass die Input-Werte ziemlich unsauber sind und durch das Gemappe einfach unruhiger werden. Wenn man sich mal die rohen PPM Signale anschaut ist da schon jede Menge "Rauschen" dabei.

    Evtl kann es helfen, diese Werte vor dem Mapping zu filtern.

    Leider hab ich momentan kaum Zeit, mit damit zu befassen.

  • Eine Möglichkeit wäre evtl. die hier. Den Servo nur anbinden, wenn er sich bewegen soll und dann wieder abkoppeln.

    Natürlich ohne Delay. Am Ende kann man noch über einen 100uF Kondensator oder ähnliches am Servo nachdenken.

    Code
    1. servo1.attach(pinServo1);
    2. for (pos = 0; pos <= servoMax; pos += 1) { servo1.write(pos); delay(10);
    3. }
    4. servo1.detach(pinServo1);

    atletzze



  • Morgen.


    Wenn genaue Werte gefragt sind, z.B. Lenkkanal vom Empfänger, habe ich keine guten Erfahrungen mit PulseIn() gemacht. Schon gar nicht, wenn noch ein zweiter Kanal, z.B. Kanal 3 als Umschalter des Lenkmodus, hinzukommt.

    Ich würde in diesem Fall PulseIn() durch Interrupts ersetzen. Das Zittern wird wahrscheinlich weniger werden.


    Ach ja, kommentier mal die Serial.print() aus (// davorschreiben).

    Die sind gut um zu verfolgen was passiert aber schlecht für die Laufzeit. Das Zittern wird dann zwar noch da sein aber evtl. nicht mehr so extrem auffallen.


    Deine Modifikation ist natürlich auch eine Lösung, wenn du mit der Genauigkeit zufrieden bist.


    Gruß,

    Felix

  • Kann gerne heute Abend eine funktionierende Interruptabfrage hier einstellen. Aber ich fürchte, die Servo.h zerhaut einem Timer 1 etwas

  • Nicht einen Timer verwenden, sondern die Interrupts auf die Empfängerleitungen legen. Dann bekommst du beim Flankenwechsel den Interrupt und kannst entsprechend darauf reagieren. Sprich: Zeit zwischen den Wechseln merken.

    Ich kann heute Abend auch mal in meinen Projekten stöbern und einen Rahmen posten.

  • Die Servo.h ist nicht das Problem. Ich habe bei meiner Steuerung vier Kanäle per Interrupt, PWM für's Brems/Rücklicht und die Standard Servo-Lib drin. Wenn man's richtig macht, geht das alles.

  • So, ich habe mal was aus einem alten Code rausextrahiert. Habs jetzt nicht getestet, sollte aber funktionieren ...


    Die Debugausgabe habe ich mal drin gelassen. Sollte im Echtbetrieb natuerlich raus.


    Gruß,

    Felix

    Edited once, last by Widar: Kommentare eingefuegt ().


  • Im Moment bin ich mit der Fernsteuerung nicht so glücklich (Größe und die verfügbaren Mischerprogramme sind mehr / speziell auf FLugzeuge und Helis ausgerichtet). Daher möchte ich, das die ganze Steuerung für die Lenkung usw. im Modell stattfindet, so daß man ggf. die Fernsteuerung / Empfänger tauschen kann und nicht wieder groß einrichten muss


    Einmal eine gescheite Fernsteuerung für Funktionsmodelle kaufen

    z B.: Servonaut HS16

    da kannst Du auf einen Geber (Knüppel, Schalter, Poti) bis zu 4 Servo ( an 4 Ausgängen ) gleichzeitig ansteuern und dabei jeden in Endlage, Weg, Geschwindigkeit, usw. einstellen.

    Viele Grüße Peter


    RC4WD-Gelande-II-RTR-D90-TruckKit(Limited Edition (Aufbau ab Sommer 2018)