"Smarte" ESC/Steuerung auf Arduino Basis

  • Nachdem ich den spannenden Thread von finger.im.ohr kurzzeitig etwas zweckentfremdet hatte (Sorry dafür!), und von IBF in diese Richtung hier gestupst wurde, hier ein kleiner Thread zum Thema Arduino als ESC.

    Wer sich für das Thema Fernsteuerung per Arduino interessiert kann hier die Antweight Projekte von Finger im Ohr finden: Arduino Ants (AA)

    Bei meinem Projekt ist der Ansatz genau anders herum: ich habe eine alte 27Mhz Pistolengriff Funke hier und möchte 2 Motoren damit ansteuern, ohne einen extra ESC dafür nutzen zu müssen.

    Die Anforderungen der Idee:

    - Eingang der Signale vom RC Empfänger

    - freie Programmierung der Steuerung (Eingangssignal: Vor/zurück und Links/rechts, Ausgabe an Motoren: Vor/Zurück und Geschwindigkeit als PWM Signal jeweils für linken und rechten Motor)

    Da das Projekt aus meiner Restekiste gestartet wurde (und arbeiten mit größeren Bauteilen etwas angenehmer ist für meine grobmotorischen Finger) startet das Projekt mit folgenden Bauteilen:

    • Arduino Uno R3
    • L298P Motor Shield (wird einfach auf den Arduino aufgesteckt mit identischem Pin Layout
    • 2x Getriebemotor 12V

    Damit kommen wir schonmal zu den ersten Pros und den ersten Herausforderungen beim Projekt:

    Positiv:

    • Kosten: Ein Arduino und das Motor Shield liegen in Summe bei ca 30€ für die steuerung von 2 DC Motoren
    • Umfang: das Motorshield hat 2 Kanäle für DC Motoren, für einen Roboter also Ideal. Durch die Beschränkung von 12V/2A ist man Leistungstechnisch vermutlich auf Antweight beschränkt, da für alles andere doch stärkere Motoren notwendig sind.
    • Freiheiten mit Arduino: vorausgesetzt man ist in der Lage den Arduino selbst zu programmieren, sind die Möglichkeiten hier nahezu unendlich (Regelwerk zur jeweiligen Klasse beachten!). Neben den 2 Motoren sind hier noch massenweise Pins für allerlei Spielereien frei: Lagesensor der automatisch ein Makro startet, um den Bot wieder aufzurichten? Kein Problem. LEDs, die je nach Geschwindigkeit ihre Farbe und Helligkeit ändern? Klar. Ein OLED Display das vor jedem Kampf per USB ein paar Verunglimpfungen für den gegnerischen Bot aufgespielt bekommt? Solange man das Gewicht mitnehmen kann schnell erledigt, usw.
      Wer das auf die Spitze treiben möchte könnte auf diese Weise sogar einen vollautonomen Bot programmieren, bei dem die Fernsteuerung nur noch als on/off genutzt wird. Das übersteigt aber meine Fähigkeiten bei weitem und wird definitiv in diesem Projekt nicht passieren.

    Negativ:

    • Leistung: Das Motor Shield gibt wie oben schon gesagt max. 2A pro Kanal aus. Damit ist man in der Anwendung stark eingeschränkt. ich habe schon ein paar L298 Module mit etwas mehr Leistung gesehen, aber vergleichbares mit "richtigen" RC Reglern ist mir bisher nicht begegnet.
    • Größe: Hier ist aktuell das größte Problem bei meinem Aufbau. Der Arduino ist mit ca 70 x 50 mm für einen Antweight Bot schon kritisch groß. Das Motor Shield wird oben aufgesteckt und hat identische Maße. Hier bleibt wenig Platz für Empfänger, Akku, Motoren und Servos. Das ist aber kein allgemeines KO-Kriterium, da es weit kleinere Arduinos und Motor shields gibt. Damit werde ich mich aber erst beschäftigen, wenn das Konzept als solches auf dem Uno funktioniert.

    Soweit mal die Theorie.

    Aktuell bin ich soweit, eine kleine Box für alle Komponenten gedruckt zu haben, alles ist verkabelt und zumindest ganz rudimentär bewegt sich auch schon etwas.

    Im Laufe der nächsten Tage kommt der aktuelle Stand der Software und dann vermutlich ca 1 Mio Fragen und Hoffnung auf Hilfe von euch :D

    Das ganze soll aber auch nicht unbedingt "meine" Projektvorstellung werden - wer also eine ganz andere Herangehensweise an ein vergleichbares Projekt hat kann den Thread gerne auch nutzen.

    • Offizieller Beitrag

    ATtiny85 als motor driver IC


    Der code ist bidirectional und ich teste ihn gerade mit einem 40A motor driver. Sollte für ant auch interessant sein. Man spart sich schon ein ganzes board

    und hier noch einmal der Motor Treiber TB6612FNG für 6,50€

    Aus dem ArduinoAnts topic.

    • Offizieller Beitrag

    Sehr schön, dass Du für Dein Projekt einen eigenen Thread angelegt hast. Dann kann man sich hier austoben, ohne dass der Baubericht von Finger-im-Ohr mit seinem Arduino-Ant-Projekt mit o.ot. bzw. einer anderen Baustelle überladen wird.

    Wie im anderen Thread zum Intro schon angedeuted, sehe ich beim Pollen von den Empfängersignalen ein kleines Timing-Problem. Noch dazu, wenn im Hintergrund noch andere Prozesse beim Arduino ablaufen, die auch Zeit kosten. Wenn man Pech hat genau in dem Augenblick ausgeführt werden, wenn ein Flankenwechsel bei den Empfängersignalen ansteht.

    Meine Taktik beim Pollen der Empfängersignale.

    Initialisierung: Ich lasse einen 8bit-Timer laufen, der eine Periodendauer von 4ms abdeckt. Bei einer maximalen Pulsweite eines Empfängersignals von 2,0ms ergibt sich somit ein Wert von 0x80. Der Timer wird bei maximaler Pulsweite nicht gestoppt, sondern beginnt wieder bei "0".

    1) Nach dem Einschalten erst mal abwarten, bis der Eingangspegel von dem Eingang auf "0" ist.

    2) Warten bis der Pegel auf "1" geht. => Diese Zeit vom Timer merken => Zeitstempel Pulsbeginn

    3) Warten bis der Pegel auf "0" geht => Diese Zeit vom Timer merken => Zeitstempel Pulsende

    4) Überprüfen: Zeitstempel Pulsende < als Pulsbeginn? (Überlauf Timer während der Pulsmessung) => Zeitdifferenz Pulsbeginn minus Pulsende => ansonsten Zeitdifferenz Pulsende minus Pulsbeginn

    5) Überprüfen auf Plausibilität: Zeitdifferenz zwischen 0x40 und 0x80? => Puls gültig => wenn nicht => Gehe zu 1)

    6) Zeitdifferenz skalieren auf "0" bis "0x40"

    7) Fahrtrichtung auswerten: 0 bis 0x20 = rückwärts ; 0x20 bis 0x40 = vorwärts => Geschwindigkeitswerte immer zwischen 0x00 und 0x20.

    8 ) Über Look-up-Table die Zeitdifferenz einer Geschwindigkeit zuordnen. Also umsetzen auf PWM zwischen 0 und 0xFF.

    9) Ansteuern Endstufen, je nach Fahrtrichtung die H-Brücke einstellen. PWM-Ausgabe für die Geschwindigkeit.

    10) Weiter bei 2)

    Was ich jetzt nicht erwähnt habe: Die ganzen Skalierungs-Korrekturen. Zum Beispiel liefern manch Funken nicht Signale zwischen 1,0 und 2,0ms, sondern zwischen 1,2ms und 1,8ms. => Das wird dann über "Motorkennlinien" (= Look-up-Table) wieder korrigiert.


    Das was sich bei diesem System ausgezahlt hat. Wenn mal ein Waffenkanal dazukommt, dann wird das System einfach um eine weitere Abfrage erhöht.

    Nachteil: Wenn Du in Deiner Arbeitsschleife gerade woanders bist und es kommt ein Puls vom Empfängerkanal, dann erwischt Du ihn zu spät. Entsprechend stimmt dann die Zeitdifferenz nicht. Und somit bekommt der Motor eine neue PWM verpasst. Bei der nächsten Pulszeitauswertung kann es wieder stimmen. Also wieder "zurück" auf die vorherige PWM.

    => Deshalb mein Rat, dieses Pollen sooft in der Arbeitsschleife unterbringen, dass Du sie im Abstand von 20µs aufrufst.

  • Cool, danke. Mit den ATtiny85 kenn ich mich noch überhaupt nicht aus, da muss ich mich mal einlesen was das so genau ist.

    Der Motortreiber ist noch etwas schwächer, der ist denk ich keine so richtige alternative. allerdings hab ich auch mittlerweile welche gefunden, die zumindest im zweistelligen Ampere Bereich liegen.
    Aber dazu muss erstmal der Code vernünftig laufen.

    Das schaue ich mir heut abend nochmal an und teste etwas damit rum und werde dann mal den aktuellen Stand posten - was funktioniert, was nicht und was noch dazu kommen soll

    Edit: Oh man IBF , damit überforderst du den IT Laien hier schon mal maßlos. Ich denke ich muss da mal ChatGPT und Google zu Hilfe nehmen, um all das zu verstehen ;)
    Aber ist ja auch spannend da neu dazu zu lernen.

    • Offizieller Beitrag

    damit überforderst du den IT Laien hier schon mal maßlos

    :) Ich bin auch kein IT-ler, sondern Elektrotechniker. Aber im Laufe der Jahrzehnte lernt man dazu.... Bin seit dem Jahr 2002 an dem Bau von Fahrtreglern dran, wird immer weiter verfeinert.... Nur leider sind die Materialkosten so hoch geworden (Platine "Made-in-Germany" kostet halt leider mindestens einen zweistelligen Betrag), dass die Gemeinde lieber China-Zeugs kauft. Sind also Entwicklungen vorwiegend "nur für mich" bzw. dann für die Bots, die bei Publikumsveranstaltungen genutzt werden.

    Oben mit der Liste war die Kurzfassung. Fang einfach mal an, poste hier wie Du es machst.... und wenn Du meine Meinung hören willst, dann immer gerne. Hilft ja nicht, wenn ich Dir einfach meinen Quellcode schicke und Du das nachprogrammierst. Soll ja Dein eigenes Baby werden. ;)

    (Aktuelles Projekt meinerseits: Ein Ant-Fahrtregler mit aufgestecktem Empfänger. Hat wahnsinnig viele Extras am Waffenkanal, so dass man ihn eigentlich schon als reinen Schaltaktor verwenden kann. Als Gratis-Beigabe dann noch zwei Fahrtregler-Kanäle für Motoren., ^^ )

  • :) Ich bin auch kein IT-ler, sondern Elektrotechniker. Aber im Laufe der Jahrzehnte lernt man dazu.... Bin seit dem Jahr 2002 an dem Bau von Fahrtreglern dran, wird immer weiter verfeinert.... Nur leider sind die Materialkosten so hoch geworden (Platine "Made-in-Germany" kostet halt leider mindestens einen zweistelligen Betrag), dass die Gemeinde lieber China-Zeugs kauft. Sind also Entwicklungen vorwiegend "nur für mich" bzw. dann für die Bots, die bei Publikumsveranstaltungen genutzt werden.

    Oben mit der Liste war die Kurzfassung. Fang einfach mal an, poste hier wie Du es machst.... und wenn Du meine Meinung hören willst, dann immer gerne. Hilft ja nicht, wenn ich Dir einfach meinen Quellcode schicke und Du das nachprogrammierst. Soll ja Dein eigenes Baby werden. ;)

    (Aktuelles Projekt meinerseits: Ein Ant-Fahrtregler mit aufgestecktem Empfänger. Hat wahnsinnig viele Extras am Waffenkanal, so dass man ihn eigentlich schon als reinen Schaltaktor verwenden kann. Als Gratis-Beigabe dann noch zwei Fahrtregler-Kanäle für Motoren., ^^ )

    Naja, aber als Elektrotechniker verstehst du wenigstens was die ganzen Kabel da tun :D Ich bin ausm Bereich Karosseriebau - bei mir beschränkt sich das auf "Mann drückt auf Roboterpanel rum, Roboter bewegt sich zu Blech, WPS Zange macht bzzzzzt" ;)

    Ja das mit den Herstellkosten kann ich mir gut vorstellen. Zu den Preisen, bei denen man auf Aliexpress ganze module (kleine ESCs etc.) bekommt, ist hierzulande noch nichtmal der Logistiker bezahlt, der das ding verpackt und weg schickt...

    Also zum ersten Stand:

    DISCLAIMER: Da ich keine Ahnung von programmieren oder im speziellen C habe ist mein Code eine Mischung aus google, ChatGPT und trial&Error. Für jeden Programmierer besteht die Gefahr eines spontanen Herzinfarkts beim lesen meiner Spaghetti-Codes ;)

    Ich arbeite mit der RCReceive Library, da diese eine Nullpunktbestimmung drin hat, den Wertebereich direkt auf 0-255 mapt und auch einen Failsafe, wenn die empfangenen Werte zu weit streuen und als verlorene Verbindung interpretiert werden.

    Hier scheint aber auch schon ein Problem zu sein: Laut WIki der library nutzt die poll() Funktion 10 Werte und mittelt diese und kommt somit auf eine verzögerung von 200ms. Das ist schon verdammt lange, wenn danach erst der code weiter geht.

    Über die Serial.print funktion sieht das aus, als wäre es viel schneller als bei der Ansteuerung der Motoren, aber vielleicht täuscht das auch?

    Die Ausgabe der PWM Werte an die Motoren habe ich dann gestern nochmal komplett über den haufen geworfen, weil das nix war.

    Da mach ich mich dann nochmal von vorne dran, sobald ich das Gefühl habe, die Eingangs-Seite läuft vernünftig.

    • Offizieller Beitrag

    Für jeden Programmierer besteht die Gefahr eines spontanen Herzinfarkts beim lesen meiner Spaghetti-Codes

    Keine Sorge. Wenn ich in der Arbeit bei unseren Software-Entwicklern beim Code-Review mit dabei war, hatte ich mich auch manchmal gewundert, dass das überhaupt noch funktioniert.... :saint:

    Also, wie gesagt, von Adruino habe ich noch keinen Schimmer. Aber die Bezeichnungen geben gewisse Hinweise auf die Funktion, die hier unter der Motorhaube versteckt ist.

    Wenn ein Digitalwert von einem Pin mit 200ms Mittelung gebildet wird, dann ist das eigentlich relativ "unbrauchbar". Ich weiß nicht, ob Dir die Signale, die vom Empfänger rausgehen, geläufig sind? Bzw. was das Timing angeht und wo die eigentlich Nutz-Information versteckt ist?
    Wenn das Neuland ist, dann gib' Bescheid, ich mach' dann mal eine Skizze. (=> Ist nicht schwer zu verstehen, aber es muss einfach mal dargelegt werden.)

    • Offizieller Beitrag

    //Edit:

    Hab' jetzt auf der Suche nach den Timing-Diagrammen einen Thread von Ralf gefunden. Der hat mit dem Arduino einen Einkanal-Hammer gebaut.

    Vielleicht kannst Du damit ein paar Ideen bzgl. dem Timer herausholen?

    So wie ich sehe, gibt es beim Arduino eine Möglichkeit, die Pulslänge schon fix und fertig abzurufen:

    Code
    pulseIn(2, HIGH, 22000);

    Damit kannst Du also schon mal erkennen, ob der Kreuzknüppel in Neutralstellung ist (Wert müsste dann 1500ms sein), oder > 1700 (Vorwärtsbewegung) bzw. < 1300 (Rückwärtsbewegung)

    Kleiner Tipp: Bau bei der Neutralstellung unbedingt eine Hysterese mit ein. Also nicht exakt 1500, sondern z.B. 1456 bis 1454 . Ansonsten brummeln die Motoren immer ein bisschen vor sich hin.

  • Keine Sorge. Wenn ich in der Arbeit bei unseren Software-Entwicklern beim Code-Review mit dabei war, hatte ich mich auch manchmal gewundert, dass das überhaupt noch funktioniert.... :saint:

    Also, wie gesagt, von Adruino habe ich noch keinen Schimmer. Aber die Bezeichnungen geben gewisse Hinweise auf die Funktion, die hier unter der Motorhaube versteckt ist.

    Wenn ein Digitalwert von einem Pin mit 200ms Mittelung gebildet wird, dann ist das eigentlich relativ "unbrauchbar". Ich weiß nicht, ob Dir die Signale, die vom Empfänger rausgehen, geläufig sind? Bzw. was das Timing angeht und wo die eigentlich Nutz-Information versteckt ist?
    Wenn das Neuland ist, dann gib' Bescheid, ich mach' dann mal eine Skizze. (=> Ist nicht schwer zu verstehen, aber es muss einfach mal dargelegt werden.)

    Also ich hab so ganz grob eine Idee, was dahinter steckt. Das ganze funktioniert ja auch als PWM SIgnal, richtig? Also kein analoger Wert von-bis sondern ein Puls mit einer ganz bestimmten Signallänge bzw breite? Allerdings ist das auch alles irgendwie nebelsuppe in meinem Kopf. So richtig klar ist mir nicht, welches Signal da nun rein geht, was raus kommt und wie das dann von einem Servo, ESC oder eben dem arduino wieder zu einem Wert eingelesen wird.

    Das mit dem pulseIn() ist natürlich auch noch ne spannende Variante. Ich sehe schon, ich muss mich glaub ich - wenn das jemals mehr sein soll als n bisl spielerei ohne nutzen - von der fertigen library verabschieden oder diese mal selbst durchgehen und verstehen.

    Aktuell weiß ich nur, dass da irgendwie ein Nullpunkt bestimmt wird, die werte auf eine Range von 0 bis 255 gemappt werden und ich über den poll() einen MIttelwert über 10 Messungen als Output bekomme. Und wenn ich das richtig verstanden habe scheint ja eine Messung dann 20ms zu gehen, da die Wertausgabe ja 200ms verzögert sein soll. Aber den COde hinter dieser library hab ich mir noch nicht angesehen.

    Interrupts werden dort angegeben als optimale Variante, klappt bei mir aber aus kompatibilitätsgründen nicht (mein Board hat nur 2 Pins die für interrupts geeignet sind und einer der Pins ist gleichzeitig der vom Motorshield genutzt für die Klemme vom Motor).

    Du meintest ja, du bist von dieser Variante wieder weg, da es zu viele Probleme gab. Was waren denn die Probleme damit bzw was sind denn die Nachteile von interrupts? Bisher sehe ich immer nur "is besser, weil viel schneller".

    Danke schonmal für deine Hilfe - das ist wirklich Klasse!!!

    • Offizieller Beitrag

    Kurz aus dem Kopf, also ohne Gewähr:

    Das Fernsteuerungs-Servosignal ist ein Puls mit einer variablen Länge von ülicherweise 1...2 ms. Mittelstellung des Knüppels ist etwa 1.5 ms,

    die Enstellungen sind dann etwa 1 bzw. 2 ms. Wie Reiner schon sagte, hängt das auch ein bißchen vom fabrikat ab - manche geben etwas kürzere Pulse aus.

    Auch vom Fabrikat ab bängt die Polarität. Die Flysky-Empfänger geben L aus, und den Impuls dann als H-Puls. Es gibt aber auch die umgekehrte Polarität.

    (braucht einen nur zu kümmern, wenn man mit verschiedenen Empfängern arbeiten muss)

    Üblicherweise werden die Impulse alle 20 ms wiederholt, wobei es auch da Unterschiede gibt. Draufschauen mit dem Oszilloskop sollte alle Fragen

    recht einfach beantworten.

    Eine wichtige Funktion für die Roboteers ist der Falisafe - also wenn der Fernsteuersender ausfällt, dass alle Motoren ausgehen.

    Da muss man den Empfänger anschauen, ob er das kann. (aus meiner Sicht) gescheite Empfänger geben einfach keine Signale aus, wenn der

    Sender nichts sendet. Es gibt aber auch Empfänger, die selber so einen Pseudo-Failsafe haben, und im Fehlerfall irgendwelche Standard-Signale

    ausgeben - hier ist es dann fast unmöglich, heruszufinden, ob das nun Failsafe oder gewollte Einstellung ist.

    Der Flysky-Empfängr ist so einer - allerdings hat der eine LED, die leuchtet, wenn der Empfänger Signale vom Sender kriegt - da kann man

    einen Draht dranlöten und den als Hinweisgeber, ob eine Failsafe-Condition besteht, nutzen.

    LG

    -Michael

    • Offizieller Beitrag

    Danke Michael,

    Du hast mir das Erläutern der grundsätzlichen Pulse erspart. (Bin zur Zeit etwas in Hektik wegen den Vorbereitungen für das nächste MMM. Dutzend offene Baustellen....)

    Mit dem Failsafe ist ein ganz heißes Thema. Sobald Funkausfall ist, "erfinden" manche Empfänger auf einem Kanal ein Signal. Das ist für die Flieger beim Gas gedacht. Also den Motor drosseln, entspricht den Kreuzknüppel "zu einem herziehen". Leider ist das bei uns in der Regel das Auslösen einer Waffe. =O

    Ich hab' das so gelöst, dass der Ausfall von einem Kanal der Motoren (also egal ob links oder rechts) zum Abschalten beider Motoren führt.

    • Offizieller Beitrag

    Als Anlage mal eine kurze Erläuterung/Skizze, wie das Timing bei einer Funkübertragung ist.


    Da der Sender normalerweise nur auf einer einzigen Frequenz sendet, müssen alle Kanäle gleichzeitig übertragen werden.

    Dazu wird einfach nur ein Kanal nach dem anderen aneinandergehängt.

    Der Empfänger unterscheidet die einzelnen Kanäle durch eine Pause zwischen den Kanälen. Laut meiner Messung war das ca. 0.5ms.

    Am Ende der einzelnen Signale braucht der Empfänger einen Hinweis, dass jetzt das Ende erreicht ist. Dazu ist eine Pause von mindestens 4ms nötig. Dann geht's wieder von vorne los.

    Der Empfänger braucht also die 4ms, um festzustellen, wann es "losgeht" mit dem Empfängerkanal 1. Dann wird das Signal auf die verschiedenen Steck-Ausgänge aufgeteilt, so dass Du konkret an jedem Steckplatz am Empfänger nur einen einzigen Kanal vorfindest.

    Wie Michael o.g. schon beschrieben hat, hat jeder Puls eine unterschiedliche Länge, die normalerweise zwischen 1,0ms und 2,0ms beträgt. Die Pulslängen musst Du in Deiner Software also erfassen. Dazu ist das o.g. Programm von Ralf eigentlich ganz übersichtlich gemacht. Es wird pro Eingangspin eine Zeit ausgegeben, die Du dann weiter interpretieren musst.

    Ich hoffe, damit etwas geholfen zu haben?

    (Nachdem Du aus dem Maschinbau-Sektor kommst, nehme ich an, dass Du kein Oszilloskop hast? Darum das, was man an einem Oszi sieht als o.g. Skizze... ;) )

    Manche Empfänger geben auch das komplette Funksignal an einem Pin aus. Das könnte man auch locker auswerten. Auch mit dem von Dir favorisiertem Interrupt. Denn Du hast ja jetzt nur einen einzigen Eingang für alle Kanäle.

    Aber: Du hast geschrieben, es ist eine 27MHz-Funke. Also schon eine etwas ältere Anlage (?). Da ist eine Summensignal-Ausgabe noch nicht üblich gewesen.

    Bei mir ist eine Summensignal-Auswertung auch nicht möglich. Liegt an meinem Testaufbau bei der Software-Entwicklung. Ich benutze keine Funke, sondern Servo-Tester. Lauter einzelne. Die wissen voneinander nichts und senden die Signal nach persönlicher Willkür. Ich kann also keine Reihenfolge von den einzelnen Signalen brauchen, sondern greife jeden Kanal einzeln ab.

  • Sooo, sorry das ich so lange nix geschrieben hab, war spontan n paar tage auf Dienstreise und konnte unterwegs zwar lesen, aber da ich keine arduino Software greifbar hatte bin ich nicht so recht damit weiter gekommen.

    Danke auf jeden fall, das ganze hat mir schon sehr viel weiter geholfen. das Grundprinzip war mir klar, aber wie nun jetzt die Unterscheidung der einzelnen Kanäle am Empfänger funktioniert war mir nicht klar.

    Mit dem wissen machen nun aber auch die 200ms der vorgefertigten software sinn: ein wert 20ms, der gebildete wert ist der mittelwert aus 10 werten --> 200ms dauert es, bis ein wert ermittelt wird.

    Und auch klar wird mir jetzt, warum zwar vielleicht die 200ms stimmen, es mir aber so viel kürzer vorkommt, wenn ich diesen wert auslese. es ist ja immer das Mittel der letzten 10 werte, also wenn ich von 0 auf 255 springen würde mit dem input dauert es 200ms, bis er auf genau 200ms kommt, aber alle 20ms wird ein neuer Mittelwert gebildet, das siganl wird dadurch also nicht verzögert, sondern einfach nur gedämpft.

    Mit dem wissen konnte ich das auch so nachvollziehen - ist nicht einfach weil ja auch die arduino Ausgabe etwas delay hinzufügt, aber es ist schon erkennbar, dass die Ausgabe bei schnellem gas/bremse etwas "hinterher hinkt".

    Nun aber zu der Theorie, wie das ganze dann ausgelesen wird: hier übersteigt das noch etwas meine Fähigkeiten mit Elektrotechnik und Programmiersprachen. Ich hab mir mal den RCReceive Code angesehen und dort verliere ich ziemlich schnell den überblick, was da gemacht wird.

    Ich denke fürs erste werde ich nun doch den Code so nutzen (nur das Thema failsafe werde ich mir nochmal genauer ansehen um dann auch sicher zu sein, dass das so passt - muss mal sehen ob ich irgendwie eine störquelle schaffen kann als Test).

    Denn was ich ja noch immer nicht hinbekommen habe: die Eingangswerte vernünftig und effizient umrechnen auf motorsignale und dann die motoren korrekt ansteuern.

    Ich hab nen ganz kurzen code geschrieben, der einfach nur Vollgas in beide Richtungen und auf der stelle drehen kann - das klappt, ist aber natürlich nicht praktikabel.

    Das wird also die nächste Station.

    Parallel habe ich allerdings schon mal angefangen mir Gedanken zu einem roboterdesign zu machen, um dann auch was zu haben, dass man in einem Wettkampf einsetzen könnte. Dazu wirds aber vermutlich nen eigenen thread geben, da ich hier eher auf fertige Hardware gehen werde. Denke es ist sinnvoller, das Projekt in 2 Einzel Projekte aufzuteilen und wenn beide Projekte laufen kann man das immer noch zu einem neuen zusammenführen.

    Auf jeden Fall erstmal ein riesen Dankeschön an euch beide, ihr habt mich schon weiter gebracht als ich dachte, zu Beginn des projektes überhaupt zu kommen!!! :thumbup:

    • Offizieller Beitrag

    Wir sind hier gerade in Dortmund auf der Intermodellbau. Zum Tippen nur das Smartphone.

    Mit dem Failsafe, das ist eigentlich ganz einfach einfach. Der Timer muss einen Wert zwischen 0.8 und 2.2 ms. Wenn der Wert '0' ist, dann ist an diesem Kanal somit kein Signal eingetroffen.

    Das fragst Du z.B. 10 mal ab. Wenn die Summe immer noch '0' ist, dann liegt somit Funkausfall vor. Also den Motor mit Stellwert 0% beaufschlagen.

    Testen:

    An der Funke Vollgas geben, die Motoren müssen laufen. Dann die Funke abschalten. Der letzte empfangene Wert von der Funke würde normalerweise den Motor weiterlaufen lassen. Es gibt keinen 'neueren' Stellwert von der Funke als vor dem Abschalten. Jetzt muss Deine Failsafe-Routine eingreifen und dem Motor zwangsweise eine Geschwindigkeit von 0% geben.

  • Vorab mal: ich hoffe ihr hattet ein gutes Wochenende und ganz selbstlos hoffe ich, es wurden en paar Videos von dem Kämpfen gemacht?

    Ok, das mit dem Failsafe hatte ich mir komplizierter vorgestellt. Das klappt sehr gut, wenn er jetzt aus seinem Stack von 10 Werten mindestens 3 findet, die außerhalb der Range sind geht er auf einen anderen Programmcode, der dann die LED auf dem Arduino blinken lässt und alle Motoren auf 0 setzt und die Bremse setzt (letzteres ist jetzt für den ersten versuchsaufbau irrelevant, aber wenn da mal eine waffe dran hängen sollte sicher nicht schlecht, wenn diese direkt abgebremst wird und nicht frei auslaufen muss. wenn der ESC das schon unterstützt kann man das ja nutzen :) ).

    Die LED sieht man dann im verbauten Roboter zwar nicht, aber für den Test sehr gut, damit ich weiß, dass der code auch wirklich das macht, was ich möchte und nicht einfach nur durch einen fehler im code nicht mehr funktioniert.

    Da das ganze aber nicht die Wertermittlung unterbricht, prüft er dauerhaft weiter und sobald wieder mindestens 8 der 10 Werte iO sind geht er wieder in betriebsmodus.

    Jetzt wieder zurück zur Ansteuerung der Motoren, hier bin ich gerade am überlegen, ob es leichter zu rechnen geht, wenn ich die Eingangssignale auf % werte umrechne (bei arduino gibt es eine Funktion, mit der man eingangswerte auf eine bestimmte range mappen kann. weiß nicht ob das eine Arduino eigene sache ist oder in C auch so einfach funktioniert).

    Da bei der Funke der Gas-Kanal seinen mittelwert nicht in der mitte hat sondern für dosiertes gas geben 2/3 vorwärts und 1/3 rückwärts ist, tu ich mich vermutlich leichter, wenn beide kanäle einfach bei 0 ihren mittelpunkt haben und nicht einer bei 127und der andere bei 85. Da kann ich dann auch gleich eine Deadzone einbauen, damit die werte z.B. nur bis 120 und dann wieder erst ab 130 verteilt werden und dazwischen konstant 0 ausgegeben wird.

    Sollte dann gehen über den kurzen befehl

    Code
    map(Gas, 90, 255, 0, 255)    //Eingangswert von Kanal 1 im Bereich 90-255 umverteilt auf 0,255
  • EmoJack also Gestern (Sonntag) wurden von Jedem kampf Videos gemacht. sogar schon Fertig Geschnitten. Bedeute die müssen nur noch Online gestellt werden. Also da keine Angst :D

    Alles ist gut solange die Kamera läuft. 8)