Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage Arduino LED Dimmer Poti


von Martin W. (jacksons5)


Lesenswert?

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);




}

von Karl H. (kbuchegg)


Lesenswert?

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.

von Martin W. (jacksons5)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jürgen S. (jurs)


Lesenswert?

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

von Martin W. (jacksons5)


Lesenswert?

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
Noch kein Account? Hier anmelden.