Sketch für Platine "Die Gelbe" für Arduino NANO oder UNO

  • Hallo,

    die Platine "Die Gelbe" habe ich für ein nicht-Modellbau-Projekt entwickelt und dient dazu ein Servo über 4 Schalteingänge auf einstellbare Positionen zu fahren. In meiner Anwendung werden die Schalteingänge über einen 433MHz Funkempfänger angesteuert, man kann dies aber natürlich auch über ein herkömmliches Schaltmodul oder Sensoren (Schalter/Taster usw.) tun. Weiterhin ist Platz für einen Taster 6x6 mm und ein Trimm-Poti (stehend) vorgesehen, sowie eine LED mit Vorwiderstand.

    Der Sketch für die Platine hat folgende Funktionen:

    Das Servo an J2 wird über ein Signal an den Schalteingängen D3 bis D6 auf die programmierte Position/en gefahren, dabei wird zwischen kurzer und langer Betätigung unterschieden:

    • kurz an D4 fährt das Servo auf die linke Position und nach der eingestellten Haltezeit zurück auf die Mittelstellung; lang an D4 fährt das Servo auf die linke Position und es bleibt dort stehen bis ein Signal über D3, D5 oder D6 erkannt wird
    • kurz an D5 fährt das Servo auf die rechte Position und nach der eingestellten Haltezeit zurück auf die Mittelstellung; lang an D5 fährt das Servo auf die rechte Position und es bleibt dort stehen bis ein Signal über D3, D4 oder D6 erkannt wird
    • kurz an D3 fährt das Servo zurück auf die Mittelstellung
    • kurz an D6 fährt das Servo erst auf die linke Position und nach der Haltezeit auf die rechte Position, dann nach der Haltezeit wieder auf die Mittelstellung (Signale an D3, D4 und D5 werden solange ignoriert)
    • lang an D6 fährt das Servo erst auf die rechte Position und nach der Haltezeit auf die linke Position, dann nach der Haltezeit wieder auf die Mittelstellung (Signale an D3, D4 und D5 werden solange ignoriert)
    • Kalibrierungs-Routine für Servo-Positionen und Haltezeit, wird über den Taster gestartet
    • Poti zur Einstellung der Servo-Positionen (Mitte, Rechts und Links) und Haltezeit
    • Eingestellte Werte werden im EEPROM abgespeichert und bei jedem Start des Arduino ausgelesen, so daß die Kalibrierung nur einmalig nötig ist
    • Schalteingang über positives (z.B. mit Funkempfänger) oder negatives Signal
    • LED leuchtet, wenn sich das Servo nicht in der Mittelstellung befindet

    Anwendungsbeispiel:

    Eine Türe/Klappe öffnen oder einen Kran/den Turm einer Kanone auf rechte oder linke Position drehen, je nach Betätigungsdauer mit automatischer Rückstellung nach Ablauf der Haltezeit oder Verweilen auf Position bis ein neues Steuersignal erkannt wird.

    Kalibrierung:

    Es wird empfohlen, das Poti vor dem Starten der Kalibrierung in die Mittelstellung zu bringen um einen unerwünschten Ausschlag nach rechts oder links zu vermeiden!

    • Taster 1x kurz drücken startet die Kalibrierung, es kann nun die Mittelstellung über das Poti eingestellt werden. Die LED blinkt währenddessen 1x schnell.
    • Taster 1x kurz drücken speichert den Wert für die Mittelstellung; nun kann die linke Position über das Poti eingestellt werden. Die LED blinkt währenddessen 2x schnell.
    • Taster 1x kurz drücken speichert den Wert für die linke Position; nun kann die rechte Position über das Poti eingestellt werden. Die LED blinkt währenddessen 3x schnell.
    • Taster 1x kurz drücken speichert den Wert für die rechte Position; nun kann die Haltezeit (500 bis 10.000 ms) über das Poti eingestellt werden. Die LED blinkt währenddessen 4x schnell.
    • Taster 1x kurz drücken fährt das Servo auf die linke Position für die Dauer der Haltezeit. Dieser Schritt kann beliebig oft wiederholt werden, so daß die Änderungen über das Poti sofort überprüfbar sind.
    • Taster 1x lang drücken speichert die Haltezeit. Die LED leuchtet für 2 Sekunden und zeigt das Ende der Kalibrierung an. Danach wird das Programm gestartet.

    Im Serial Monitor der Arduino IDE können die Einstellungen während der Kalibrierung nachverfolgt werden. Im Loop-Teil sind diese ausgeklammert, können aber z.B. zur Fehlersuche aktiviert werden, in dem man die „//“ Zeichen vor den Serial.print(ln) Zeilen entfernt.

    Der Sketch ist für positive (5V) oder negative (GND/Minus) Schaltsignale vorhanden. Bei Verwendung von positiven Signalen (wie beim Funkempfänger) muß das Widerstands-Netzwerk als Pull-Down eingesetzt werden. Bei negativen Signalen werden die internen Pull-Up Widerstände des Arduinos verwendet, das Widerstands-Netzwerk darf dann nicht auf die Platine gelötet werden!

    Im Sketch kann die minimale und maximale Impulslänge (544 bis 2400 μs) eingestellt werden, abhängig vom verwendetem Servo oder zum Begrenzen der Endpunkte. Diese Werte werden dann auch bei der Kalibrierung berücksichtigt.

    Die Haltezeit kann von 500 bis 10.000 ms eingestellt werden, eine Änderung im Sketch ist möglich.

    Benötigte Bibliotheken:

    Button.h - Button-Arduino 2.0.0 by Davide Palladino

    Servo.h - in Arduino IDE enthalten

    EEPROM.h - in Arduino IDE enthalten

    Allzeit Gute Fahrt,
    Reiner :fahrer

    5 Mal editiert, zuletzt von Racker (2. November 2021 um 23:17)

  • Sketch für Steuerung der Schalteingänge über negative (Minus) Schaltsignale - Teil 1:

    Allzeit Gute Fahrt,
    Reiner :fahrer

    2 Mal editiert, zuletzt von Racker (2. November 2021 um 22:25)

  • Teil 2:

  • Sketch für Steuerung der Schalteingänge über positive (Plus) Schaltsignale - Teil 1:

    Teil 2 wie oben.

    Allzeit Gute Fahrt,
    Reiner :fahrer

    4 Mal editiert, zuletzt von Racker (2. November 2021 um 22:47)

  • Servo-Umpoler / Servo-Reverse

    Hallo,

    hier ist ein weiterer Sketch um mit der Platine "Die Gelbe" einen Servo-Umpoler / Servo-Reverse zu realisieren. Der Sketch ist sehr einfach und benötigt nur die Servo-Bibliothek. Da der Arduino nicht viel zu tun hat wird die Fuktion pulseIn() verwendet. Es ist keine Kalibrierung o.ä. nötig, daher werden Poti und Taster auch nicht benötigt.

    Ein Pull-Down Widerstand an Port D3 ist empfohlen, dieser kann über das Widerstands-Netzwerk oder einen einzelnen Widerstand zwischen RN1 Masse und RN1 D3 realisiert werden.

    Die min/max Werte für das Ausgangs-Signal können im Sketch eingestellt werden. Somit kann auch der (invertierte) Weg des Servo begrenzt werden.

    Die LED auf dem Arduino Board sowie die (optionale) LED auf der Platine zeigt folgende Zustände an:

    - LED blinkt wenn kein Signal empfangen wird

    - LED leuchtet dauernd, wenn das Impuls-Signal am Eingang außerhalb der eingestellten Werte liegt

    PWM Eingang: D3 (J4 Pin 1-3)

    Hier kann eine 3-polige Stiftleiste eingesetzt werden, so daß der Empänger über ein normales Servo-Patchkabel angeschlossen werden kann. Wenn der Arduino über eine externe Spannung (5V) versorgt wird muß das rote Kabel aus dem Servo-Stecker gezogen werden!

    Eine externe Spannungsversorgung (BEC) ist immer dann empfohlen, wenn das Servo einen hohen Strom zieht. Die Speisung der Platine erfolgt dann über J1 oder J4 und muß exakt 5V betragen.

    PWM Ausgang: D9 (J2)

    Anschluß für Servo oder Fahrregler.

    Allzeit Gute Fahrt,
    Reiner :fahrer

    Einmal editiert, zuletzt von Racker (6. November 2021 um 16:21)

  • Servo-Wegbegrenzung

    Hallo,

    und noch ein Sketch um mit der Platine "Die Gelbe" eine einstellbare Servo-Wegbegrenzung zu realisieren. Die Einstellung erfolgt durch eine Kalibrierungs-Routine mit nur 2 Stufen, für den linken und rechten Endpunkt.

    Poti und Taster werden zur Kalibrierung benötigt. Der Taster muß länger als 750ms gedrückt werden um die Kalibrierung zu starten, zum nächsten Schritt zu springen bzw. die Kalibrierung zu beenden. Das Ende wird durch ein Leuchten der LED für 2 Sekunden angezeigt. Wie oben kann die Kalibirierung bei Bedarf im Serial Monitor verfolgt werden. Die eingestellten Werte werden im EEPROM gespeichert.

    Die min/max Werte für das Ausgangs-Signal können im Sketch eingestellt werden und werden bei der Kalibrierung berücksichtigt.

    Da der Arduino nicht viel zu tun hat wird die Fuktion pulseIn() verwendet.

    Ein Pull-Down Widerstand an Port D3 ist empfohlen, dieser kann über das Widerstands-Netzwerk oder einen einzelnen Widerstand zwischen RN1 Masse und RN1 D3 realisiert werden.

    Die LED auf dem Arduino Board sowie die (optionale) LED auf der Platine zeigt folgende Zustände an:

    - LED blinkt wenn kein Signal empfangen wird

    - LED leuchtet dauernd, wenn das Impuls-Signal am Eingang außerhalb der eingestellten Werte liegt

    - Während der Kalibrierung blinkt die LED entsprechend der Stufe (Stufe 1 - links: 1x, Stufe 2 - rechts: 2x)

    - Am Ende der Kalibrierung leuchtet die LED für 2 Sekunden

    PWM Eingang: D3 (J4 Pin 1-3)

    Hier kann eine 3-polige Stiftleiste eingesetzt werden, so daß der Empänger über ein normales Servo-Patchkabel angeschlossen werden kann. Wenn der Arduino über eine externe Spannung (5V) versorgt wird muß das rote Kabel aus dem Servo-Stecker gezogen werden!

    Eine externe Spannungsversorgung (BEC) ist immer dann empfohlen, wenn das Servo einen hohen Strom zieht. Die Speisung der Platine erfolgt dann über J1 oder J4 und muß exakt 5V betragen.

    PWM Ausgang: D9 (J2)

    Anschluß für Servo oder Fahrregler.

    Benötigte Bibliotheken:

    Button.h - Button-Arduino 2.0.0 by Davide Palladino

    Servo.h - in Arduino IDE enthalten

    EEPROM.h - in Arduino IDE enthalten

  • Servo-Expander / Servo-Stretcher

    Hallo,

    und zu guter Letzt noch ein Sketch um mit der Platine "Die Gelbe" einen Servo-Expander / Servo-Stretcher zu realisieren. Der Sketch ist relativ einfach, berücksichtigt aber auch die unsymmetrische Aufteilung zwischen oberen (1500 bis 2400) und unteren (544-1500) Bereich für das Impuls-Signal am Ausgang. Benötigt nur die Servo-Bibliothek.

    Da der Arduino nicht viel zu tun hat wird die Fuktion pulseIn() verwendet. Es ist keine Kalibrierung o.ä. nötig, daher werden Poti und Taster auch nicht benötigt.

    Ein Pull-Down Widerstand an Port D3 ist empfohlen, dieser kann über das Widerstands-Netzwerk oder einen einzelnen Widerstand zwischen RN1 Masse und RN1 D3 realisiert werden.

    Die min/max Werte für das Eingangs- und Ausgangs-Signal können im Sketch eingestellt werden.

    Die LED auf dem Arduino Board sowie die (optionale) LED auf der Platine zeigt folgende Zustände an:

    - LED blinkt wenn kein Signal empfangen wird

    - LED leuchtet dauernd, wenn das Impuls-Signal am Eingang außerhalb der eingestellten min/max Werte liegt (in dem Fall wird der entsprechende min oder max Wert für das Ausgangs-Signal ausgegeben)

    PWM Eingang: D3 (J4 Pin 1-3)

    Hier kann eine 3-polige Stiftleiste eingesetzt werden, so daß der Empänger über ein normales Servo-Patchkabel angeschlossen werden kann. Wenn der Arduino über eine externe Spannung (5V) versorgt wird muß das rote Kabel aus dem Servo-Stecker gezogen werden!

    Eine externe Spannungsversorgung (BEC) ist immer dann empfohlen, wenn das Servo einen hohen Strom zieht. Die Speisung der Platine erfolgt dann über J1 oder J4 und muß exakt 5V betragen.

    PWM Ausgang: D9 (J2)

    Anschluß für Servo oder Fahrregler.

    Allzeit Gute Fahrt,
    Reiner :fahrer

    2 Mal editiert, zuletzt von Racker (6. November 2021 um 23:33)

  • Dual-Rate (DR)

    Hallo,

    ich hatte mal wieder Langeweile und habe eine Dual-Rate Funktion programmiert. Dual-Rate (DR) skaliert das Signal von 100-0%, so daß der Servoweg eingeschränkt werden kann. DR unterscheidet sich von der Servowegbegrenzung dadurch, das es keinen "harten Stop" gibt sondern der Geber wie Knüppel, Poti oder Schieberegler immer über den ganzen Weg genutzt wird.

    Der Sketch akzeptiert ein Eingangs-Signal mit einer Impulsbreite von 500-2500µs und gibt maximal 600-2400µs aus. Über das Poti kann das Ausgangs-Signal stufenlos (naja, mit einer Auflösung von 1998 Stufen) von 100-0% skaliert werden. Linker Anschlag entspricht 100%, d.h. das Ausgangs-Signal entspricht dem Eingangs-Signal zwischen 600-2400µs, und rechter Anschlag 0%, in dem Fall ist das Ausgangs-Signal immer 1500µs.

    Zusätzlich wurde noch ein Toleranzbereich (+/- 20µs) für die Neutralstellung eingebaut, der Wert kann im Sketch unter PWMneu_tol geändert werden.

    Änderungen über das Poti sind sofort wirksam, können also jederzeit im laufenden Betrieb geändert werden. Ist das nicht erwünscht einfach die folgende Zeile in den setup() Teil schieben:

    Code
    AnalogerWert = analogRead(PotiEingang);

    Änderungen der Poti-Einstellungen erfordern dann einen Reset des Arduinos um wirksam zu werden.

    Da der Arduino nicht viel zu tun hat wird die Fuktion pulseIn() verwendet. Es ist keine Kalibrierung nötig, aber die DR Skalierung wird direkt über das Poti eingestellt. Benötigt wird nur die Servo-Bibliothek.

    Die min/max Werte für das Eingangs- und Ausgangs-Signal können im Sketch eingestellt werden. Änderungen sollten aber nur vorgenommen werden, wenn man weis was man tut. U.U. funktionieren die Berechnungen dann nicht mehr.

    Im Serial Monitor der Arduino IDE können einige Werte nachverfolgt werden. Sie sind z.Zt. ausgeklammert, können aber z.B. zur Fehlersuche aktiviert werden, in dem man die „//“ Zeichen vor den Serial.print(ln) Zeilen entfernt. Die Zeilen können auch gelöscht werden, wenn man sie nicht benötigt.

    Ein Pull-Down Widerstand an Port D3 ist empfohlen, dieser kann über das Widerstands-Netzwerk oder einen einzelnen Widerstand zwischen RN1 Masse und RN1 D3 realisiert werden.

    Die LED auf dem Arduino Board sowie die (optionale) LED auf der Platine zeigt folgende Zustände an:

    - LED blinkt wenn kein Signal empfangen wird

    - LED leuchtet dauernd, wenn das Impuls-Signal am Eingang außerhalb der eingestellten min/max Werte liegt (in dem Fall wird der entsprechende min oder max Wert für das Ausgangs-Signal ausgegeben)

    PWM Eingang: D3 (J4 Pin 1-3)

    Hier kann eine 3-polige Stiftleiste eingesetzt werden, so daß der Empänger über ein normales Servo-Patchkabel angeschlossen werden kann. Wenn der Arduino über eine externe Spannung (5V) versorgt wird muß das rote Kabel aus dem Servo-Stecker gezogen werden!

    Eine externe Spannungsversorgung (BEC) ist immer dann empfohlen, wenn das Servo einen hohen Strom zieht. Die Speisung der Platine erfolgt dann über J1 oder J4 und muß exakt 5V betragen.

    PWM Ausgang: D9 (J2)

    Anschluß für Servo oder Fahrregler.

  • Hallo,

    ich habe ein Problem mit der "Button.h" Bibliothek gefunden, bei der neuen Version 2.0.0 funktioniert das Beenden der Kalibrierungs-Routine durch den langen Tastendruck nicht mehr. Daher bitte nur Version 1.2.1 installieren. Die folgende Zeile

    Code
    Button EingangTaster(12, B_PULLUP, 750);

    muß daher auf

    Code
    Button EingangTaster(12, PULLUP, 750);

    geändert werden.

    Ich kann dies leider oben nicht mehr korrigieren, daher bitte beachten.

  • Oh Mist, auch noch ein Fehler im letzten Beitrag den ich jetzt nicht mehr editieren kann:

    Code
    Button EingangTaster(2, B_PULLUP, 750);

    ändern nach

    Code
    Button EingangTaster(2, PULLUP, 750);

    Dazu "Button-Arduino" Bibliothek Version 1.2.1 installieren, nicht auf Version 2.0.0 updaten!

  • Servo Slower / Servo Delay

    Hallo,

    das hat uns noch gefehlt .... jetzt gibt es endlich auch einen Servo Slower aka Servo Delay!

    Der Sketch akzeptiert ein Eingangs-Signal mit einer Impulsbreite von 500-2500µs und gibt maximal 544-2400µs aus. Der Sketch verlangsamt die Servo-Bewegung, in dem zwischen jedem Schritt eine Verzögerung eingefügt wird. Über das Poti kann die Verzögerung eingestellt werden, die Änderungen sind sofort wirksam, können also jederzeit im laufenden Betrieb angepasst werden.

    Die Verzögerung kann über eine Änderung im Sketch in µs oder ms erfolgen; ist eine Verzögerung in ms gewählt sind somit auch sehr langsame Bewegungen möglich.

    Die Werte für 'minimale Verzögerung' und 'maximale Verzögerung' in µs oder ms können im Sketch ebenfalls eingestellt werden. Sehr hohe Werte (über 10000) machen wenig Sinn, da die Auflösung des analogen Eingangs nur 1024 Einheiten beträgt, statt dessen sollte dann besser die Verzögerung von µs auf ms umgestellt und der Wert für die 'maximale Verzögerung' entsprechend angepasst werden.

    Der Sketch nutzt statt der Funktion pulseIn() den Hardware-Interrupt von Pin D3 zum Berechnen des PWM Signals. Es wird auch kein delay() für die Verzögerung genutzt, statt dessen wird diese über die Funktionen micros() bzw. millis() berechnet (s.o.). Dadurch ist der Sketch blockierungsfrei aka non-blocking.

    Ein Pull-Down Widerstand an Port D3 für den PWM Eingang ist empfohlen, dieser kann über das Widerstands-Netzwerk oder einen einzelnen Widerstand zwischen RN1 Masse und RN1 D3 realisiert werden.

    Die LED auf dem Arduino Board sowie die (optionale) LED auf der Platine blinkt wenn beim Einschalten kein PWM Signal empfangen wird. Sobald ein PWM Signal empfangen wurde erlischt die LED und bleibt auch aus, wenn danach kein PWM Signal mehr empfangen wird.

    PWM Eingang: D3 (J4 Pin 1-3)

    Hier kann eine 3-polige Stiftleiste eingesetzt werden, so daß der Empänger über ein normales Servo-Patchkabel angeschlossen werden kann. Wenn der Arduino über eine externe Spannung (5V) versorgt wird muß das rote Kabel aus dem Servo-Stecker gezogen werden!

    Eine externe Spannungsversorgung (BEC) ist immer dann empfohlen, wenn das Servo einen hohen Strom zieht. Die Speisung der Platine erfolgt dann über J1 oder J4 und muß exakt 5V betragen.

    PWM Ausgang: D9 (J2)

    Anschluß für Servo oder Fahrregler.

    Als nächstes kommt dann der Servo Beschleuniger. :wech

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!