RC-Receiver PWM-Signal Rückwärtsgang erkennen

Hallo zusammen,

über die folgende, recht einfache Anweisung (funktioniert über attachInterrupt) lese ich das PWM-Signal an einem 2.4GHz-Empfänger aus.

if (digitalRead(gasPin) == HIGH) 
{
  Counter = micros();
}
else
{
  Throttle = micros() - Counter; 
  Counter = 0; 
}

Soweit funktioniert alles nach Plan.
Sobald der Wert für "Throttle" unter einem bestimmten Schwellwert ist, bremst das Fahrzeug oder fährt rückwärts.
Meine Frage ist, wie ich herausfinden kann, wie die aktuelle Fahrbewegung aussieht. Ich würde nämlich gerne unterscheiden können, ob das Fahrzeug nur bremst oder rückwärts fährt.
Mit Hilfe eines anderen Codes bin ich auf die "Map"-Funktion gestoßen:

 Throttle = map(Throttle, PWMsignalmittelstellung, PWMsignalmaximalstellung, -100, 100);

Jedoch werden auch hier nur Werte zwischen -100 (Bremsen oder Rückwärtsgang Vollauschlag) und 100 (Vollgas) erzeugt. Ich bin mir nicht sicher, ob ich auf einem Holzweg bin. Deshalb bin ich für jegliche Hilfe dankbar.
Wie kann ich mit Hilfe des PWM-Signals möglichst einfach herausfinden, ob das Fahrzeug bremst oder rückwärts fährt?

Beste Grüße

Markus12345

Ich kann das nicht ganz nachvollziehen, was du da insgesamt machst, aber am Low/High Verhältnis des PWM Signals sieht man die Servostellung bzw. in deinem Fall die Stellung des ESC.

Hallo,

Schau mal mit pulseIn nach den Kalibrierwerten deiner Funke.
Wird so zwischen 960 und 1900 liegen für Vollgas retour /vor.
Der Mittelwert ist Bremse.

mfg Martin

Hallo zusammen,

Wasjetzt:
Schau mal mit pulseIn nach den Kalibrierwerten deiner Funke.
Wird so zwischen 960 und 1900 liegen für Vollgas retour /vor.
Der Mittelwert ist Bremse.

Mit der zu Beginn gezeigten Anweisung berechne ich die Pulsweite in Mikrosekunden, wenn das Signal "high" ist. Mit der "PulseIn"-Funktion mache ich genau das gleiche, oder verstehe ich Deinen Ansatz falsch?
Das Problem ist, dass ich durch das Auslesen der Zeit in Mikrosekunden keinerlei Informationen darüber erhalte, ob das Fahrzeug aktuell bremst oder rückwärts fährt, sondern nur, dass der Hebel nach vorne gedrückt wurde. Oder ändert sich noch etwas anderes am Duty Cicle?
Um mein Vorhaben nochmal zu verdeutlichen:

Ab Minute 01:15 kann man erkennen, dass das Rückwärtslicht angeht. Anschließend wird gebremst und da Bremslicht wird aktiviert.

Danke für Eure Hilfe.

Viele Grüße

Markus

Hallo,

Testen und anpassen:

int Gas; //Wert des Eingangssignale
int led = 13;
void setup()
{ Serial.begin (9600);
 pinMode(led, OUTPUT);  
pinMode(2, INPUT); //Gas vom Empfänger
}
void loop()
{
Gas = pulseIn(2, HIGH); //PWM vom Gaskanal messen
if (Gas < 1540 & Gas > 1500) { 
    digitalWrite(13, HIGH);
    } 
    else {
    digitalWrite(13,LOW); 
    }
    Serial.println(Gas );
}

mfg Martin

Das ist nun ein typisches Beispiel, wo es an der Problembeschreibung hapert. Das Video macht es deutlich, wenn man genau hinschaut. Beim ersten "Hebel zurück" bremst das Auto, beim zweiten geht es erst in den Rückwärtsgang.

Um zu wissen, ob die Karre rückwärts fährt, musst du noch die Polarität der Motorspannung checken und in die Logik mit einfliessen lassen.

Hallo,

falls im Auto eine H-Brücke verbaut ist, dann gibts auch 2 digitale Signale für vorwärts/rückwärts bzw. nur ein Signal mit Low/High für vorwärts/rückwärts. Rein aus dem PWM Signal kann man keine Fahrtrichtung erkennen. Beim richtigen Auto kannste auch nicht an Hand der Motordrehzahl erkennen ob du vorwärts oder rückwärts fährst. Dabei ersetzt das Getriebe die H-Brücke.

Hallo,

Kommt auf den Regler an.
"Normal" : 900-1500 rückwärts, 1550 bis 1900 vorwärts, Mittelstellung Bremse.
Fahrtrichtung ist im PWM-Signal enthalten.

Gibt auch Regler, die erst nach einem kurzen "Rückwärts " die bremse aktivieren.

mfg Martin

Es kommt auf den konkreten Regler an.
Modellauto-Regler haben eigentlich immer eine eingebaute Logik. Teilweise bremsen sie beim ersten Mal rückwärts-fahren, teilweise bremsen sie eine gewisse Zeit, schalten dann auf rückwärts um....dazwischen gibts noch Varianten.
Das kann praktisch nur über einen Sensor am Motor sicher detektiert werden, da teilweise auch aktiv gebremst wird (passiv meint hier, einfach die Wicklungen kurz schliessen), da gibts am Reglerausgang dann so viele Möglichkeiten, dass es enorm aufwändig wäre, das zu untersuchen.
Das "einfachste" ist wirklich ein Encoder am Motor.

Hallo zusammen,

es handelt sich um folgendes RC-Fahrzeug:
http://www.der-schweighofer.de/artikel/122758/tayphoon_1-8_4wd_rtr_2.4_ghz_brushless_modster

Martin, ich habe Deinen Code ausprobiert und komme zu den gleichen Ergebnissen. Leider kann ich daraus nicht die Drehrichtung entschlüsseln. Trotzdem danke für Deine Hilfe.

Sly, vielen Dank für Deinen Tipp. Leider habe ich bei dem Projekt nur bestimmte Bauteile zur Verfügung und ein Encoder ist nicht dabei :frowning:

Mit Vorwiderstand, Diode und Optokoppler müsste das zu machen sein. Encoder ist Overkill :wink:

In dem Video wird erst gebremst, dann nach neutral geht es auf rückwárts. Bei aktiver Bremse geht es wahrscheinlich aber doch nur über Encoder.

Edit: Lese gerade, is BL. Also doch Encoder :frowning:
oder mitzählen

Oder ne gescheite Funke und den Rückwártsgang auf einen eigenen Kanal

Hallo,

Hast den Sensorlosen Hobbywing ICE Regler drinnen ?

Fahren ist klar, Hebel zurück.
Hebel nach vor Bremse, Hebel in mittelstellung und wieder nach vor..Retourgang ?

mfg Martin

Hallo Martin,

entschuldige, dass ich erst jetzt anworten kann.
Ja, Du hast Recht. Wenn ich den Hebel ziehe, fährt das Fahrzeug im Vorwärtsgang. Sobald ich den Hebel schnell nach vorne drücke, bremst es. Außerdem wird die Bremse so lange gehalten, bis der Hebel wieder in Mittelstellung ist. Sobald ich dann erneut nach vorne drücke, fährt das Fahrzeug rückwärts.

Viele Grüße

Markus

Dann isses ja nun wirklich einfach: einfach "Hebel beobachten".

Hallo,

Geht mit dem Hebel ohne zusätzliche Hardware.

Normal vorwärts Fahren > Merker 1 setzen.
Hebel nach vor + Merker1 = Bremslicht.
Hebel auf Neutral > Merker 1 löschen, Merker2 setzen.
Hebel nach vor + Merker2 = Rückfahrscheinwerfer....
versuchs mal.

mfg Martin

Hallo Sly und Martin,

so habe ich es jetzt vorgestern auch gelöst.
Ich habe einen Bereich für die Mittelstellung der Gaspedalstellung von 1500 bis 1600 ausgewählt.
Wenn ich das erste Mal von Vorwärtsgang (>1600) zu Mittelstellung gehe, dann wird ein Timer gestartet. Wenn ich unter 1500 bin, endet der Timer. Falls ich länger als eine bestimmte Zeit (in meinem Fall eine Sekunde) in der Mittelstellung war, löst das Rücklicht aus, ansonsten das Bremslicht. Wenn ich weniger als eine Sekunde in der Mittelstellung bin, löst folglich das Bremslicht aus.
Diese Zeit ist bis jetzt leider etwas lang gewählt. Das heißt, dass manchmal das Bremslicht auslöst, obwohl sich das Rad rückwärts dreht und eigentlich das Rücklicht an sein müsste. Wahrscheinlich kann ich die Zeit nur über "Trial&Error" genauer anpassen. Oder habe ihr eine bessere Idee?

Viele Grüße

Markus

Hallo,

Pulswerte deiner Funke anpassen...

 int Standlicht= 4;
  int Scheinwerfer= 5;
  int Bremslicht= 13;
  int Ruckfahr= 6;
  int Blink_L= 7;
  int Blink_R= 8;
  int Throttle=0;
  int Steer=0;
  int Log1=0;
  int Log2=0;
  int BlinkL_L =0;
  int BlinkL_R=0;
void setup(){
  Serial.begin (9600);
  pinMode(2, INPUT); //Throttle
  pinMode(3, INPUT); //Steering
  pinMode(Standlicht, OUTPUT);
  pinMode(Scheinwerfer, OUTPUT);
  pinMode(Bremslicht, OUTPUT);
  pinMode(Ruckfahr, OUTPUT);
  pinMode(Blink_L, OUTPUT);
  pinMode(Blink_R, OUTPUT);
  digitalWrite(Standlicht, HIGH); 
}
void loop(){
  // Auswertung Throttle
Throttle = pulseIn(2, HIGH); //PWM vom Gaskanal messen

 // Bremse & Rückfahrscheinwerfer
if (Throttle > 1540) { Log1 = 1 ;}
if ( Throttle < 1500 && Log1 == 1  ){ digitalWrite(Bremslicht, HIGH); Log1 = 0; } //Brake
if (Throttle > 1510 && Log1 == 0) {digitalWrite(Bremslicht, LOW); Log2 = 1; }
if (Log2== 1 && Throttle < 1500) { digitalWrite(Ruckfahr, HIGH);}// RFLicht
if (Log2 == 1 && Throttle > 1530 ) {digitalWrite(Ruckfahr, LOW);Log2 = 0; }
// Scheinwerfer
 if (Throttle > 1540) {  digitalWrite(Scheinwerfer, HIGH);}
 else {  digitalWrite(Scheinwerfer, LOW);}
 
   // Auswertung Steering
 Steer= pulseIn(3, HIGH); //PWM Lenkung messen
//1560 MS
if (Steer < 1540){ BlinkL_L = 1;}
else { Blink_L = 0;}
if (Steer > 1580){ BlinkL_R = 1;}
else { Blink_L = 0;}
}

mfg Martin

Hi Martin,

danke für Deinen Ansatz. Ich werde ihn nächste Woche sofort testen.

Viele Grüße und ein schönes Wochenende!

Markus