Mit RC Empfänger Arduino steuern

Moin,

hab mal ne Frage. Ich möchte mit meiner Fernsteuerung mit Hilfe von 2-Wege Schaltern Funktionen steuern.
Wenn ich das richtig verstanden habe, dann gibt der Empfänger PWM Signale mit einem Wert von 1000-2000 ys aus. Da ich jetzt nichts proportional steuern möchte bin ich im Forum über ein kleines Programm gestolpert, welches mir hier nützlich sein könnte, wenn es denn funktioniert. Leider ist im Forum dieses Thema nicht weiter verfolgt worden.
Hier mal das genannte Programm:

int PWMpin1 = 4;
int LEDout1 = 6;

void setup() {   
   pinMode(4, INPUT);
   Serial.beginn(115200);

}
void loop() {
   int pwm1 = pulseIn(PWMpin1, HIGH);
   Serial.printIn(pwm1);
   if((pwm1 > 1200)&&(pwm1 < 1400))
 {
    digitalWrite(LEDout1, HIGH);
 }
   else
   {
    digitalWrite(LEDout1, LOW);
   }
}

Nun zu meiner Beschreibung:

Wenn Schalter 1 von HIGH auf LOW gesetzt wird, soll an einem PWM Ausgang erstmal ein Wert von ca. 1500ys ausgegeben werden. Dieser Wert soll ca. 3-4 s gehalten werden und dann auf LOW gestellt werden. Wird der Schalter von LOW auf HIGH gesetzt soll das ganze in umgekehrter Reihenfolge zurück gehen.
Ähnliches soll bei Schalter 2 passieren. Hier sollen aber 2 Ausgaben nacheinander erfolgen. Erstmal soll ein Servo von eine Position in eine andere gefahren werden. Nach einer kurzen Wartezeit von ca. 3-5s soll ein Motor-Shield einen Motor in Betrieb nehmen bis ein Endschalter betätigt wird. Auch hier geht es in umgekehrter Reihenfolge zum Ausgangspunkt zurück. Erst der Motor bis zum Endschalter, nach der Wartezeit der Servo zurück in Ausgangsposition.
Realisieren möchte ich das mit einem Arduino Nano.

Wenn ich das richtig verstanden habe, dann muss ich erstmal folgendes tun:

#include <Servo.h>

int PWMch1 = 4;
int PWMch2 = 5;
int AUSGANG1 = 6;
int AUSGANG2 = 7;
int SERVO1 = 8;
int ENDSCAHLTER1 = 9;
int ENDSCAHLTER2 = 10;

void setup() {
   pinMode(PWMch1, INPUT);
   pinMode(PWMch2, INPUT);
   pinMode(AUSGANG1, OUTPUT);
   pinMode(AUSGANG2, OUTPUT);
   pinMode(SERVO1, OUTPUT);
   pinMode(ENDSCAHLTER1, INPUT);
   pinMode(ENDSCAHLTER2, INPUT);
   Serial.begin(115200);
}

Soviel erstmal zur Theorie. Würde von euch nun gerne erstmal wissen, ob dieser Weg mich überhaupt ans Ziel führen kann. Oder sind da schon grundlegende Fehler drin?

Frage zu Schalter 1:

Was ist die umgekehrte Reihenfolge von "mach 3-4 sec. etwas und danach nichts weiter" ?

Dein Titel besagt "Mit RC Empfänger Arduino steuern"

RC-Empfänger -------->---->---->----->-----Arduino (Arduino programm macht was aus dem RC-Signal

Dein Text beschreibt das genaue Gegenteil

Wenn Schalter 1 von HIGH auf LOW gesetzt wird, soll an einem PWM Ausgang erstmal ein Wert von ca. 1500ys ausgegeben werden.

Schalter--->----->----->----Arduino--->------>-------->------RC-Signal

Vielleicht beschreibst du erst mal mit NICHT-Programmier-Worten was da konkret passieren soll.

So konkret wie nur möglich.
Ich mache jetzt ein Nonsens-Beispiel das das Grundprinzip erklären soll:
Das Servo 1 schubst nach einer Wartezeit von 4 Sekunden das Gurkenglas vom Tisch
und Servo 2 betätigt den Schalter vom Wischroboter damit der Wischroboter die Sauerei wegmacht.

Völlig klar du willst keine Gurkengläser schubsen. Aber was macht dein Projekt dann?
vgs

Da ist nicht zufällig ein Aktor dran, der je nach pwm seine Position ändert?

Kann er.
Nu ist es ja nicht Dein erstes Stück Code. Und ja, ich hab geschmult und das mit der Lichtkuppel nochmal nachgelesen. :slight_smile:

Von daher:
Alles was sich nicht verändert: const
Alles was einstellig ist byte
Daraus wird dann u.a.:

const byte PWMch1 = 4;

wobei hier eher ein Ausgang vermutet werden könnte.
Mach da einfach nur ein pSwitch1 draus. Das hilft ungemein wenn der Code länger wird.

Und: Achte drauf, wenn Du einen INPUT hast musst Du den auch so beschalten.

Abgesehen von der etwas unkonventionellen funktion des ganzen ...
Die Funktion pulsein() ist blockierend, das heißt der Arduino macht nichts anderes als auf das Signal zu warten und dann die Zeit zwischen L_H und dem nachfolgenden H_L zu messen. Sonst macht er nichts. Das heißt daß er je anch übertragenen Wert und Meßbegin gegenüber dem PWM Signal zwischen 1mS und 22mS blockiert ist. Bei einem PWM HIG Signal von 1 bis 2mS (1000 bis 2000µS)
Grüße Uwe

Ich möchte mal versuchen eure Fragen zu beantworten.

Mit Schalter 1 und 2 meinte ich Schalter AN meiner Fernbedienung. Also schon ein Signal, welches aus dem Empfänger in den arduino geht.

Schalter an Fernbedienung--->Empfänger--->Arduino--->Funktion

Die Funktion von Schalter 1 und 2 sind absolut unabhängig von einander.

An Schalter 1 hängt kein Aktor dran. Es soll lediglich ein 3 Wege-Schalter simuliert werden. Wobei halt die mittelstellung zeitgesteuert ist.
Zur genaueren Beschreibung von Schalter 1: es soll ein Rauchmodul mit Lüfter geschaltet werden. Nach dem einschalten soll die Heizspirale ca. 3s vorheizen. Wenn ich nun nicht den Lüfter einschalte, brennt die Spirale durch. Deshalb möchte ich keinen echten 3-Wege-Schalter nutzen (was natürlich einfacher wäre, aber die Gefahr birgt, das Rauchmodul zu zerstören). Beim ausschalten läuft der Lüfter nach. Die Steuerung dafür übernimmt die Steuerplatine von dem Rauchmodul. Ich brauche also für die Steuerplatine ein LOW (>1200ys), ein HIGH (<1800ys) und eine Mittelstellung (>1400,<1600ys), die ein 2-Wege-Schalter nunmal nicht hat.

Schalter 1 aus: Alles aus (Wert <1200ys)
Schalter 1 an: für 3s wird ein Wert zwischen 1400 und 1600ys ausgegeben (Spirale heißt), danach wird ein Wert von >1800ys ausgegeben (Lüfter läuft)
Schalter 1 aus: für 3s ein Wert zwischen 1400 und 1600 (Heißspirale geht aus), danach ein Wert <1200 (Lüfter geht aus)

Die Funktion pSWITCH kenne ich noch nicht.

So, hoffe alle Fragen beantwortet zu haben.

Gruß Andre

Was du leider noch nicht geschrieben hast, ist die Fernbedienung, die du verwendest.
Bitte am besten einen Link dazu posten oder eine sehr genaue Beschreibung sowie den Typen angeben. Ebenso von deinem Rauchmodul, damit wir uns vorstellen können, was da genau verbaut wird.
Leider verstehe ich von deiner Beschreibung fast nichts.

Also Du möchtest daß wenn ein Schalter, der auf der Fernbedienung (Sender) sitzt, betätigt wird, eine gewisse Folge von PWM Signalen mit definiertem Wert und zeitlicher Länge an ein PWM gesteuertes Gerät ausgegeben wird.

Von Fernsteuerung Schalter ein (L-H Erkennung).
Ausgabe Arduino:
3 Sekunden: 1400 bis 1600µS Signal
danach >1800µS Signal
Von Fernsteuerung Schalter aus (H-L Erkennung).
Ausgabe Arduino:
3 Sekunden: 1400 bis 1600µS Signal
danach <1200µS Signal

WIe sieht das Signal aus das von der Fernbedienung zum Arduino geht? Ein einfaches digitales Signal 0 und 5V? oder ist es ein PWM SIgnal?

Was soll der Schalter 2 machen? das gleiche?

Grüße Uwe

@apro1974
Frage:
Nutzt Du einen Empfänger mit Summensignalausgang oder werden Schalter 1 und 2 an jeweils eigene Servoausgänge gesteckt?

Der Schalter 2 soll, wie oben schon erwähnt, erst ein Servo und dann einen Motor ansteuern. Zwischen beiden Aktionen soll auch eine Wartezeit sein. Servo (Name des Ausgangs "Servo1") und Motor (Name des Ausgangs "Ausgang2") haben getrennte Ausgänge am Arduino.

Die Ausgänge am Empfänger sind PWM-Ausgänge.

Es sind beides getrennte Servoausgänge am Empfänger

Hoffe der Link funktioniert und erklärt alles.
Taranis X9D Plus SE 2019 - FrSky - Lets you set the limits (frsky-rc.com)

Zum Rauchmodul gibt es keine genauen Daten. Aber auch hier Versuche ich gerne genauer zu beschreiben. Hier kann ich euch ein Bild von der Homepage zeigen. Modellbau (hpage.com) . Die Raucherzeuger werden in Kleinserie Kundenspezifisch angefertigt.
An der Heizspindel wird ein Rauchöl erhitzt. Dieses erzeugt den Dampf, der mit Hilfe des Ventilators dann aus 2 Ausgängen gepustet wird. Vor dem Raucherzeuger wird ein Leistungsbaustein geschaltet. An diesem kann ich dann die Heizleistung und den Ventilator regeln. Der Leistungsregler wird (normalerweise) direkt mit dem Empfänger verbunden. Dazu wird ein 3-Wege-Schalter benötigt (Funktion siehe oben). Diesen habe ich aber gerade nicht zur Verfügung und möchte deshalb einen 2-Wege-Schalter nehmen. Außerdem, wie schon weiter oben beschrieben, besteht die Gefahr, wenn ich den 3-Wege-Schalter in der Mittelstellung vergesse, dass die Heizspindel durchbrennt.

Hoffe ich konnte eure Fragen beantworten.

Gruß Andre

Du hast also 2 normale PWM Ausgangs-Kanäle am Fernsteuerungsempfängerdie der Arduino einlesen soll und je nach Länge des High-Signals und der Zeit die Verstrichen ist etwas machen.
Welche PWM-Zeiten hast Du für Schalter ein und Schalter aus?
Vieleicht ist es auch interresant welchen Empfänger du an der Fernsteuerung hast.

  1. Einlesen der 2 Kanäle:
    1.1)Blockierend: pulseIn() blockiert den Sketch für die Länge der Messung.
    1.2)Nicht Blockierend: Dauernde Messung des Signals und daraus Länge des Impulses berechnen. Da nur 2 Werte möglich sind ist die Erkennung einfacher.

  2. erkennung des Einschalt/Ausschaltzeitpunktes und des daraus ergebenen ablaufsteuerung.

Grüße Uwe

Ach schau, der verkauft sowas auch:

MiniaturNebelmaschine. Ohne Sicherheitsabschaltung, wenns zu warm wird.
250ml Nebelfluid für 5 Euro - Wer kauft sowas?

Mich hätte ja nun noch nen Link zum Empfänger interessiert.
@uwefed war schneller...

Hier der Link zum Empfänger: ARCHER R8 PRO - FrSky - Lets you set the limits (frsky-rc.com)

Ah ja - der hat also 8 PWM out, bei denen noch zwischen 20ms und 7ms umgeschalten werden kann.
"Manual" - 2 Seiten...

Damit wäre dann ja nur die Aufgabe, am Arduino-Pin die erste Flanke zu erkennen, und dann einfach loszulegen - egal was dahinter noch kommt.
Solange, bis auf dem anderen Pin eine erste Flanke kommt.

Oder hab ich das jetzt falsch interpretiert?

Wenn es PWM Ausgänge sind dann mußt Du den ersten langen bzw kurzen Impuls erkennen.

Oder hab ich das jetzt falsch interpretiert?
Grüße Uwe

:slight_smile:
Tjha, das ist jetzt die Frage.
Für mich sieht das so aus, das beim betätigen des switch am Sender der Ausgang ein pwm am zuständigen Pin erzeugt.

Da wäre jetzt die Frage: Was passiert wenn der Taster nicht mehr betätigt wird.
Bleibt der Pegel auf dem letzten Zustand oder gibt es einen definierten.

Denn: Wenn Taster2 betätigt wird, ist der Zustand vom PWM-Ausgang der Taster1 zugeordnet ist, bekannt.

Spätestens wenn Taster1 (wieder) betätigt wird, ist der Pegel von PWM-Ausgang2 - der Taster2 zugeordnet ist auch klar.

Wenn die Ausgänge in "Ruhestellung" der Taster kein PWM sondern nur LOW / oder HIGH / liefern, reicht m.E. eine Flanke.

Aber natürlich muss man das wissen...

Ich bin zwar kein Modellbauer aber ich stelle mir das so vor:
Jeder Schalter an der Fernsteuerung (Sender) ist für einen Kanal am Empfänger zuständig.
Da alle Ausgänge des Empfängers Servosignale ausgeben, nehme ich mal an, daß 2 verschiedene PWM Timings für die 2 Stellungen des Schalters augegeben werden.

Oder hab ich das jetzt falsch interpretiert?

Die mir bekannte Fernsteuerung (Futaba) überträgt die Schalter-, Regler- und Knüppelstellungen ständig an den Empfänger; das wird bei der Taranis nicht anders sein. Der Empfänger erzeugt dann ständig das zum Zustand passende Signal am zugeordneten Servo-Ausgang. Bei Knüppeln und Schiebe-/Drehreglern muss das ja so sein; für die anderen Kanäle macht man das dann auch so - es gibt Empfänger, die (auch) alle Kanäle seriell auf einem Ausgang ausgeben können. Deshalb fragte ich nach Summensignal.
Die Pulslänge beträgt 20ms (oder halt 7) mit Highpegel zwischen 1000μs und 2000μs mit 1500μs als Mittelstellung (siehe z.B. Wikipedia).

Wenn ich das richtig verstanden habe sind tatsächlich zwei Eingänge auszuwerten und einer (für das Servo) zu erzeugen. Die Zeit- und Motormimik ist irgendwo dazwischen unterzubringen.
Beim Rauch könnte man das vermutlich sogar mit pulseIn() machen, das ist ja nicht wirklich zeitkritisch. Bei der Servo/Motorshield-Mimik weiß ich nicht.
Andre, was soll eigentlich passieren, wenn Schalter 1 während der drei Sekunden Heizphase wieder auf LOW geht?

Vermutlich würde ich versuchen, die Flanken der Eingänge über Interrupt zu erfasssen und die High-Phase zu speichern (micros()).
Die Simulation des 3-Wege-Schalters wird dann wohl am einfachsten über MobaTools (MotoServo) mit drei Pulslängenwerten zu erledigen sein.


Gruß Walter

1 Like

Soweit klar.
Wobei ein Eingang 2 Aufgaben erfüllt - das ist aber vollkommen unabhängig.

Jetzt aber:
Da ist eine Taste dran .
Die Taste sendet: Ich bin gedrückt.
Was gibt der Empfänger auf dem PWM-OUT-PIN aus?

Was passiert, wenn die Taste losgelassen wird -> was gibt der Empfänger dann auf dem PWM-PIN aus?

Da der TO in seinem Eingangspost das vermutlich auch irgendwie vermischt hat, komm ich da nicht auf einen Punkt.

Ich steig hier aus.
Vielen Dank für den Wikipedia-Link, der auch mal echt einer ist :wink:

Genau so!!! Keine Summensignale.

Auch dies ist richtig. 2 völlig von einander, unabhängige Eingänge, die nichts mit einander zu tun haben.

Sollte dies wirklich mal der Fall sein, ist das entsprechende Signal LOW.

Wenn du damit meinst, dass je 1 PWM Timing für je einen Schalter ausgegeben wird, dann ja.

Nein, bleibt er nicht.

Wenn der Schalter in Ruhestellung ist, wird ein PWM mit 1000ys erzeugt.

Hoffe eure Fragen beantwortet zu haben.

Gruß Andre