Delay variabel über PWM einstellen

Hi,

ich bin noch blutiger Anfänge und komme an einer Stelle selbst nach langer Recherchen einfach nicht weiter:

Ich möchte mit einer RC Fernsteuerung ein große LED Lampe ansteuern (hierfür brauche ich 5V Output Logik).

Neben einfach nur on / off, möchte ich die Lampe auch blinken bzw. blitzen lassen.

Soweit habe ich bis hier den Sketch auch selbst hinbekommen bzw. zusammengebastelt.

int led = 9; // pin an dem die led angeschlossen ist
int rec = 6; // pin an dem der receiver angeschlossen ist
int ch1;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(rec, INPUT);
}

void loop() {

  ch1 = pulseIn(rec, HIGH);
  if (ch1 > 1600) {
    digitalWrite(led, LOW);
    delay(200);
    digitalWrite(led, HIGH);
    delay(200);
  }
 
  if (ch1 < 1200) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

Nun möchte ich aber gerne über 2 weitere PWM Inputs die Delay-Zeit von HIGH und LOW getrennt voneinander verstellen können. Also so, dass der Abstand zwischen den einzelnen Blitzen sowie die Länge der Blitze an sich einstellbar ist. Hier brauche ich einen Bereich von etwa 50 bis 5000 Millisekunden.

Kann mir jemand helfen, wie ich das Delay variable via PWM einstellen kann?

Vielen Dank!

lukas_1717:
ich bin noch blutiger Anfänge ...

Kann mir jemand helfen, wie ich das Delay variable via PWM einstellen kann?

Mir scheint, Du wirfst da etwas durcheinander. Wenn Du etwas einstellbar machen möchtest, nimmst Du ein Potentiometer oder Trimmer und schließt diesen an einen analogen Eingang an. Den liest Du dann aus und erhältst Werte zwischen 0 und 1024, die Du dann nur noch durch vier teilen musst, um einen Byte-Wert zu erhalten.

Gruß

Gregor

Schau Dir mal BlinkWithoutDelay an, wie man ganz ohne delay() auskommt.

gregorss:
Wenn Du etwas einstellbar machen möchtest, nimmst Du ein Potentiometer oder Trimmer und schließt diesen an einen analogen Eingang an.

Merci Dir Gregor!

Ich muss das ganze leider über die RC Fernsteuerug einstellen können, daher kann ich ja nur mit dem PWM Signal aus dem Receiver arbeiten.

Du solltest einfach mal "arduino rc fernsteuerung" in die Suchmaschine Deiner Wahl eingeben. Da gibt es viele Beispiele.

Gruß Tommy

Hi

Wie sehen denn diese 'RC'-Signale aus?
Von Wem kommen diese Impulse zum Arduino?
Da muß ja noch irgend ein Bauteil/eine externe Schaltung vorhanden sein.

Vom Sketch her würde ich auf eine IR-Diode tippen, Die senden aber normal kein schnödes PWM, sondern kodierte Daten.

Oder soll Das das PWM-Signal aus einem ESC für einen Motortreiber/ein Servo sein?
Also Du greifst das bereits generierte Ausgangs-Signal des RC-Empfänger ab?

MfG

Tommy56:
Du solltest einfach mal "arduino rc fernsteuerung" in die Suchmaschine Deiner Wahl eingeben. Da gibt es viele Beispiele.

Gruß Tommy

Hi Tommy,

leider habe ich für meinen Fall gar nichts gefunden - allgemein die Verbindung von RC Receiver zu Arduino schon, aber nicht mit der Variablen Delay-Einstellung.

postmaster-ino:
Wie sehen denn diese ‘RC’-Signale aus?

Hi,

die PWM Signale kommen direkt aus dem RC Empfänger.

Bei mir liegt die Frequenz zwischen 1095 und 1930. In meinem Sketch habe ich ein 3-Wegeschalter so belegt, dass ich eben on / off / blinken über die Fernsteuerung eingeben kann.

Hi

Da Du momentan das Wörtchen 'delay' wohl falsch interpretierst/verwendest, sollte Das den Misserfolg Deiner Suche zumindest erklären können.

Leider hast Du noch auf keine nicht alle meine Fragen geantwortet.

Das, WAS Du WIRKLICH willst, habe ich auch noch nicht herausfinden können.
Soll, je nach Lenkereinschlag ein Blinker ... blinken? -> Dann schreib Das doch so!
Beim rückwärts fahren die Rückfahrtscheinwerfer an gehen? Auch hier wäre genau diese Funktion eine Erwähnung wert!

Versuche nicht, den von Dir irrtümlich eingeschlagenen Weg mit unserer Hilfe stolpernd zu meistern - lass und erst Mal klären, in welche Richtung die Reise überhaupt sinnvoller weise gehen soll.

MfG

Edit Da kam ja doch schon eine Antwort :slight_smile:

lukas_1717:
leider habe ich für meinen Fall gar nichts gefunden - allgemein die Verbindung von RC Receiver zu Arduino schon, aber nicht mit der Variablen Delay-Einstellung.

Darum geht es auch noch nicht. Ob es ein delay werden wird, wird sich erst noch zeigen.

Erstmal musst Du die Signale der Fernbedienung mit dem Arduino auswerten können.
Danach kann man damit etwas anfangen.
Nicht den 2. vor dem 1. Schritt versuchen.

Gruß Tommy

postmaster-ino:
Das, WAS Du WIRKLICH willst, habe ich auch noch nicht herausfinden können.
Soll, je nach Lenkereinschlag ein Blinker ... blinken? -> Dann schreib Das doch so!
Beim rückwärts fahren die Rückfahrtscheinwerfer an gehen? Auch hier wäre genau diese Funktion eine Erwähnung wert!

Ich versuche es nochmal zu erklären:

Eine LED Lampe, die unter einer Drohne hängt kann mit 5V eingeschaltet werden.

Ich möchte gerne, dass ich die Lampe aber nicht nur on/ off schalten kann, sondern zusätzlich auch noch blitzen bzw. blinken lassen kann. Soweit habe ich den Sketch selbst hinbekommen, allerdings mit einer fesgelegten Zeiteinheit (Delay?) wie lange die LED on bzw. wie lange sie off ist.

Jetzt möchte ich gerne, dass ich ebenfalls über die Fernsteuerung die Frequenz beim blinken manuell einstellen kann. Also neben der Leuchtdauer auch die Pausendauer getrennt von einander. Also muss ich irgendwie die Zeiteinheit für das Blinken und für die Pause variabel aus einem weiteren PWM Signal, welches aus dem Empfänger kommt, dafür nutzen.

PS: Als neues Mitglied darf ich nur alle 5 Minten antworten.

Tommy56:
Erstmal musst Du die Signale der Fernbedienung mit dem Arduino auswerten können.
Danach kann man damit etwas anfangen.
Nicht den 2. vor dem 1. Schritt versuchen.

Den ersten Schritt habe ich ja schon geschafft (siehe Sketch oben).

Mit dem Sketch kann ich an der Fernsteuerung einen 3-Wege Schalter bewegen und über Arduino wird meine LED wahlweise ON / OFF oder in einen blinkenden Modus versetzt.

Bei dem blinkenden Modus habe ich jetzt ja einen festen Wert (200 ms ON, 200ms OFF) eingegeben.

Diesen Wert möchte ich jetzt aber über die Fernsteuerung einstellen können (50-5000ms).

Lese die 1095 bis 1930 als Pulslänge ein.
So etwa kanns gehen:

#include <Servo.h>

// Variablen

const int chA=10;  //Kanal vom Empfänger an Pin 10 zum Einlesen bereit machen.



long Z= 0;  
// Das wird nachher deine Delaytime. ( bei "long bin ich mir nicht sicher, muss ne Varable sein, die die gewünschten Werte annehmen kann.



void setup()
{
 
  Serial.begin(9600);

 

  //Input Pins

  pinMode(10, INPUT);

}

void loop()
{
  
 
 ch10 = pulseIn (chA,HIGH,30000);// ließt die Pulslänge ein etwa zwischen 1000 und 2000µS

 Z= map(chA,1000,2000,x,y); // X ist deine kleinste gewünschte Delayzeit, y die größte

// zur Kontrolle:

Serial.print(chA);
Serial.print("   ");
Serial.println(Z);

Und da wo do es brauchst setzt du ein

delay(Z);

skyfox60:
Lese die 1095 bis 1930 als Pulslänge ein.
So etwa kanns gehen:

Vielen Dank für den konkreten Vorschlag. Leider schaffe ich es damit nicht, oder verstehe zu wenig um es richtig an zu wenden.

Ich habe Deinen Sketch übernommen und versucht ihn so zu schrieben, dass er die interne LED auf Pin 13 anwirft und über Input 10 ich das Delay variable verstellen kann. Klappt leider nicht - was hab ich falsch gemacht?

#include <Servo.h>

// Variablen

const int chA=10;  //Kanal vom Empfänger an Pin 10 zum Einlesen bereit machen.
int ch10;


long Z= 0; 
// Das wird nachher deine Delaytime. ( bei "long bin ich mir nicht sicher, muss ne Varable sein, die die gewünschten Werte annehmen kann.



void setup()
{
 
  Serial.begin(9600);

 

  //Input Pins

  pinMode(10, INPUT);
  pinMode(13,OUTPUT);

}

void loop()
{
 
 
 ch10 = pulseIn (chA,HIGH,30000);// ließt die Pulslänge ein etwa zwischen 1000 und 2000µS

 Z= map(chA,1000,2000,50,500); // X ist deine kleinste gewünschte Delayzeit, y die größte

// zur Kontrolle:

Serial.print(chA);
Serial.print("   ");
Serial.println(Z);

digitalWrite(10, HIGH);

delay(Z);
digitalWrite(10,LOW);
delay(Z);
}

}

du sprichst mit digitalWrite den falschen pin an.
Nicht 10, sondern 13 muss das sein. 10 ist doch der Pulseingang von deinem Empfänger.

Was sagt denn der serial Monitor?
Kommen da die richtigen Werte zum Vorschein, also etwa 1000 bis 2000 und 50 bis 500?

So läuft er bei mir.
Waren noch 2 Fehlerchen drin vom schnellen runtertippen

#include <Servo.h>

// Variablen

const int chA=10;  //Kanal vom Empfänger an Pin 10 zum Einlesen bereit machen.
int ch10;


long Z= 0;
// Das wird nachher deine Delaytime. ( bei "long bin ich mir nicht sicher, muss ne Varable sein, die die gewünschten Werte annehmen kann.



void setup()
{
 
  Serial.begin(9600);

 

  //Input Pins

  pinMode(10, INPUT);
  pinMode(13,OUTPUT);

}

void loop()
{
 
 
 ch10 = pulseIn (chA,HIGH,30000);// ließt die Pulslänge ein etwa zwischen 1000 und 2000µS

 Z= map(ch10,1000,2000,50,500); // X ist deine kleinste gewünschte Delayzeit, y die größte

// zur Kontrolle:

Serial.print(ch10);
Serial.print("   ");
Serial.println(Z);

digitalWrite(13, HIGH);

delay(Z);
digitalWrite(13,LOW);
delay(Z);
}

IMG_5200.zip (650 KB)

Denke mal, so in etwa hattest du dir das vorgestellt

siehe Anhang

IMG_5201.zip (1.86 MB)

skyfox60:
Denke mal, so in etwa hattest du dir das vorgestellt

siehe Anhang

Krass! Mega vielen Dank, ja ganauso brauche ich es!

Mit Deinem Sketch klappt es jetzt bei mir auch!

Jetzt versuche ich mal eine 2. Variable selbst hin zu bekommen und dann das ganze in meinen ersten Sketch zu integrieren.

Freut mich sehr, das ich dir helfen konnte.