Arduino Forum

International => Deutsch => Topic started by: Bluetruck on Feb 14, 2013, 07:29 pm

Title: PWM-Signal auswerten
Post by: Bluetruck on Feb 14, 2013, 07:29 pm
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
Title: Re: PWM-Signal auswerten
Post by: Klaus_ww on Feb 14, 2013, 08:00 pm
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.
Title: Re: PWM-Signal auswerten
Post by: Eisebaer on Feb 14, 2013, 08:09 pm
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
Title: Re: PWM-Signal auswerten
Post by: Klaus_ww on Feb 14, 2013, 08:17 pm
Wir beide bekommen's hin. Richtig ist Puls Position Modulation. Jetzt passt's.
Title: Re: PWM-Signal auswerten
Post by: swordfish on Feb 14, 2013, 08:29 pm
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
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 14, 2013, 08:33 pm
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 :)
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 14, 2013, 08:48 pm

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.
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 14, 2013, 08:54 pm
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.
Title: Re: PWM-Signal auswerten
Post by: swordfish on Feb 14, 2013, 09:07 pm
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.
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 14, 2013, 09:14 pm

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
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 14, 2013, 09:44 pm
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);
}
Title: Re: PWM-Signal auswerten
Post by: swordfish on Feb 14, 2013, 09:48 pm
ja prima.
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 07:38 am
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);
}
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 15, 2013, 08:08 am
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
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 08:26 am
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.
Title: Re: PWM-Signal auswerten
Post by: jurs on Feb 15, 2013, 09:01 am

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


Du brauchst ja eine Logik zum Ein- und auch wieder ausschalten.

Mit Deiner Stückelung in 16 Bereiche kannst Du es beispielsweise so schalten, daß bei "null" alle Pins/Geräte ausgeschaltet werden, und bei jedem anderen Wert wird genau ein einzelner Pin mit einem Gerät aktiviert (und alle anderen sind aus). So daß immer nur "kein" oder "ein" Gerät eingeschaltet ist.

Ist das die Logik, die die vorschwebt?
Die ließe sich nämlich realisieren.

Wenn jedes Gerät unabhängig ein- und ausschaltbar sein soll, z.B. erstes Gerät ein, zweites Gerät aus, drittes Gerät ein, viertes Gerät aus, dann kannst Du mit Deinen 16 Zuständen nur viel weniger als 15 Geräte unabhängig schalten.

Also wie soll es sein:
- Immer nur ein Gerät zur Zeit eingeschaltet?
oder:
- Jedes Gerät unabhängig ein- und ausschaltbar, auch mehrere zur selben Zeit ein?
Title: Re: PWM-Signal auswerten
Post by: swordfish on Feb 15, 2013, 09:23 am
Ist denn die Hardware im Sender vorhanden?
Am einfachsten wäre es mit 3Stufenschaltern und 2 oder 3 Kanälen zu bewerkstelligen.
Title: Re: PWM-Signal auswerten
Post by: michael_x on Feb 15, 2013, 10:29 am

Nein, dein Irrtum liegt in

LED2=LOW

Das prüft nicht, welchen Zustand deine LED hat, sondern setzt die  Variable int LED2; auf den Wert 0.

Das stört zwar nicht, weil LED2 nicht weiter gebraucht wird, ist aber sicher nicht das was du willst.
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 12:05 pm
Einen Irrtum hab ich behoben.

Code: [Select]
void setup ()
{
pinMode (2, OUTPUT);
pinMode (5, INPUT);
ditigalWrite (2,LOW)
}

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


Hab gelesen, dass man über digitalRead auch den Ausgang messen kann http://arduino.cc/forum/index.php?topic=29552.0
Wenn also der Impuls stimmt, und die LED aus ist, wird sie angeschalten. Dann wird eine sec. gewartet: In dieser Zeit sollte ich meinen Finger wieder vom Taster nehmen. In der zweiten Gleichung stimmt dann zwar, dass die LED an ist, aber nicht mehr der Impuls.
Mal schaun, wo der Fehler liegt, dass was so schnell funktioniert ist ja eher unwarscheinlich  XD

Zu euren Fragen: Ich möchte einen Multiswitch bauen. Für die, die sich im Modellbau jetzt nicht so weit auskennen: Einen "Proportionalkanal", der mittels PWM übertragen wird, aufsplitten auf mehrere "An/Aus-Kanäle". In der Fernsteuerung wird die Stellung des Kreuzknüppels als erstes über ein Poti (veränderbarer Widerstand) erfasst und dann elektronisch auf ein PWM-Signal "konvertiert". Wenn man statt dem Poti ein paar Widerstände mit (An-/Aus-)Schaltern ansteuert, kann man somit gezielt eine bestimmte Impulslänge erzielen.
Achja, zur selben Zeit drücke ich immer nur einen Schalter! Aber es sollen mehrere LEDs and unterschiedlichen Ausgängen gleichzeitig an sein können.
Title: Re: PWM-Signal auswerten
Post by: jurs on Feb 15, 2013, 12:58 pm

Achja, zur selben Zeit drücke ich immer nur einen Schalter! Aber es sollen mehrere LEDs and unterschiedlichen Ausgängen gleichzeitig an sein können.


Also 16 Taster zum Schalten von 8 Kanälen (Pins) mit insgesamt 17 Schaltzuständen (alles aus = es wird gerade nichts geschaltet, 8 Einschalt-Taster = Kanal einschalten, 8 Ausschalt-Taster = Kanal ausschalten)

Also teilst Du die Bandbreite von 1000 bis 2000 Microsekunden in 17 Pulsbreiten-Bereiche ein, und machst je nach empfangenem Pulsbreitenbereich entweder nichts (kein Taster gerdückt) oder einen Ein- oder Ausschaltvorgang (bei Emfpang einer bestimmten Pulsbreite).

Bei nur wenigen Prozent erlaubtem Unterschied in der Pulsbreite und bei teils recht deftigen Toleranzen handelsüblicher Widerstände wirst Du aber vermutlich schon etwas suchen und messen müssen, um geeignete Widerstände für Dein Vorhaben zu finden, die diese zahlreichen und exakten Impulsbreiten tatsächlich erzeugen, die Du unterscheiden möchtest.
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 01:47 pm
Vielleicht sind 16 auch wirklich zu viel. 10 Funktionen würden mir auch reichen.  XD

Ich will jetzt erstmal die Funktionsweise der Programmierung testen. Und dann schau ich, wieviel Funktionen möglich sind.
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 04:04 pm
Ich hab ein Grundlegendes Problem.
Ich möchte das PWM-Signal per Serieller Schnittstelle auslesen (ich brauch ja nur die groben Werte).
Dazu müsste das ja funktionieren:
Quote

void setup (){
 Serial.begin(9600);
 pinMode(3,INPUT);
}
void loop (){
 int a = pulseIn(3,HIGH,24000);
 Serial.println(a,DEC);
}


Geht aber nicht. Es werden zwar Daten angezeigt, aber die verändern sich nicht, wenn ich den Kanal per Funke verändere. Die Zahlen sind abhängig von dem Abstand der Fernbedienung zum Kabel zwischen Empfänger und Arduino  :0
Also hab ich 1. ein Empfangsproblem (was wohl daran liegt, das das Kabel recht lang ist - kann man ändern) und 2. ein Problem in der Programmierung, oder?
Edit: Hab jetzt ein ganz kurzen Kabel genommen. Nichts verändert.
Wenn ich mit der Funke etwas weiter weg bin, ist der angezeigte Wert zwischen 300-800. Wenn ich in die Funke in 20cm entfernung habe, kommen meistens Werte von 1500, dazwischen dann mal 1, oder 2. Weiß jemand, was das Problem sein könnte?
Title: Re: PWM-Signal auswerten
Post by: jurs on Feb 15, 2013, 04:36 pm

Geht aber nicht. Es werden zwar Daten angezeigt, aber die verändern sich nicht, wenn ich den Kanal per Funke verändere. Die Zahlen sind abhängig von dem Abstand der Fernbedienung zum Kabel zwischen Empfänger und Arduino


Woher weißt Du, dass die relevanten Impulse HIGH-Impulse sind und nicht LOW-Impulse, die Du am Empfänger auslesen mußt?

Hast Du probeweise am Empfängeranschluß mal einen Servo angeschlossen und reagiert dieser normal?

Mit welcher Spannung arbeitet eigentlich der Empfänger?

Und sind die Minuspole der Stromversorgung vom Arduino und RC-Empfänger (Ground and Ground) überhaupt miteinander verbunden?
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 04:55 pm
Empfänger arbeitet mit 5V (Ausgang). Ja, ich hab einen Servo angeschlossen. Aber reicht es nicht, wenn nur die Steuerleitung zwischen Empf. und Arduino da ist? Weil Spannung kommt ja vom PC.
Title: Re: PWM-Signal auswerten
Post by: swordfish on Feb 15, 2013, 05:07 pm
Hallo,
nimm einfach ein normales Servokabel.
Plus(5V) und Minus an den Arduino und die Signalleitung an Pin 3.
dann wird es funktionieren.
Title: Re: PWM-Signal auswerten
Post by: jurs on Feb 15, 2013, 05:22 pm

Empfänger arbeitet mit 5V (Ausgang). Ja, ich hab einen Servo angeschlossen. Aber reicht es nicht, wenn nur die Steuerleitung zwischen Empf. und Arduino da ist? Weil Spannung kommt ja vom PC.


Ja und, wo ist das Vergleichslevel, mit dem das Potential der Steuerleitung verglichen werden soll?

Entweder verbindest Du bei getrennter Stromversorgung von Arduino und RC-Empfänger Ground an Ground.

Oder Du versorgst den RC-Empfänger über GND und 5V mit von der Arduino-Stromversorung (falls sonst keine Servos am RC-Empfänger hängen, denn der 5V Pin am Arduino gibt nicht so sehr viel Strom her).

Jedenfalls kann die auszuwertende Steuerleitung nur gegen ein definiertes Ground-Level ausgewertet werden und nicht "freihängend in der Luft" mit der Luft als zweitem Vergleichspotential.

Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 05:54 pm
Danke! Das war das Problem.
Daten hab ich gesammelt, jetzt wollt ich das in den Arduino übertragen. Beim Speichern kommt aber folgender Fehler:

Code: [Select]
sketch_Multiswitch2.ino: In function 'void loop()':
sketch_Multiswitch2:12: error: lvalue required as left operand of assignment
sketch_Multiswitch2:14: error: expected `;' before 'delay'
sketch_Multiswitch2:15: error: lvalue required as left operand of assignment
sketch_Multiswitch2:17: error: expected `;' before 'delay'


Hier nochmal der Sketch:
Quote

void setup ()
{
pinMode (13, OUTPUT);
pinMode (3, INPUT);
digitalWrite (13,LOW);
}

void loop ()
{
int a = pulseIn(3,HIGH,24000);
int LED2v = digitalRead(13);
if (a>1228 && a<1242 && LED2v=LOW)
digitalWrite (2,HIGH)
delay(1000);
if (a>1228 && a<1242 && LED2v=HIGH)
digitalWrite (2,LOW)
delay(1000);
}



Ein Fehler in der if-gleichung
Dann möchte er vor Delay ein ";" - aber das soll ja in die if-formel mit rein. Sonst würd er das ja immer machen (und dass würde ja alles endlos in die Länge ziehen)
Title: Re: PWM-Signal auswerten
Post by: Eisebaer on Feb 15, 2013, 06:01 pm
hi,

was in der if-bedingung passieren soll, muß in geschwungene {} klammern, das hat nichts mit ; zu tun.

Code: [Select]

if (a>1228 && a<1242 && LED2v=LOW) {
digitalWrite (2,HIGH);
delay(1000);
}
if (a>1228 && a<1242 && LED2v=HIGH) {
digitalWrite (2,LOW);
delay(1000);
}



gruß stefan
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 07:51 pm
Ah, dann kann ich auch ";" setzen
Er bringt aber immer noch die andere Fehlermeldung.
"IValue (am anfang ein i)benötigt für übrige/fehlende Rechengröße in Aufgabe" Versuchsweise Übersetzung. Also jedenfalls hat es was mit dem letzten Teil in der if-bedingung zu tun
Code: [Select]
&& LED1v=LOW
Denn wenn ich ihn weglösche, kommt kein Fehler
Title: Re: PWM-Signal auswerten
Post by: Eisebaer on Feb 15, 2013, 08:00 pm
hi,

kann man pins, die auf output gesetzt sind, mit digitalread einlesen?

gruß stefan
Title: Re: PWM-Signal auswerten
Post by: Eisebaer on Feb 15, 2013, 08:04 pm
ok, gelesen, kann man anscheinend.
aber vergleiche sind immer mit doppeltem gleichheitszeichen, also LED1v==LOW.

gruß stefan
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 15, 2013, 08:21 pm

hi,

kann man pins, die auf output gesetzt sind, mit digitalread einlesen?

gruß stefan

Jein

Beim Arduino UNO, MEGA, Nano ecc schon; beim Due nicht; beim Leonardo weiß ich nicht.

Grüße Uwe
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 08:48 pm
Achso.
Danke! Das mit dem == wars. Jetzt bringt er keine Fehlermeldungen mehr.
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 15, 2013, 09:09 pm

Er bringt aber immer noch die andere Fehlermeldung.
"IValue (am anfang ein i)benötigt für übrige/fehlende Rechengröße in Aufgabe" Versuchsweise Übersetzung. Also jedenfalls hat es was mit dem letzten Teil in der if-bedingung zu tun
Code: [Select]
&& LED1v=LOW
Denn wenn ich ihn weglösche, kommt kein Fehler


LED1v=LOW ist eine Zuweisung

LED1v==LOW ist ein Vergleich.

Normalerweise macht eine Zuweisung innerhalb if keine Fehlermeldung; funktioniert dann aber nicht. In diesem Fall glaube ich, bekommst Du eine Fehlermeldung weil Du LOW und HIGH vergleichst.

Grüße Uwe
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 15, 2013, 09:23 pm
Auf jeden Fall funktioniert es jetzt! Danke an alle   :D
Mit genauen Widerständen muss ich noch ausprobieren. Hab jetzt an einer Schaltung ausprobiert, die eigentlich für was anderes gedacht war. Aber erfüllen tut sie den gleichen Zweck. Der Toleranzbereich eines Widerstands beträgt so etwa 20.
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 15, 2013, 10:02 pm
20 ist im Vergleich zu 1024 nicht viel.
grad mal 2%
Würde schon 1% Widerstände nehmen.
Grüße Uwe
Title: Re: PWM-Signal auswerten
Post by: swordfish on Feb 16, 2013, 12:07 am
Hallo,
Du kannst den Wert von pulseIn auch mappen.
z.B a=map(pulseIn(3,HIGH,24000),1000,2000,0,10).
Du erzeugst dann nur Werte zwischen 0 und 10.
Title: Re: PWM-Signal auswerten
Post by: uwefed on Feb 16, 2013, 12:33 am

Hallo,
Du kannst den Wert von pulseIn auch mappen.
z.B a=map(pulseIn(3,HIGH,24000),1000,2000,0,10).
Du erzeugst dann nur Werte zwischen 0 und 10.

Was aber nicht 100% gut ist, weil es so Rundungfehler gibt und die 11 Zahlen nicht gleichmäßig verteilt sind.
von 1000 bis 1099 ergibt 0
von 1100 bis 1199 ergibt 1
von 1200 bis 1299 ergibt 2
von 1300 bis 1399 ergibt 3
von 1400 bis 1499 ergibt 4
von 1500 bis 1599 ergibt 5
von 1600 bis 1699 ergibt 6
von 1700 bis 1799 ergibt 7
von 1800 bis 1899 ergibt 8
von 1900 bis 1999 ergibt 9
2000 ergint 10

Grüße Uwe
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 16, 2013, 02:39 pm
Ich weiß jetzt nicht, was mir mappen bringen sollte, es funktioniert doch!

Aber ein anderes Problem.
Ich möchte die delay()-Schleife raus haben.

Code: [Select]
void setup ()
{
pinMode (13, OUTPUT);
pinMode (3, INPUT);
}

void loop ()
{
int a = pulseIn(3,HIGH,24000);
int L1 = digitalRead(13);
if (a>1228 && a<1242 && L1==LOW){//Wenn Eingangssignal im richtigen Bereich und entsprechende LED aus ist,
 digitalWrite (13,HIGH);//dann schalte LED 13 an
 if (a>1490 && a<1505){//Wenn neutrales Einganssignal (Mittelstellung),
   goto if1H;//dann geh weiter zu nächsten if-Bedingung
 }
 else
 {
   goto if1L;//sonst wiederhole aktuelle if-Bedingung
 }
}
if1H:

if (a>1228 && a<1242 && L1==HIGH){
 digitalWrite (13,LOW);
 if (a>1490 && a<1505){
   goto if1L;
 }
 else
 {
   goto if1H;
 }

}
if1L:
;
}


Kann das an dem "goto" liegen? Weil er erkennts nicht als funktion, aber es ist ja eine offizielle Funktion !?

Zur Info nochmal das Funktionsprinzip: Wenn eine LED-geschaltet wird, wird automatisch eine weitere if-gleichung in Gang gesetzt, dass die vorhergehende if-gleichung so lange wiederholt wird, bis kein Schalter gedrückt wird (Der Wert am Eingang beträgt dann so um die 1500). Dann gehts nach gewohntem Prinzip weiter. Damit wird verhindert, dass die LED gleich wieder ausgeschaltet wird.
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 18, 2013, 02:28 pm
Ich push das hier nochmal hoch
Weiß denn keiner was?
Title: Re: PWM-Signal auswerten
Post by: michael_x on Feb 18, 2013, 06:06 pm
Quote
Kann das an dem "goto" liegen? Weil er erkennts nicht als funktion, aber es ist ja eine offizielle Funktion !?


Das versteht wohl keiner so richtig ?!

Was meinst du mit "Funktion"  ?

Ein goto ist keine Funktion sondern etwas, was eigentlich nichts in einem Programm zu suchen hat.

Quote
Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?
Diese Funktion wirkt zwar wie ein delay und liefert ein unsigned long ( kein int ) zurück.
Aber wenn du sicher bist, dass pulseIn innerhalb weniger msec zurückkommt, ist das ganz in Ordnung.

Generell schmeisst man alle goto's raus und freut sich, wenn loop() schnell fertig ist und wieder neu startet.
Wenn eine LED länger leuchten soll, merkt man sich, wann sie eingeschaltet wurde und wann man sie also wieder ausschalten kann.
BlinkWithoutDelay

Von einem loop Durchlauf zum nächsten kannst du Variable aufheben in globalen oder static Variablen:

Code: [Select]

const unsigned long LED_DAUER = 500; // 0.5 sec
static unsigned long start;
if ( led_anschalten ) {    // wann die Anschalt-Bedingung erfüllt ist, hab ich hier weggelassen.
   digital_Write(13,HIGH);
    start=millis();
}

if ( millis() - start > LED_DAUER) {
  digitalWrite(13,LOW);
}
Title: Re: PWM-Signal auswerten
Post by: Doc_Arduino on Feb 19, 2013, 07:36 am
Hallo,

das feste delay würde mich auch stören, da bei Dir bestimmt dann mehrere notwendig sind summiert sich die Zeit die den µC blockiert.

Zum umschalten Deiner Ausgänge kann man doch sicherlich das digitale Bit bzw. Pin toggeln. Mehr kannst Du und willst Du ja eh nicht machen wenn Du zum ein- und ausschalten eines Ausganges immer die gleiche Knüppelstellung verwenden möchtest.

toggeln wäre:  PinNummer bzw. Variable ^= 1;

oben in void Setup legste die Hilfvariable fest

byte TOGGLE = 0;

Code: [Select]

if ( a>1228 && a<1242 )                           //Wenn Eingangssignal im richtigen Bereich schalte LED entsprechend um
  { 
     TOGGLE ^= 1;                                   // Wert von TOGGLE wechselt bei jeden Aufruf zwischen 0 und 1 hin oder her
     digitalWrite (13, TOGGLE);                 // und schaltet damit die LED 13 bei jeden Aufruf entweder an oder aus
  }



Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 24, 2013, 08:57 am
@Doc_Arduino:
Das bringt mich auch nicht weiter. Ich hab ja dann immer noch das Problem, dass im erneuten und sofortigem Wiederdurchlauf des loop-teils die LED sofort wieder umgeschaltet wird, wenn ich in der Zeit nicht den Taster losgelassen habe. (Das Signal wird aller 20ms erneut gesendet).

@michael_x:
Versteh ich nicht ganz. In der zweiten If-schleife schaltest du dann doch die LED automatisch wieder aus!? Was bringt mir das jetzt  XD

Ich weiß, dass ein goto nicht gern gesehen wird, aber sofern ich keine andere Möglichkeit habe, werde ich es wohl verwenden müssen.



Quote
Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?


?? Ich versteh jetzt nicht, was die miteinander zu tun haben, bzw. wieso das pulseIn() gleich delay() sein soll

Tut mir leid, wenn ich mich ein wenig blöd anstelle....  =( XD
Title: Re: PWM-Signal auswerten
Post by: Doc_Arduino on Feb 24, 2013, 11:55 am
Hallo,

das ist das generelle Problem wenn man mit einem Taster oder wie bei Dir einer Knüppelstellung 2 Aufgaben erledigen will. Mit etwas Aufwand sehe ich da aber kein Problem. Du mußt laut meiner Theorie nur dafür sorgen das die erneute Auswertung des eben umgeschalteten Bits erst wieder erfolgt wenn sich das Eingangssignal, also Deine Knüppelstellung, verändert hat.

Hinweis. Du willst 11 Sachen schalten. Dann würde ich in allen 11  Wertebereichs if Abfrage eine Hilfvariable einfügen die beim einmaligen Durchlaufen gesetzt wird. Vor der if Abfrage prüfst Du ob sie schon gesetzt ist. Dann wird diese übersprungen und es wird nicht nochmal getoggelt. Das machst Du mit alle Deinen Wertebereichen if Abfragen. Und in allen setzt Du alle anderen Hilfvariablen wieder zurück. Außer die der eigenen wo das Programm sich gerade drin befindet. Wenn ich das so lese finde ich das einfach genial.  :smiley-mr-green:
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 24, 2013, 09:29 pm

Wenn ich das so lese finde ich das einfach genial.  :smiley-mr-green:


Stimmt, Dankeschön  XD

Werd morgen berichten, ob's auch bei mir funktioniert ;)

Zwei andere Fragen:
1) Das togglen funktioniert bei mir nicht. Wird immer als unbekannter Befehl (diesmal richtig? XD) markiert und beim kompillieren als Fehlermeldung gebracht. Dann gibt es da ja was zum downloaden (digitalToggle), funktioniert aber nicht. (Ja, ich hab es am Anfang vom Sketch importiert). Bringt immer fehlermeldungen, die sich auf die neuen Dateien in der library beziehen.

2) zum Blinken ohne delay:
Code: [Select]
if (millis() - previousMillis > interval) {
Wieso ein ">", und nicht ein "="? Funktionierten tut letzeres ja auch!?
Title: Re: PWM-Signal auswerten
Post by: Eisebaer on Feb 24, 2013, 09:50 pm
hi,

togglen heißt hin- und herschalten;

Code: [Select]

bool test;

void setup() {
  Serial.begin(9600);
  test = false;
}

void loop() {
  Serial.println(test);
  test = !test;
  delay(1000);
}


gruß stefan
Title: Re: PWM-Signal auswerten
Post by: MaFu on Feb 24, 2013, 09:59 pm

2) zum Blinken ohne delay:
Code: [Select]
if (millis() - previousMillis > interval) {
Wieso ein ">", und nicht ein "="? Funktionierten tut letzeres ja auch!?

"=" wäre zu unsicher, gar nicht angewöhnen. Wenn der Code mal länger als eine Millisekunde dauern sollte, kann Dir passieren, dass die Bedingung nie eintritt weil millis() schon drüber ist.
Ich schreibs meistens so:
Code: [Select]
if (millis() - previousMillis >= interval)
Title: Re: PWM-Signal auswerten
Post by: Doc_Arduino on Feb 24, 2013, 10:35 pm
Hallo,

so mach ich das, TOOGLE ist bei mir die Hilfsvariable.

Code: [Select]

byte TOGGLE = 0;

-----------------------------------------------

if ...
  {
    TOGGLE ^= 1;
    digitalWrite(ledPin, TOGGLE);
   }
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 25, 2013, 06:27 pm
@MaFu: Ok, hab ich mir fast so gedacht  XD

@Doc_Arduino:

Hm, versteh ich nicht ganz.
Code: [Select]
TOGGLE ^=1;
Was bewirkt das und was bedeutet das "^" ? Ist das das bitweise XOR?
Und muss ich da unbedingt mit bytes arbeiten? Weil da blick ich nicht durch  :smiley-mr-green:

Wat anderes: Hab jetzt mal Doc_Arduinos Rat befolgt. Allerdings wird die Hilfsvariable nicht bei jeder gültigen if-Bedingung zurückgesetzt, sondern alle erst in einer seperaten if-bedinung (Eingangssingal muss in in "Mittelstellung" sein) am Schluss. Da der loop-teil ja nahe zu in keiner Zeit durchläuft, reicht das ja auch.
Mein Problem ist: An sich funktioniert es, aber das Signal wird nicht eindeutig verarbeitet. Dh, wenn ich den Taster in meiner Fernbedingung drücke, geht die LED an, aber sofort wieder aus. Ich muss zB. längere Zeit drücken. Ist aber nicht immer. Manchmal geht sie auch wieder aus, wenn ich lange drücke. Beim ausschalten genau das gleiche.
Ich zeig euch mal meiner Code (noch ohne Toggle), vllt. sieht ja jemand was ?

Code: [Select]
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
 int a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
 boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
 boolean vLED2 = false;//
 int iLED1 = digitalRead(5);//Ließt Status von LED1
 int iLED2 = digitalRead(6);

 //if-Bedinung für LED1
 if (a>1228 && a<1242 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
   digitalWrite (5,HIGH);//schalte Ausgang an
   vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
 }
 if (a>1228 && a<1242 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
  digitalWrite (5,LOW);
  vLED1 = true;
 }
   //if-Bedinung für LED2
 if (a>919 && a<930 && iLED2==LOW && vLED2 == false){
   digitalWrite (6,HIGH);
   vLED1 = true;
 }
 if (a>919 && a<930 && iLED2==HIGH &&  vLED2 == false){
  digitalWrite (6,LOW);
  vLED1 = true;
 }
     //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
 if (a>1490 && a<1505){
   vLED1 = false;
   vLED2 = false;
 }

}


Es liegt aber nicht am Empfang. Denn als ich es das erste mal mit delay() als verzögerung gemacht habe, hat es ja hinsichtlich dieses Problems super funktioniert.

Was mich verwundert hat: Warum muss ich die Variablen im loop-teil deklarieren, und kann sie nicht ganz am Anfang des Sketches hinschreiben? Denn da funktioniert es nicht.

EDIT Und noch ein Problem. Ich kann die LEDs nur schalten, wenn ich das USB-kabel verbunden habe !?
Mal meine Pin-belegungen:

5V+: 5V
Ground: ?
7V+: VI
Leds sind mit + am Arduino Ausgang und mit - an Ground angeschlossen.

Das Arduino ist schon angeschlossen, wenn ich das USB-kabel entferne, leuchtet die Blaue LED noch.

Warscheinlich ist die Lösung total einfach, bloß komm ich nicht drauf  :0
Title: Re: PWM-Signal auswerten
Post by: michael_x on Feb 25, 2013, 11:28 pm
Quote
Was bewirkt das und was bedeutet das "^" ? Ist das das bitweise XOR?

Der Kandidat hat 100 Punkte. Und einen Extra-Bonus, weil er nicht nachgelesen, sondern geraten hat. Glückwunsch.

Quote
Und muss ich da unbedingt mit bytes arbeiten

Bytes sind die natürlichste Datengröße für einen 8-Bit Prozessor, und sie passen erstaunlich oft.

Aber du hast insofern recht, dass es hier eigentlich um LOW / HIGH geht.
In Arduino - C ist LOW = false = 0 und HIGH = true = 1.
Und boolean wird in Arduino-C in einem byte untergebracht.

Rein logisch gesehen ist ! der richtige toggle - Operator, und Doc_Arduino's  ^=1 mogelt, weil er weiss, dass in dem Byte nie was anderes als 0 oder 1 drinsteht.
( Ob das tatsächlich einen Zyklus schneller oder ein paar Byte kürzer ist, als was ein ordentlicher Compiler aus dem ! Operator macht, lassen wir mal offen )

Quote
Was mich verwundert hat: Warum muss ich die Variablen im loop-teil deklarieren, und kann sie nicht ganz am Anfang des Sketches hinschreiben? Denn da funktioniert es nicht.

Vielleicht solltest du doch mal ein bisschen Einführung in C lesen, sonst rätst du wieder richtig, was der Unterschied zwischen einer lokalen und einer globalen Variable ist...
Warum - Fragen wollen nicht wirklich eine Antwort, hab ich aus Erfahrung gelernt. Weil die Antwort nicht hilft, sondern eher zeigt, dass alles nicht so einfach ist.
Das Problem ist eher dein geheimnisvolles "Denn da funktioniert es nicht", was man nur mit "Sollte es aber" beantworten kann.

Quote
Und noch ein Problem. Ich kann die LEDs nur schalten, wenn ich das USB-kabel verbunden habe
... Leds sind mit + am Arduino Ausgang und mit - an Ground angeschlossen.

... und haben sicher einen Vorwiderstand , oder ?
Ein Arduino sollte auch mit 7V an Vin funktionieren. Da solltest du mal durch Eingrenzen/Vereinfachen klären, ob das an Stromversorgung / LED / Fernsteuerung oder was sonst liegt.



@michael_x:
Versteh ich nicht ganz. In der zweiten If-schleife schaltest du dann doch die LED automatisch wieder aus!? Was bringt mir das jetzt  XD

Ich weiß, dass ein goto nicht gern gesehen wird, aber sofern ich keine andere Möglichkeit habe, werde ich es wohl verwenden müssen.



Quote
Ich möchte die delay()-Schleife raus haben.

Du meinst dein pulseIn() ?


?? Ich versteh jetzt nicht, was die miteinander zu tun haben, bzw. wieso das pulseIn() gleich delay() sein soll

Tut mir leid, wenn ich mich ein wenig blöd anstelle....  =( XD


Ich habe kein delay in deinem Post gesehen, das einzige was eine Verzögerung reinbringt, ist das pulseIn, weil es wartet, bis ein neuer Puls von deiner Steuerung kommt.
Das zweite if in meinem Beispiel wird erst viele Zyklen später true, wenn das im ersten if gesetzte    
  start=millis();  
so alt ist, dass
  millis() - start > LED_DAUER
erfüllt ist.

( start kann für diesen Zweck übrigens keine einfache lokale Variable sein, um nochmal was verwirrendes zu deinem "Warum" beizutragen)


P.S. Kannst du bitte deinen Kommentar im vorigen Post in der Zeilenlänge kürzen, mein Bildschirm ist zwar 16:9 Full-HD, aber doch ein bisschen zu schmal um Text und scroll-Balken gleichzeitig zu zeigen.
PPS: War nur bei meiner Antwort störend, hat sich erledigt...
Title: Re: PWM-Signal auswerten
Post by: Doc_Arduino on Feb 26, 2013, 12:10 am
Hallo,

ich tipp auch noch paar Worte zum Thema.

Genau, mit XOR kann man toggeln. Manchmal darf man übern Tellerrand schauen.   :)
Zum Bsp. hier:  http://www.mikrocontroller.net/articles/Bitmanipulation (http://www.mikrocontroller.net/articles/Bitmanipulation)
Vieles davon steht auch im Manual zu unserem µC. Ist ja auch von AVR.

Byte deshalb, weil man für 0 oder 1 keinen größeren Speicherbereich deklarieren muß. Kannst auch long verwenden, geht auch, verschwendet nur kostbaren Speicher im µC. In ein Byte passen Werte bis 255 rein. Kannste nachlesen hier in der Referenz.

Wegen Dein Tastereffekten? Das könnte Tasterprellen sein und die delay Verzögerung hatte das zufällig unterbunden. Ist meine Vermutung. Was ich noch nicht ganz verstanden habe, nimmst Du nun einen analogen Knüppel oder digitale Taster?

Wegen Deiner Variablendefinition, ich vermute Du hast das ; vergessen? Oder unter setup reingeschrieben?
Dein Code geändert das am Anfang alle Variablen deklariert werden wird fehlerfrei übersetzt.

Code: [Select]

int a;
boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
boolean vLED2 = false;//
int iLED1;
int iLED2;
 
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
  a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
 
  iLED1 = digitalRead(5);//Ließt Status von LED1
  iLED2 = digitalRead(6);

  //if-Bedinung für LED1
  if (a>1228 && a<1242 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
    digitalWrite (5,HIGH);//schalte Ausgang an
    vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
  }
  if (a>1228 && a<1242 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
   digitalWrite (5,LOW);
   vLED1 = true;
  }
    //if-Bedinung für LED2
  if (a>919 && a<930 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED1 = true;
  }
  if (a>919 && a<930 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED1 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1490 && a<1505){
    vLED1 = false;
    vLED2 = false;
  }

}




Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Feb 26, 2013, 08:07 pm
Zitate bring ich nicht, weil ich da irgendwie zu blöd dazu bin... XD

@michael_x:

Wieso, weshalb, warum ... XD

"^" Ich habe allerdings schon nachgelesen, und zwar unter den Referenzen. Aber ich verstehe nicht, wie das zusammen mit dem "=" funktioniert !? http://torrentula.to.funpic.de/dokumentation/bitweisesund/
Bedeutet das dann nichts anderes als "alles außer 1"?
Aber irgendwie versteh ichs nicht

Variable "TOGGLE" wird als 0 deklariert.
if...then: Setzte TOGGLE alles andere als 1 !? Gibt irgendwie keinen Sinn.
Schalte Ausgang: TOGGLE, also alles andere als 1 !? Gibt noch weniger Sinn.

Code: [Select]
byte TOGGLE = 0;

-----------------------------------------------

if ...
 {
   TOGGLE ^= 1;
   digitalWrite(ledPin, TOGGLE);
  }


Google sagt irgendwie auch nichts dazu. Deswegen muss ich hier so blöd fragen. Tut mir echt leid. Wenns irgendwo schon beschrieben ist, könnt ihr mir ja vlt. einen Link geben.


Zu den Variablen: Ich bin mir bewusst, dass, wenn ich sie ganz am Anfang hinschreibe, für setup und loop teil gilt, und wenn ich sie im loop teil definiere, der setup teil nicht zugreifen kann. Als erstes hab ich sie ganz am Anfang (noch vor setup) definiert. LEDs haben nicht geleuchtet. Dann in den loop-teil - LEDs konnte ich schalten.
Und psychologische Antworten bringen mir bei meinem Problem auch nicht viel XD

Zu dem USB-Problem:
An der Stromversorgung liegt's nicht. Da kommt überall die richtige Spannung.
Was mir gerade aufgefallen ist: Das USB kabel ist zum Schalten der LED wichtig. Ist sie einmal an, kann ich das Kabel abstecken und der Ausgang bleibt an.
Ich denke, ich hab irgendwo einen total einfachen Fehler, komm aber nicht drauf.

Weil du kein delay() gesehen haben möchtest: http://arduino.cc/forum/index.php/topic,148970.msg1120028.html#msg1120028 XD

Zum Beispiel: Aber das bringt mir doch immer noch nichts. Ich will die LED ja selber wieder ausschalten und nicht nach einer bestimmten Zeitspanne.

@doc_arduino:

Es sind digitale Taster. Jeder Taster (ich arbeitet zZt. mit 4 Stück) hat einen Wiederstand (Werte weiß ich jetzt nicht ganz genau) vorgeschalten. Je nachdem, wie groß der Wiederstand ist, desto länger/kürzer wird das Signal, was von der Funke zum Modell geschickt wird und schließlich auch vom Empfänger zum Servo, bzw. hier zum Arduino übertragen wird.

Alle Fehlerquellen, die mit schlechtem Kontakt, schlechten Schaltern und Wiederständen oder schlechter Funkübertragung bzw. dem pulseIn() zu tun haben, kann man getrost ausschließen. Denn das problem wäre dann auch bei der "delay-version" aufgetreten. Habs grade nochmal ausprobiert. Ein kurzer Tasterdruck(wirklich kurz), und die LED schaltet zuverlässig an/aus.
Ich gehe davon aus, dass in der Programmierung der Fehler liegt.

Wegen den Variablen: Siehe oben. Ich hab sie eins zu eins kopiert. Zweitens käm sonst beim kompillieren ja auch eine Fehlermeldung.
Title: Re: PWM-Signal auswerten
Post by: Doc_Arduino on Feb 26, 2013, 09:39 pm
Hallo,

okay, bevor ich Dir jetzt Toogle bzw. XOR erkläre muß ich wissen ob Du Dich mit Digitaltechnik überhaupt schon einmal befasst hast? Also genau weist wie AND, OR, NAND, NOR funktioniert? Das sind die Grundfunktionen. Alles andere baut darauf nur auf. Klingt vielleicht erstmal einfach, man muß es aber verstanden haben. Ich meine, man muß wissen was einem eine Wahrheitstabelle sagt.
Oder es hängt bei Dir nur an dem Zeichen ^=  ?
Das ist einfach nur das Zeichen für die logische XOR Verknüpfung. Ich meine wenn 2 * 2 = 4 da steht fragt auch niemand was * bedeutet. Irgendwas mußten sich die Programmierer der Compiler ausdenken, meine ich, wie man XOR ausdrücken kann. Ich muß auch hin wieder nachlesen wie man was schreibt, also was der Syntax in C-Sprache ist.
Title: Re: PWM-Signal auswerten
Post by: michael_x on Feb 26, 2013, 10:20 pm
Quote
Aber ich verstehe nicht, wie das zusammen mit dem "="

Das ist ein C - Trick, der es evtl. auch den ersten nicht so gut optimierenden Compilern einfacher machen sollte.

Statt a = a+10; kann man auch a+=10; schreiben : addiere 10 zur Variablen a.
Dies geht mit den meisten Prozessoren einfacher als wenn links und rechts des = verschiedene Variablen stehen. ( y = x+10 )

Das funktioniert nun nicht nur mit +, sondern mit allen ähnlichen Operatoren, unter anderem auch dem "bitweisen xor"  ^

toggle ^= 1; // invertiere in "toggle" das Bit mit der Wertigkeit 1  
d.h. aus 1 wird 0 und aus 0 wird 1 ,  aus true wird false und umgekehrt.
 
Aber aus 2 wird 3 und aus 3 wird wieder 2, und -noch verrückter-  aus -1 ( 0xFF ) würde -2 ( 0xFE oder 254 )
und alle diese 4 Werte würden als true und damit HIGH interpretiert werden, also Vorsicht, Doc.


Entschuldige, dass du so viel Mühe hast, mir deine zwei delays zu zeigen. Ja, ich habe mir den Link genau genug angesehen, um die 2 Sekunden-Pausen zu sehen.
Ich habe allerdings auf   Reply #38 on: February 16, 2013, 02:39:17 PM »  (http://arduino.cc/forum/index.php/topic,148970.msg1121435.html#msg1121435)  geantwortet. ;)



Quote
Psychologische Antworten bringen mir bei meinem Problem auch nicht viel

;) Du musst auch ein bisschen an die anderen denken ;)

Wenn man sich diesen Thread mal ansieht, hat sich seit
      if (a>1450 && a<1500 && LED2v=LOW)
doch schon einiges getan.

Aber dass der Arduino sich bei ausreichender Stromversorgung mit 7V an Vin sich total anders verhält als bei USB - Versorgung, ist sehr seltsam.
Vor allem, dass alles weiter geht, nur der LED Zustand sich nicht mehr verändert.

Was total blödes, ist gut möglich, aber was, kann ich so auch nicht raten.
Daher mein Vorschlag: vereinfachen, Teile einzeln testen.

Wenn du den Effekt (LED bleibt an wenn der sketch mit Vin-Stromversorgung läuft, LED lässt sich mit dem gleichen sketch steuern, wenn der Arduino an USB hängt)
in einer möglichst einfachen Umgebung reproduzieren kannst ( und dann nicht selbst verstehst ;)  ) mach einen neuen Thread auf, mit Hardware-Beschreibung (Schaltung) und dem Einfach-Sketch.

 
Title: Re: PWM-Signal auswerten
Post by: Doc_Arduino on Feb 27, 2013, 12:32 am
Hallo,



toggle ^= 1; // invertiere in "toggle" das Bit mit der Wertigkeit 1  
d.h. aus 1 wird 0 und aus 0 wird 1 ,  aus true wird false und umgekehrt.
 
Aber aus 2 wird 3 und aus 3 wird wieder 2, und -noch verrückter-  aus -1 ( 0xFF ) würde -2 ( 0xFE oder 254 )
und alle diese 4 Werte würden als true und damit HIGH interpretiert werden, also Vorsicht, Doc.


Die Erklärung ist vielleicht etwas zu kurz gefasst. Aus 2 wird nur 3 und umgekehrt wenn die zu toggelnde Variable vorher den Wert 2 oder 3 hatte und man mit der Wertigkeit 1 toggelt.
Wie Du allerdings auf negative Werte kommst verstehe ich auch nicht. 0xFF ist immer noch 255 und nicht -1.   :~ 

@ Bluetruck:
Wenn Du mal rumspielen willst mit dem toggeln, egal mit welcher Methode, dann lade Dir mal den Simulator runter
http://www.arduino.com.au/Simulator-for-Arduino.php (http://www.arduino.com.au/Simulator-for-Arduino.php)

und nimm erstmal folgenden Code und schaue Dir im Input/Output Fenster an was ausgegeben wird. Dann änderst Du den Wert von der Variablen WERTIGKEIT und später den Wert der Variablen WERT und guckst was passiert. Alles zwischen 0 ... 255. Gut wäre es wenn Du Dir vorher überlegst was passieren müßte und dann überprüfst ob das stimmt.

Du kannst das natürlich auch immer in Deinen µC flashen und in der IDE anschauen. Allerdings nicht wundern im IDE, hier werden nur die untersten Bits ausgegeben bis zu letzten enthaltenen 1. Den Rest der Nullen der höherwertigen lässt er weg. Also wenn 00001111 ausgegeben wird, erscheint nur 1111. Deshalb habe ich als Startwert 255 gewählt, dann bleibt erstmal die binäre Optik erhalten.

Code: [Select]

byte WERT = 255;
byte WERTIGKEIT = 1;       // welches Bit oder Bits werden getoggelt

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

void loop()
{

  WERT = WERT ^ WERTIGKEIT;            // toggeln mit Wertigkeit x
  Serial.println(WERT, BIN);                 // BIN = binäre Ausgabe

  delay(1000); 
}


und Entschuldigung wegen der Schreibweise ^=. Dass das die Kurzform ist, daran hatte ich in dem Moment nicht gedacht.  TOGGLE = TOGGLE ^ 1 ist das gleiche wie TOGGLE ^= 1
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Mar 10, 2013, 03:41 pm
So,
Problem 1, also das Prob. mit dem USB, konnte ich lösen. Lag daran, dass der pulseIn() Bereich zu klein war.
2. Problem, toggle, ist jetzt vorerst nicht so wichtig. Irgendwie muss ich mich da mal länger damit beschäftigen.

Mein größtes Problem (motivierender: Hinderniss   :smiley-mr-green:), ist, dass wie gesagt die LED nicht korrekt schaltet.
Mit einem anderen Bereich des pulseIn() konnte ich es nicht lösen, auch andere Variablen haben nichts erbracht.
Hat da jemand eine Idee?
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Mar 13, 2013, 08:40 pm
Weiß denn keiner was?
Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Jul 21, 2013, 03:32 pm
Nach einer langen Pause hab ich mich mal wieder mit dem Thema auseinandergesetz. Mit meinem Dad hab ich folgende Grundidee entwickelt: Wenn ich einen mechanischen Schalter betätige, entsteht anfangs nie ein exakt genaues Signal (Funke). Erst mit der Zeit (ein paar millisekunden). Das erste falsche Ergebnis reicht aber aus, um meine bisherige Schaltung zu manipulieren. Also: die if-gleichung wird erst dann in Kraft gesetzt, wenn das eingangssignal (pulseIn) seit ein paar ms konstant ist.



Wie ihr seht, hab ich hier einige Probleme. zum einen, wie ich die erste if-gleichung verwirkliche. Also das mit der maximalen Abweichung von p1. Das zweite Problem ist das "goto". Das goto funktioniert ja nur innerhalb einer Funktion, also nicht übergreifend. Ich weiß, das wird nicht gern gesehen, aber ich sehe hier keine andere Lösung.

Das Bild ist jetzt ein ganz einfacher Gedankenentwurf, bitte schimpft nicht, wenn ich das nicht so formal korrekt habe.
Title: Re: PWM-Signal auswerten
Post by: Serenifly on Jul 21, 2013, 04:00 pm
Code: [Select]

bool func()
{
    if( (p2 > p1 - p1/10.0) && (p2 < p1 + p1/10.0) )
    {
    }
    else
    {
          return false;
    }


    if(z == 5)
    {
    }
    else
    {
        return true;
    }

    return true;
}


Code: [Select]

if(func() == true)
{
}
else
{
}



So ähnlich. Wichtig dabei ist dass jeder Weg im Code einen return-Wert zurückgegeben muss. Deshalb das "return true" am Ende wenn b beide Bedingungen "true" sind. Wenn mehr als zwei Rückgabe-Zustände gebraucht werden kann man auch ein Byte zurückgeben und dann auf eine Zahl abfragen.

Wenn du solange etwas machen willst bis eine bestimmte Bedingung eintritt geht das aber auch einfach mit einer while-Schleife. z.B. kannst du solange die Funktion aufrufen bis sie "true" zurückgibt (while(func() == false {}). Das machst du wenn "z == 5". Ansonsten gibst du "false" zurück.

Aber ist das nicht unnötig? Wenn du einen Taster entprellen willst kannst du einfach nach der ersten Abfrage mit digitalRead() ein kurzes Delay machen. 10-20ms reichen da. So super genau muss das nicht sein. Es gibt auch eine Library dafür:
http://playground.arduino.cc//Code/Bounce
Title: Re: PWM-Signal auswerten
Post by: TERWI on Jul 21, 2013, 04:59 pm
Sehr interessant hier mitzulesen !

Ich bin auch Hobby-RC-ist (Heli) und beschäftige mich seiner geraumer Zeit wieder damit.
Nachdem ich den Arduino hier sehr positiv kennen gelernt habe und seine Eigenschaften sehr zu schätzen weiß, soll der logo auch am Hubi ran.
Neben 1000 Ideen u.a. zum Ersatz des alten Gyro's mit neuen Teilen (6050,5883,BMP180) soll auch wie hier gefordert die gute alte Fernsteuerung (Robbe FX18, 8-Kanal) ein bischen gepimt werden und z.b. wie Bluetruck es möchte durch mehere Schaltkanäle ergänzt werden.

Dafür gibts es zwar von Robbe (alt !) entsprechende Module wie z.b. den Multi-Switch 16 Decoder Memory, aber so ein Teil kostet heute immer noch locker deutlich mehr als 100 Taler-Euronen .... Also: selber machen !

Extrem genial wäre z.b.  einen noch freien Kanal (ich hab hier 8, 5 werden zwingend benötigt, einer wird als "10er-Schalter" missbraucht  und einer als "Werte-Kanal" für alles Mögliche -> 1 ist noch frei) durch die "Schalter" das PWM-Signal an verschiedene Ausgänge zu leiten und somit noch mehr Servos steuern zu können als eigentlich möglich. Natürlich nicht zeitkritisch für das Modell !
(Ja, auch das gabs es früher schon von Robbe & Co. - allerdings ebenfalls nicht grade preiswert !

Neben den erforderelichen Korrekturen der Steuersignale für meinen Heli (hier Roll, Pitch, Nick, Tail und Motor) durch zu implementierende Gyro, Kompass und Narometer müssen neben den o.g. Dingen halt alle 8 Signale der Fernsteuerung zunächst eingelesen und dann ggf. "behandelt weitergegeben werden.
(.... ja, so was wie MultWii für Arme / normale Heli-Flieger - ich werde draus abkupfern ...  :.)

Mit "pulseIn" kommt man da aber anscheinend nicht sehr weit - ich hab mal rumgeguckt und das hier für dass richtige entschieden:
http://playground.arduino.cc//Code/ReadReceiver (Auslesen aller Kanäle einer RC-Fernbedienung mit PWM am Empfänger-Ausgang)
In Kombination mit der Servo-Lib (Arduino-Intern) und modifiziertem Timer dazu sollte das schon sehr gut funzen ....

Die Idee, anstatt eines 'Knüppels" mit gleitendem PWM durch einen Schalter mit festen PWM-Zeiten zu ersetzen finde ich schon sehr genial !
Natürlich muss man da eine wie hier beschriebene "Toggle"-Variable haben, um zu definieren, ob der Zustand bereits gesetzt wurde oder nicht oder zurück.
... ich würde das ehrlich gesagt auch schon 2x nacheinander Prüfen - zur Sicherheit.
... logo schliesst das ein sicheres Ausschließen von Tastenprellen nicht aus (senderseitig)


Title: Re: PWM-Signal auswerten
Post by: Bluetruck on Jul 23, 2013, 09:31 pm
1) Wieso kein delay: über pulseIn() kommt kontinuierlich aller 2ms ein neuer Wert. Wenn ich jetzt immer 10ms Pause mache, wird doch einfach nur jeder 5. Wert abgefragt. Damit wird aber nicht ausgeschlossen, dass er falsch (Tasterprellen) ist. Ich muss ergänzen, dass die 10% maximale Abwichung zu viel wäre, 1-2% reichen.

2) Kannst du mir das mit dem return nochmal erklären? Ich versteh das nicht ganz. Also return als einzelne Funktion versteh ich schon, aber den Unterschied zwischen return false und return true. bzw. return 1 und return 0 nicht.

3)Bei dem Link, den TWERI gepostet hast, versteh ich nur Bahnhof...;) Das ist (hoffentlich nur vorerst) zu hoch für mich. Es gibt schon einen Multiswitch für 20€ zu kaufen, der nach dem selben Prinzip arbeitet (wetteringer-modellbauforum, hab keinen konkreten Link mehr). dummerweise hab ich den erst entdeckt, als ich mir den Arduino schon gekauft habe...Jetzt hat der Bastlerwille gesiegt, sowas selber zu machen ;)


Hier nochmal mein Sketch, bei dem halt besagtes Problem aufgetreten ist....Dem möchte ich nun die "Funktion" fürs Tastenentprellen davorsetzen.
Code: [Select]
void setup ()
{
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (3, INPUT);
}

void loop (){
  int a = pulseIn(3,HIGH,24000);//Ließt Eingangssignal
  boolean vLED1 = false;//Hilfsvariable wird zusammen mit der LED auf "true" gesetzt, wenn if-Bedingung erfüllt wurde. Am Ende des loop-teils werden, wenn das Einganssignal in der "Mittelstellung" ist, alle Hilfsvariablen wieder auf "false" gesetzt. Somit kann die LED wieder umgeschaltet werden.
  boolean vLED2 = false;//
  int iLED1 = digitalRead(5);//Ließt Status von LED1
  int iLED2 = digitalRead(6);

  //if-Bedinung für LED1
  if (a>1220 && a<1245 && iLED1==LOW && vLED1 == false){//Wenn Eingangssignal zwischen 1228 und 1242, Ausgang an LED1 aus und der Status des Ausgangs in diesem loop-durchgang noch nicht verändert wurde, dann
    digitalWrite (5,HIGH);//schalte Ausgang an
    vLED1 = true;//Setze Hilfsvariable auf true. Nächste if-bedinung stimmt somit nicht mehr (bis Eingangssingal in "Mittelstellung" und die LED bleibt an.
  }
  if (a>1220 && a<1245 && iLED1==HIGH &&  vLED1 == false){//Gleich wie oben, bloß umgekehrt zum ausschalten der LED
   digitalWrite (5,LOW);
   vLED1 = true;
  }
    //if-Bedinung für LED2
  if (a>910 && a<940 && iLED2==LOW && vLED2 == false){
    digitalWrite (6,HIGH);
    vLED2 = true;
  }
  if (a>910 && a<940 && iLED2==HIGH &&  vLED2 == false){
   digitalWrite (6,LOW);
   vLED2 = true;
  }
      //if-Bedinung zum Zurücksetzen der Hilfsvariablen bei Mittelstellung des Eingangssignals
  if (a>1485 && a<1510){
    vLED1 = false;
    vLED2 = false;
  }                     
}
Title: Re: PWM-Signal auswerten
Post by: Serenifly on Jul 23, 2013, 10:10 pm

2) Kannst du mir das mit dem return nochmal erklären? Ich versteh das nicht ganz. Also return als einzelne Funktion versteh ich schon, aber den Unterschied zwischen return false und return true. bzw. return 1 und return 0 nicht.

Funktionen habe Rückgabe-Werte die in C alle elementaren Datentypen oder Pointer sein können:

void func() <--- kein Rückgabe Wert (siehe setup() oder loop())
int func() <--- gibt einen Integer zurück
byte func() <--- gibt ein Byte zurück
bool func() <---- gibt einen Bool/Boolean zurück

Das ist eine ganz grundlegende Sache, die dir mal ansehen solltest: z.B. wenn man zwei Zahlen addieren will:
Code: [Select]

int summe(int x, int y)
{
    return x + y;
}

int summe = summe(2, 3);


Wenn du eine Funktion aufrufst kannst du dann deren Rückgabe-Wert speichern. z.B.

int ret = func();

Dann schreibt er dir den Rückgabe-Wert der Funktion in ret. Aber man kann der Wert auch direkt in einer if-Abfrage o.ä. verarbeiten:

Code: [Select]
if(func() == 1)
{
}


Das ist das gleiche wie:
Code: [Select]

int ret = func();

if(ret == 1)
{
}



Wenn du dann so eine verschachtelte Funktion wie bei dir hast und du vorzeitig abbrechen willst, kann man über den Rückgabe-Wert feststellen wo der Abbruch war. Eben indem man einfach für jeden Zweig ein anderen Wert zurück gibt. Bool kann "true" oder "false" sein, also zwei Zustände. Wenn mehr gebraucht werden kann man byte oder int nehmen.


Überlege aber mal ob die nicht eventuell mit einer while-Schleife besser bedient bist. Also solange die Pulse-Länge messen, bis eine bestimmte Bedingung eintritt:

Code: [Select]

wert = messung();

while(wert != gewünschter Wert)
{
     wert = messung();
}


Ich glaube das geht eher in die Richtung die du willst