LED an PWM PIN gehen nicht ganz aus

Hi zusammen,

ich steige gerade in des Thema Elektronik im Modellbau ein, und für meinen Ecto-1 möchte ich eine rotierendes Blaulicht mit 1206 SMD LED bauen, ähnlich wie hier im Wettringer Modellbauforum beschrieben.

Ich habe an einem Arduino UNO R3 mit Tinkercad eine Schaltung gebaut, die auch grundsätzlich das tut, was sie soll. Allerdings leuchten die LED, wenn ich sie an den PWM PINs betreibe, noch ganz leicht, wenn die LED eigentlich aussehen sollte. Hier ist der Code:

// C++ code
//
/*
  Fade
  This example shows how to fade an LED on pin 9
  using the analogWrite() function.

  The analogWrite() function uses PWM, so if  you
  want to change the pin you're using, be  sure to
  use another PWM capable pin. On most  Arduino,
  the PWM pins are identified with   a "~" sign,
  like ~3, ~5, ~6, ~9, ~10 and ~11.
*/

int brightness = 0;

void setup()
{
  pinMode(9, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop()
{
  for (brightness = 0; brightness <= 255; brightness += 20) {
    analogWrite(9, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
  delay(10); // Wait for 10 millisecond(s)
  for (brightness = 255; brightness >= 0; brightness -= 20) {
    analogWrite(3, brightness);
  }
  for (brightness = 0; brightness <= 255; brightness += 20) {
    analogWrite(6, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
  for (brightness = 255; brightness >= 0; brightness -= 20) {
    analogWrite(9, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
  for (brightness = 0; brightness <= 255; brightness += 20) {
    analogWrite(5, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
  for (brightness = 255; brightness >= 0; brightness -= 20) {
    analogWrite(6, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
  for (brightness = 0; brightness <= 255; brightness += 20) {
    analogWrite(3, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
  for (brightness = 255; brightness >= 0; brightness -= 20) {
    analogWrite(5, brightness);
    delay(10); // Wait for 10 millisecond(s)
  }
}

So sieht der Aufbau in TinkerCAD aus:

So der Schaltplan:

Es sind übrigens so viele LED, weil je vier eine Rundumleuchte bilden, und eine Code 3 XL Light Bar hat links und rechts je zwei Rundumleuchten.

Wenn ich es auf die digitalen PINs, bspw. 13, 12, 8 und 7 umlege, gehen die LED zwar aus, aber der Übergang ist mir zu harsch. Was kann ich tun, damit die LED vollständig ausgehen, wenn sie nicht an sein sollen? Würden SMD LED überhaupt so nachleuchten, wie es jetzt die "normalen" LED tun? Bitte denkt dran, dass ich Einsteiger bin, daher freue ich mich über eine einfach gehaltene Erklärung. :wink:

Vielen Dank für eure Hilfe

Dennis

Ohne deinen Schaltplan im Detail angeschaut zu haben (da wird mir schwindelig, so wie der Strom im Kreis fließt) würde ich einfach mal behaupten, dass brightness nie den Wert Null erreicht. Nach 12*20 = 240 wird noch eine 15 geschrieben, danach ist brightness -5 und das wars dann.

erreichst du denn beim Ausblenden wirklich den brightness-Wert '0'? :wink:

Ich glaube, wenn du von 255 Startwert immer 20 abziehst, landest du am Ende bei 15 und dann ist die nächste LED dran :innocent: Probiers mal mit brightness -= 17

Edit: da war der Basti wohl schneller :sweat_smile:

So 2-3ms, höchstens :wink:

Hätte auch den Vorteil, dass die LEDs auch maximal hell werden. 15*17 = 255 ...

Edit: Wobei mir nicht klar ist, warum das Increment/Decrement nicht einfach nur 1 ist. Oder ist hier noch eine Soll-Drehgeschwindigkeit (oder wie auch immer man das bei Rundumleuchten nennt) einzustellen?

Hallo,

nimm besser eine angepasste Kurve für das Auge linearisiert.
array Tabelle:
0,1,2,3,5,7,10,13,17,21,26,32,38,45,52,60,69,79,89,100,112,125,138,152,167,183,200,217,236,255
und greife mittels Index Inkrement fein zu.
oder noch etwas feiner:
0,1,1,2,3,4,6,7,9,11,13,16,18,21,25,28,32,36,40,44,49,54,60,65,71,77,84,91,98,105,113,121,129,138,147,156,166,176,186,197,208,219,231,243,255

1 Like

Du solltest dir Sorgen um deinen UNO machen. So wie Du die Leds angeschlossen hast, geht das nicht. Du kannst nicht mit einem 50-OHM Vorwiderstand 4 parallel geschaltete LED's betreiben. Zum einen hast Du keine Kontrolle wie sich der Strom auf die Leds aufteilt, zum anderen ist der Strom für einen UNO Ausgang deutlich zu hoch.

Jede Led braucht einen eigenen Vorwiderstand, und bei dem Strombedarf musst Du einen Treiber dazwischenschalten.

1 Like

Das erste delay(10) soll bestimmt in die for-Schleife; wie bei allen anderen auch.

Hi zusammen,

@dsebastian & @derGeppi Das mit dem reduzierten Brightnesswert von 17 hat genau den gewünschten Effekt, vielen Dank! :slight_smile:

@DocArduino: ich bin leider viel zu unerfahren, um deinen Tipp umzusetzen oder zu verstehen, aber das hilft bestimmt anderen mit ähnlichen Problemen.

@MicroBahner Das stimmt, in TinkerCAD sind die Widerstände falsch, ich hatte sie geändert,weil ich dachte, dass es damit zu tun hat und hab da mit den Werten gespielt.in TinkerCAD kann man ja nix kaputtmachen. In meiner Probeschaltung auf dem Breadboard habe ich 480 Ohm Widerstände je LED (oder irgendwie so, ich weiß den genauen Wert nicht..) Was meinst Du mit

bei dem Strombedarf musst Du einen Treiber dazwischenschalten.

? Wie gesagt, blutiger Anfänger..

Hallo dennishh

Willkommen im besten Arduino Forum der Welt :wink:

Hier kommt ein einfaches und schlankes Programm, das die Cosinus-Winkelfunktion verwendet.

void setup()
{
  pinMode (9, OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);
}
void loop()
{
  for (uint16_t n = 0; n <= 360; n++){analogWrite(9, 255.0 * 0.5 * (1 + cos(3.14+(3.14 / 180.0 * n)))), delay(1);}
  for (uint16_t n = 0; n <= 360; n++){analogWrite(10, 255.0 * 0.5 * (1 + cos(3.14+(3.14 / 180.0 * n)))), delay(1);}
  for (uint16_t n = 0; n <= 360; n++){analogWrite(11, 255.0 * 0.5 * (1 + cos(3.14+(3.14 / 180.0 * n)))), delay(1);}
}

In deinen Schaltbilder hast Du 50 Ohm Widerstände - da fließt zuviel Strom für einen Arduino. Aber wenn die Schaltbilder gar nicht mit der Realität übereinstimmen .... sind sie eigentlich wertlos.

Dann schau da genau hin. Und gleiche es hiermit ab: Datenblatt ATmega328P. Kapitel 28.2, und dabei die Fussnoten beachten.
Faustregel: nicht mehr als 20mA pro I/O, aber eben die Gesamtstrom nicht aus den Augen verlieren (eben die erwähnten Fussnoten) und sich stets von den Absolut Ratings (Kapitel 28.1) fern halten. Bei Verwendung von Datenbussen (z.B. I2C) gibt es zusätzliche Einschränkungen.

Du erstellst dir ein Array

const byte HELLIGKEIT [] = {0,1,1,2,3,4,6,7,9,11,13,16,18,21,25,28,32,36,40,44,49,54,60,65,71,77,84,91,98,105,113,121,129,138,147,156,166,176,186,197,208,219,231,243,255};

und greifst mittels Index auf einen Wert zu. Diesen Wert übergibst du an analogWrite().
analogWrite(pin, HELLIGKEIT[i]);

Musst dich nur noch um das Inkrement vom Index kümmern und der Pause dazwischen. Der Index wird nur noch jeweils um +1 oder -1 je nach Richtung geändert. Damit bestimmt nur die Pause die Geschwindigkeit der Helligkeitsänderung. Die Abstufung für Dimmung/Fading steckt schon im Array der linearisierten Helligkeitskurve.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.