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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.