Go Down

Topic: PWM-Signal auswerten (Read 10296 times) previous topic - next topic

Bluetruck

Hallo,
zuerst mal meine "Ausgangslage": Ich möchte für den Modellbau einen Multiswitch bauen, dh. über einen Proportional-kanal einer Funkfernsteuerung viele Schaltfunktionen (digitales An/Aus, zB. für Licht) schalten. Statt mit einem Potentiometer einen Servo anzusteuern untergliedere ich in der Fernsteuerung den Kanal per Widerstände und Schalter in viele kleine Abschnitte (zb. 16). Im Modell gibt der Empfänger ja ein PWM-Signal aus. Mittels des Arduinos möchte ich jetzt dieses PWM-Signal auswerten, um passend zum "Schalterzustand" in der Fernsteuerung im Modell eine Funktion zu schalten.
Meine Frage ist, wie mach ich das  XD .
Also, meine bescheidenen Kenntnisse reichen bis jetzt soweit: Ich brauche eine if/while-Schaltung: Wenn das Eingangssignal so und so lang ist (woher weiß ich das?, ausprobieren, oder?) soll der Pin auf high geschaltet werden. Doch was muss ich da jetzt schreiben? Die meisten Tutorials hören schon eher auf, bzw. beschreiben ist nicht, da es ja eher ein Nischen-thema ist. Also, bitte köpft mich nicht gleich, ich bin totaler Anfänger  :. und die SuFu hat auch nicht viel genützt.
Achja, ich benutze das "micro", aber ich glaube, das dürfte keine besonderen Auswirkungen haben

Klaus_ww

Nur dass ich richtig verstehe: Du willst je nach Schalterstellung EINE Funktion steuern?  Das Signal ist übrigens kein PWM Signal, sonden PPP. Also Puls Position Pointer.

Eisebaer

hi,

ich bin da kein spezialist, aber ich lese brav im forum mit. ist im modellbau nicht eher PPM, Puls-Pausen-Modulation verbreitet?

gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

Klaus_ww

Wir beide bekommen's hin. Richtig ist Puls Position Modulation. Jetzt passt's.

Hallo
die Signalleitung des Empfängerausgangs an einen beliebigen Pin.
a=pulseIn(5,HIGH,24000)
Die ehaltenen Wete in a liegen so bei 1000 bis 2000 als maxWerte.
Mit "case a" kannst Du jeden Zwischenwert auswerten.
Grüsse

Bluetruck

#5
Feb 14, 2013, 08:33 pm Last Edit: Feb 14, 2013, 08:52 pm by Bluetruck Reason: 1
Zu deiner Fragestellung: Ja, wenn ich den einen Schalter drücke/schließe, soll die eine Funktion angehen (zB. Licht), bei einem andern Schalter zB. der Blinker. Bei einem Funktionsmodell kommt man da halt auf einiges.

@Klaus und Eisbaer: Und nein, es handelt sich wirklich um ein PWM-Signal: http://de.wikipedia.org/wiki/Servo#Montage_und_Anschl.C3.BCsse

@swordfish: Danke. Nur verstehe ich hier halben Bahnhof.  XD  Ich bin mir nicht ganz über die Einbindung sicher.

@uwefed: Gut, das bringt mich jetzt schon ein bisschen weiter.

Ist der dritte Parameter der "Abstand" zwischen den einzelnen Impulsen? Aber was ist dann "a"?
Und "case a" versteh ich nicht.

Müsste ich das dann so einbauen:

if (pulseIn(5,HIGH,>1450 && Signal < 1550)
{
digitalWrite (13, High);
}

??? Irgendwas ist bestimmt falsch XD

PS: Während ich diesen Beitrag geschrieben habe, haben schon 3 wieder einen neuen verfasst  :0 :)

uwefed


Hallo
die Signalleitung des Empfängerausgangs an einen beliebigen Pin.
Signal=pulseIn(Pin,HIGH,24000)
Die ehaltenen Wete in a liegen so bei 1000 bis 2000 als maxWerte.
Mit "case a" kannst Du jeden Zwischenwert auswerten.
Grüsse

Das Servosignal an eine Kanal des RC-Empfängers ist ein impuls von 1mS bis 2mS der alle 20mS (50Hz) wiederholt wird.
Du kannst die Dauer des Impulses messen und in bestimmten Intervallen etwas aktivieren, wobei Du 2 Werte brauchst, einmal zum einschalten und einmal zum ausschalten.

Das wie hat Dir swordfish schon oben gezeigt.

Ich würde das aber nicht mit switch case realisieren sondern mit if

Code: [Select]
if (Signal >1450 && Signal < 1550) {Tue etwas;}
ecc


Mit dem Spannungsteiler an der Fernsteuerung kannst Du nicht so genaue Werte eingeben daß Du
Code: [Select]
if (Signal == 1500) {Tue etwas;}
schreiben kannst.

Grüße Uwe

ps: PWM- und PPM-Signale sind in bestimmten Bereichen das gleiche Signal.
pps: Bluetruck : Nicht alles was Wikipedia scheibt ist richtig.

Bluetruck

#7
Feb 14, 2013, 08:54 pm Last Edit: Feb 14, 2013, 09:04 pm by Bluetruck Reason: 1
Ihr schreibt zu schnell und ich zu langsam ;)

Nochmal das vom Editieren meines Vorhergehenden Beitrages:

Ist der dritte Parameter der "Abstand" zwischen den einzelnen Impulsen? Aber was ist dann "a"? Und "case a" versteh ich auch nicht.

Müsste ich das dann so einbauen:

Code: [Select]
if (pulseIn(5,HIGH,>1450 && Signal < 1550)
{
digitalWrite (10, High);
}

??? Irgendwas ist bestimmt falsch

Achja, als "if" hatte ich es sowieso vor. Was ist "switch case" dann? Ich hab nur "Mehrfachabfrage usw." gefunden.

Nö,
ich probiere mal ausfühlicher.
pulseIn erwartet drei Parameter.
pulseIn(Pin an dem Dein Empfängersignal anliegt,HIGH ist der Wert auf den Pulse wartet,24000 ist das Timout bei unserem Problem exakt 20000. Ich gebe etwas Zeit zu.
a ist nur eine Variable zum Speichern.
In a befindet sich nun ein Zeitwert der exakt deiner Knüppelposition an Deiner fernsteuerung entspricht.
er liegt in einem Bereich von 1000=Knuppel minimum und 2000 Knüppel max.
a=pulseIn(5,HIGH,24000);
Serial.println(a);
Einfach auf dem seriellen Monitor ausprobieren.

uwefed


Ihr schreibt zu schnell und ich zu langsam ;)

Die Welt ist nunmal ungerecht.  ;) ;) ;)

Quote from: Bluetruck

Nochmal das vom Editieren meines Vorhergehenden Beitrages:

Ist der dritte Parameter der "Abstand" zwischen den einzelnen Impulsen? Aber was ist dann "a"? Und "case a" versteh ich auch nicht.

Der dritte Parameter ist der Timeaut. Es wird max 24000µS gewartet, ob ein Impuls kommt und dann auf alle Fälle zurüchgesprungen. Dies ist notwendig da pulseIn() den Arduino wie delay() blockiert und erst nach gemessener Impulszeit zurückspringt.

Quote from: Bluetruck

Müsste ich das dann so einbauen:

Code: [Select]
if (pulseIn(5,HIGH,>1450 && Signal < 1550)
{
digitalWrite (10, High);
}

??? Irgendwas ist bestimmt falsch

Achja, als "if" hatte ich es sowieso vor. Was ist "switch case" dann? Ich hab nur "Mehrfachabfrage usw." gefunden.

Nein. Bei if kannst Du nicht 2 Bedingungen auf die gleiche Variable anwenden.
Es fehlt auch eine Klammer.

also
if (a>5 &&<10) ist falsch
if (a>5 && a<10) ist richtig.

auf http://arduino.cc/en/Reference/HomePage findest Du Erklärungen bezüglich der Funktionen und Kontrollstrukturen.

Grüße Uwe

Bluetruck

Danke euch!
auch für den Link :smiley-eek:

Wäre das dann so richtig?
Code: [Select]
void setup ()
{
pinMode (2, OUTPUT);
pinMode (5, INPUT);
}

void loop ()
{
int a = pulseIn(5,HIGH,24000);
if (a>1450 && a<1500)
digitalWrite (2,HIGH);
}


Bluetruck

Nee, stimmt eigentlich nicht. Ich muss die LED ja an- und ausschalten können.

So müsste das funktionieren:
Code: [Select]
int LED2 = 2;
void setup ()
{
pinMode (2, OUTPUT);
pinMode (5, INPUT);
ditigalWrite (2,LOW)
}

void loop ()
{
int a = pulseIn(5,HIGH,24000)
if (a>1450 && a<1500 && LED2=LOW)
digitalWrite (2,HIGH);
if (a>1450 && a<1500 && LED2=HIGH)
digitalWrite (2,LOW);
}

uwefed

so funktioniert das nicht.
Dein Sketch schaltet das led ein und sofort wieder aus weil di 2. Bedingung sofort wahr ist.

Code: [Select]
void loop ()             //Wiederholt das Ein-Ausschalten solange das Signal anliegt
{
int a = pulseIn(5,HIGH,24000)
if (a>1450 && a<1500 && LED2=LOW)  // schaltet LED ein
digitalWrite (2,HIGH);
if (a>1450 && a<1500 && LED2=HIGH)  // schaltet LEd wieder aus
digitalWrite (2,LOW);
}


Um mit dem gleichen Signal das LED ein und dann wieder auszuschalten müßtest Du kontrollieren ob das signal entweder lange genug HIGH ist oder zuvor LOW wurde. Auf alle Fälle hast Du keine Kontrolle ob der Ausgang nun HIGH oder LOW ist. Wen Du 2 verschiedene Signale für ein- und ausschalten nimmst ist das eindeutig.

Grüß Uwe

Bluetruck

#14
Feb 15, 2013, 08:26 am Last Edit: Feb 15, 2013, 11:24 am by Bluetruck Reason: 1
Also das Board weiß nicht, ob der Ausgang LOW oder HIGH ist? Ansonsten würde ich dazwischen einfach delay(1000) schreiben, dann wärs kein Problem.

Nein, für ein und Ausschalten möchte ich in der Fernbedienung den gleichen Schalter/Taster verwenden.

Go Up