Hallo Zusammen,
Ich versuche mit einem Poti eine LED zu dimmen klappt auch prima. Was
ich aber nicht verstehe ist die MAP Funktion in meinem code, warum muss
die sein ? ob jetzt 254 oder 1023 von der Voltanzahl muss es doch das
selbe sein.
int val;
void setup()
{
Serial.begin(9600);
}
void loop()
{
val = map(analogRead(0), 0, 1023, 0, 255);
analogWrite(6, val);
Serial.println(val);
}
Martin W. schrieb:> Hallo Zusammen,>> Ich versuche mit einem Poti eine LED zu dimmen klappt auch prima. Was> ich aber nicht verstehe ist die MAP Funktion in meinem code, warum muss> die sein ? ob jetzt 254 oder 1023 von der Voltanzahl muss es doch das> selbe sein.
Das sind aber nicht Volt, die du vom ADC bekommst.
Wenn die Ausgangsstufe Werte zwischen 0 und 255 haben will, andererseits
aber vom ADC Werte von 0 bis 1023 daherkommen, dann muss man die wohl in
irgendeiner Form umrechnen. Wenn du 1024 Paar Schuhe hast, aber nur 256
Fächer, dann muss es irgendeinen Mechanismus geben, der dafür sorgt dass
alle Schuhe in die verfügbaren Fächer 'einsortiert' werden.
Dividieren durch 4 hätte es auch getan, aber mit der map Funktion kann
man jeden Bereich in jeden anderen Bereich umrechnen lassen.
hmmm
woher wüsste man denn, dass die LED Werte von 0-255 haben möchte, wenn
man kein google hätte ?
ich hatte mal folgende Formel aufgeschnappt. Die 5 V werden am ADC durch
1024 geteilt: also 0,0488 * den Wert den man dann ausgibt z.B. 100 wären
dann 4,88 V.
Die Mapfunktion hatte ich immer nur als umrechnung in ein anderes
Verhältnis gesehen (bei Servo z.B. 0-180).
"Das sind aber nicht V die da durch kommen" Was denn ? Beim Servo würde
ich es ja noch verstehen der hat eine seperate Datenleitung aber die LED
ist doch mit +- verbunden.
Sorry für Basicfragen.
Martin W. schrieb:> hmmm>> woher wüsste man denn, dass die LED Werte von 0-255 haben möchte, wenn> man kein google hätte ?
Es ist nicht die LED. Es ist der analoge Ausgang.
Und dafür gibt es Dokumentation, was der kann.
> "Das sind aber nicht V die da durch kommen" Was denn ?
Ein Zahlenwert zwischen 0 und 1023, der in Zusammenhang mit der Spannung
am analogen Eingang steht. Aber wie dieser Zusammenhang konkret
aussieht, hängt auch von der Höhe der Referenzspannung ab.
Natürlich hast du schon recht, die Höhe des Wertes spiegelt die Höhe der
Spannung wieder, aber um daraus die effektiven Volt zu erhalten, musst
du umrechnen. Und in vielen Fällen braucht man die tatsächlich
anliegenden Volt überhaupt nicht umrechnen.
Da könnte ja auch ein Poti als Spannungsteiler am ADC hängen und ich
kann genausogut mit Fug und Recht sagen:
Wenn das Poti am linken Anschlag ist, dann kriege ich einen Wert von 0
Ist das Poti aber am rechten Anschlag, dann kriege ich einen Wert von
1023.
Also repräsentiert der Wert, den ich bekomme, den Drehwinkel von links
nach rechts. 0 ist linker Anschlag, 1023 ist rechter Anschlag und
beispielsweise bei einem Wert von 511 habe ich mein Poti genau in die
Mitte gedreht; bei 255 ist es in der Stellung "1/4 aufgedreht" usw. usw.
Oder Helligkeiten, die ich mit einem LDR messe. Einen Wert von 0 kriege
ich wenn es stockdunkel ist, 1023 wenn der Bauscheinwerfer draufstrahlt
und Werte dazwischen repräsentieren unterschiedliche Helligkeiten.
Natürlich: Da beide Beispiele (und noch viele mehr) letzten Endes darauf
basieren, dass ich die Messgröße geeignet in eine Spannung verwandelt
habe, messe ich natürlich immer eine Spannung und kriege vom ADC den
Wert dieser Spannung. Aber: im eigentlichen Sinne muss mich die Spannung
nicht interessieren. Da ist eine Verabreitungskette
Messgröße --- Sensor ---- Blackbox --- ADC ------- Programm
wie diese Blackbox den Sensorwert in eine Spannung verwandelt muss mich
in vielen Fällen nicht wirklich interessieren. Ich brauch nur die
Endpunkte dieser Kette.
Messgröße -------------------------------------- Programm
Welcher Messgröße entspricht der Wert 0 (den ich vom ADC bekomme)
Welcher Messgröße entspricht der Wert 1023 (den ich vom ADC bekomme)
Das ist doch das, was mich letzten endes interessiert. Und wenn die
Messgröße der momentane Luftdruck ist, dann ist er das eben und ich
stelle eine Beziehung zwischen den Werten 0..1023 und den dazugehörigen
Luftdrücken her. Das da zwischendurch mal Spannungen in der
Verarbeitungskette im Spiel waren und die Messgröße in eine Spannung
verwandelt wurde um dann mit dem ADC gemessen zu werden, ist ein Detail
in der Kette, welches nur dann zu tage tritt, wenn da irgendwo
Nichtlinearitäten enthalten sind. Ansonsten braucht mich das nicht zu
kümmern. Das Programm bekommt Zahlenwerte zwischen 0 und 1023. Was immer
die dann letzten Endes auch bedeuten. 0 ist der eine Endanschlag, 1023
ist der andere Endanschlag. Und Werte dazwischen sind dann eben einfach
nur Werte dazwischen.
Also: löse dich von der Vorstellung, dass du da eine Voltzahl bekommst.
Das kann so sein und manchmal ist das auch sinnvoll (zb wenn du ein
Voltmeter baust) das so zu sehen, aber oft ist es auch genauso sinnvoll,
die Volt links liegen zu lassen und einfach nur festzuhalten: Der Wert
spiegelt das Verhältnis meiner Messgröße in Bezug auf ihre Endanschläge
wieder. So wie eine Prozentzahl - Poti zu 10% aufgedreht; Poti zu 67%
aufgedreht; Poti zu 100% aufgedreht. Nur dass der Zahlenwert nicht von 0
bis 100 geht, sondern eben von 0 bis 1023. Aber das soll ja kein Problem
sein: ist doch nur ein anderer Zahlenwert und ändert am Prinzip nichts.
Martin W. schrieb:> woher wüsste man denn, dass die LED Werte von 0-255 haben möchte, wenn> man kein google hätte ?
Auf Arduino.cc gibt es diese Tutorial-Seite:
http://www.arduino.cc/en/Tutorial/PWM
Zitat daraus:
> A call to analogWrite() is on a scale of 0 - 255, such that> analogWrite(255) requests a 100% duty cycle (always on), and> analogWrite(127) is a 50% duty cycle (on half the time) for example.
Und wenn Du jetzt mal in Betracht ziehst, daß die Arduino-Funktion
"analogRead()" einen Wertebereich von 0 ... 1023 hat und die
Arduino-Funktion "analogWrite()" einen Wertebereich von 0 ... 255, was
folgt daraus?
Umrechnen, wenn der gesamte Eingangswertebereich (0...1023) auf den
gesamten Ausgangswertebereich (0...255) abgebildet werden soll!
Trotz der Namensähnlichkeit haben die beiden Funktionen technisch
überhaupt nichts miteinander zu tun, und das ergibt sich nicht nur aus
den Unterschiedlichen Wertebereichen des Rückgabewertes dieser
Funktionen:
analogRead() ist eine Funktion, die auf einen Analog-Input angewendet
wird.
analogWrite() ist eine Funktion, die auf einen der wenigen
Digital-Outputs mit PWM angewendet werden kann.
Statt eines Mappings braucht man wie oben bereits von Karl Heinz B.
erwähnt auch nur den Messwert zu vierteln, damit er als Ausgabewert für
den PWM-Ausgang passt:
1
val=analogRead(analogPin);// read the input pin
2
analogWrite(ledPin,val/4);// analogRead values go from 0 to 1023, analogWrite values from 0 to 255
Im übrigen ist es bei weitem nicht so "dass die LED Werte von 0-255
haben möchte", sondern die LED möchte mit einem Strom betrieben werden,
dessen Maximalwert durch den Vorwiderstand in Deiner Schaltung
festgelegt ist. Und der Trick beim Herunterdimmen besteht darin, dass
dieser LED-Strom zeitweise ausgeschaltet wird, und zwar so schnell und
so oft pro Sekunde, dass das menschliche Auge dabei kein Flimmern
wahrnimmt. Wobei ein Arduino mit seiner PWM das Tastverhältnis zwischen
EIN/AUS in 256 Stufen regeln kann. Diese 256 Stufen sind nichts "was die
LED haben möchte", sondern das "was der Arduino liefern kann" (bzw. der
darin verbaute Atmega328 Mikrocontroller).
Danke euch beiden für eure Zeit.
> Und wenn Du jetzt mal in Betracht ziehst, daß die Arduino-Funktion> "analogRead()" einen Wertebereich von 0 ... 1023 hat und die> Arduino-Funktion "analogWrite()" einen Wertebereich von 0 ... 255, was> folgt daraus?> Trotz der Namensähnlichkeit haben die beiden Funktionen technisch> überhaupt nichts miteinander zu tun, und das ergibt sich nicht nur aus> den Unterschiedlichen Wertebereichen des Rückgabewertes dieser
Da lag wirklich mein Fehlgedanke, hatte beide gedanklich gleich gesetzt.