Pages: [1] 2 3 ... 5   Go Down
Author Topic: PWM-Signal auswerten  (Read 6085 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol .
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  smiley-small und die SuFu hat auch nicht viel genützt.
Achja, ich benutze das "micro", aber ich glaube, das dürfte keine besonderen Auswirkungen haben
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 431
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 431
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-lol  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 smiley-lol

PS: Während ich diesen Beitrag geschrieben habe, haben schon 3 wieder einen neuen verfasst  smiley-mad smiley
« Last Edit: February 14, 2013, 02:52:14 pm by Bluetruck » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
if (Signal >1450 && Signal < 1550) {Tue etwas;}
ecc

Mit dem Spannungsteiler an der Fernsteuerung kannst Du nicht so genaue Werte eingeben daß Du
Code:
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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ihr schreibt zu schnell und ich zu langsam smiley-wink

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:
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.
« Last Edit: February 14, 2013, 03:04:37 pm by Bluetruck » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ihr schreibt zu schnell und ich zu langsam smiley-wink
Die Welt ist nunmal ungerecht.  smiley-wink smiley-wink smiley-wink

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:
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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ja prima.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

So müsste das funktionieren:
Code:
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);
}
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: February 15, 2013, 05:24:49 am by Bluetruck » Logged

Pages: [1] 2 3 ... 5   Go Up
Jump to: