Litophane beleuchten

Weihnachten kommt jedes Jahr wieder - Du hast also noch > 1 Jahr Zeit :wink:
Die SoftPWM der MobaTools ist aber einen Test wert.

Gruß Tommy

Ich habe meine Lithophane so beleuchtet:

Ein Lithophane habe ich auch mit WS2812 und WLED beleuchtet. Das war deutlich aifwendiger.

Ich empfehle die erste Variante.

GehĂ€use mit Alufolie von innen bekleben. Die Lichterkette gleichmĂ€ĂŸig verteilen und mit Heisklebe befestigen.

Beste GrĂŒĂŸe,
Chris

So der PCA9685 ist da inkl Leuchtdioden weiss... jetzt heisst es ein tutorial finden wo alles mal erklÀrt wird :wink:

Die meisten Beispiele sind fĂŒr RC-Servos die brauchen aber eine ander Art Signal als LEDs
Hier eine simpel-Library

oder die "standard" library

vgs

mit dem mittleren code komme ich nicht zugange
#include <I2C.h> diese Bibliothek kann ich nicht finden

Arduinos programmieren ist Informatik.
Und was man bei jedem Informatik-Projekt am meisten benötigt ist
ausreichend Information

Wenn du kein Englisch kannst: Informatik einsetzen. (Braucht halt auch ausreichend Information um zu funktionieren
https://translated.turbopages.org/proxy_u/en-de.en.bdb4975d-639b887d-f20c0464-74722d776562/https/forum.arduino.cc/t/if-you-get-a-compiler-error-provide-all-details-for-analysing-the-error/971255

vgs

ok... also ich habe mal folgendes gebastelt. Ich habe 3 LED's welche der Reihe nach aufleuchten. Dazwischen soll der Übergang gedimmt sein, was ich noch nicht habe. Am Ende leuchten alle miteinander, bevor es von vorne los geht.
das ist mal mein Code:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
 
void setup() {
  Serial.begin(9600);
  Serial.println("16 channel PWM test!");
  pwm.begin();
  pwm.setPWMFreq(1600);  // This is the maximum PWM frequency
 
  // save I2C bitrate
  uint8_t twbrbackup = TWBR;
  // must be changed after calling Wire.begin() (inside pwm.begin())
  TWBR = 12; // upgrade to 400KHz!
 
}
// Bis hier hin habe ich alles aus einem Beispiel genommen. Was das TWBR genau bedeuted oder macht weiss ich noch nicht.

void loop() {
  //Hier möchte ich eine LED nach der anderen fĂŒr zb 8 Sekunden lang leuchten lassen
  //Nach den 8 Sekunden soll fĂŒr 2 sekunden oder 5 Sekunden die leuchtende LED runterdimmen und die neu langsam an gehen

  //eine LED nach der anderen einschalten und ausschalten
  pwm.setPWM(0, 4096, 0);
  pwm.setPWM(4, 0, 4096);
  pwm.setPWM(8, 0, 4096);
  delay(8000);
  //dimmen -- ev mit einer Schleife?
  pwm.setPWM(0, 4096, 0);
  pwm.setPWM(4, 0, 4096);
  delay(5000);
  //ende dimmen
  pwm.setPWM(0, 0, 4096);
  pwm.setPWM(4, 4096, 0);
  pwm.setPWM(8, 0, 4096);
  delay(8000);
  pwm.setPWM(0, 0, 4096);
  pwm.setPWM(4, 0, 4096);
  pwm.setPWM(8, 4096, 0);
  delay(8000);
  pwm.setPWM(0, 4096, 0);
  pwm.setPWM(4, 4096, 0);
  pwm.setPWM(8, 4096, 0);
  delay(8000);
}

Funktioniert abgesehen vom dimmen schon mal gut. Ausser dass ich noch googeln muss was es mit diesem Teil genau auf sich hat:

pwm.setPWMFreq(1600);  // This is the maximum PWM frequency
 
  // save I2C bitrate
  uint8_t twbrbackup = TWBR;
  // must be changed after calling Wire.begin() (inside pwm.begin())
  TWBR = 12; // upgrade to 400KHz!

erzeugt servo-signale die

Servo-Signal
mobile robot - Finding the position of a servo - Robotics Stack Exchange
bei einem RC-Servo-signal ist die höchste Einschaltdauer 10% = 10% Helligkeit. Niemals mehr

PWM-Signal = ANDERS als RC-Servo-Signal
image

Einschaltdauer bis 100% = volle Helligkeit

Sich mit duckduckgo wissen ĂŒber Arduino-Programmieren aneignen

Suche nach "Arduino" + Fachbegriff
Arduino TWBR

1 Like

In diesem code-Beispiel werden alle 16 LED KanÀle rauf und runter gedimmt

Wenn man in die library selbst hineinschaut sieht man welcher Parameter was ist

/*!
 *  @brief  Sets the PWM output of one of the PCA9685 pins
 *  @param  num One of the PWM output pins, from 0 to 15
 *  @param  on At what point in the 4096-part cycle to turn the PWM output ON
 *  @param  off At what point in the 4096-part cycle to turn the PWM output OFF
 */

void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {

Und diese Library und die Demo-Codes sind ein neuerliches Beispiel wie man die Doku zu knapp hÀlt um einfach verstÀndlich zu sein.

Ich finde das zum :nauseated_face: :face_vomiting:
wenn Dokus zu knapp ausfallen

Beispiel-Anwendung

setPWM(PWM-Channel, Einschalt_ZeitPUNKT, Ausschalt-ZeitPUNKT) 

Das heißt es gibt eine Zeitskala von 0,1,2,3,.... 4093,4094, 4095

Die Zahlen geben an zu welchem Zeitpunkt auf der Zeitskala der Ausgang HIGH geschaltet werden soll und wann er wieder LOW geschaltet werden soll.

setPWM(LED_Nr, 5, 13);
          HHHHHHHHHHHHHHHHHH 
0,1,2,3,4,5,6,7,8,9,10,12,13.......4093,4094,4095



setPWM(LED_Nr, 0, 10);
HHHHHHHHHHHHHHHHHHHHHH 
0,1,2,3,4,5,6,7,8,9,10,12,13..2048,2049.....4093,4094,4095


setPWM(LED_Nr, 0, 2048);  // = 50% ein , 50% aus
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 
0,1,2,3,4,5,6,7,8,9,10,12,13..2048,2049.....4093,4094,4095


setPWM(LED_Nr, 0, 1024);  // = 25% ein , 75% aus
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 
0,1,2,3,4,5,6,7,8,9,10,12,13.......1023,1024......2048,2049.....4093,4094,4095

vgs

1 Like
for (uint16_t i=0; i<4096; i += 8) {
      pwm.setPWM(0, 4096-i, i);
      delay(100);
    }

Wollte mit LED include
<Wire.h> und <Adafruit_PWMServoDriver.h> nun mal selbst 1 led dimmen, mit dem oben stehenden code. aber irgendwie scheint das nicht wirklich zu klappen, bzw sehe ich das dimmen nicht :wink:

hÀtte gerne ganz einfach die leuchtkraft eingestellt und ein fade in und aus programmiert.

Zahlenbeispiel:
pwm.setPWM(7,0,2048);
schalte den Kanal 7 zum Zeitpunkt 0 auf HIGH und zum Zeitpunkt 2048 wiederauf LOW)

Wenn du programmierst

for (uint16_t i=0; i<4096; i += 8) {
      pwm.setPWM(0, 4096-i, i);
      delay(100);
    }

dann fÀngt der code an mit
pwm.setPWM(0, 4096 , 0);

schalte zum Zeitpunkt 4096 auf HIGH und Zum Zeitpunkt 0 auf LOW
und geht dann weiter
pwm.setPWM(0, 4095 , 1);
pwm.setPWM(0, 4094 , 2);

keine Ahnung ob das wirklich so funktioniert.

Wie wÀre es zunÀchst mal mit dem Hin- und Herschalten zwischen zwei festen Zahlenwerten

  pwm.setPWM(0, 100, 4000); // ziemlich lange eingeschaltet = hell
  delay(2000);
  pwm.setPWM(0, 3800, 4000); // ziemlich kurz eingeschaltet = dunkler
  delay(2000);

und von dort ausgehend KLEINE VerÀnderungen des codes
Es gibt die wild herumhĂŒpfen Strategie
schreibe ganz viel Code auf einmal und dann probiere herum
und es gibt die StĂŒck fĂŒr StĂŒck analysieren-Strategie
von einem funktionierenden einfachen Beispiel aus nur ein gaaanz klein wenig Àndern und testen wie es sich auswirkt

  pwm.setPWM(0, 2, 4094); // noch lÀnger eingeschaltet = noch heller?
  delay(2000);
  pwm.setPWM(0, 4000, 4094); // ziemlich kurz eingeschaltet = dunkler
  delay(2000);

usw.

vgs

#include <MobaTools.h>
/* Demo: weiches Auf/Abblenden einer LED
 *  Mit der Klasse SoftLed lÀsst sich eine Led 'weich' ein- und ausschalten
 * Die Led muss nicht an einem PWM-fÀhigen Pin angeschlossen sein, es funktioniert
 * mit jedem Digital-Pin.
 * SoftLed.attach( byte Pinnr );// Anschlußpin fĂŒr die Led festlegen
 * SoftLed.riseTime( int zeit );// Zeit fĂŒr auf/abblenden in ms
 * SoftLed.on();                // 'weich' einschalten
 * SoftLed.off();               // 'weich' ausschalten
*/


const byte ledPin1 =  2;  // beliebiger Digital Pin
const byte ledPin2 =  3;  // beliebiger Digital Pin



MoToSoftLed meinLed1;
MoToSoftLed meinLed2;
void setup() {
    meinLed1.attach(ledPin1); 
    meinLed1.riseTime( 2000 );    // Aufblendzeit in ms
    meinLed2.attach(ledPin2); 
    meinLed2.riseTime( 2000 );    // Aufblendzeit in ms
}

void loop() {
  
	meinLed1.on();
	delay(9000);
	meinLed1.off();
  meinLed2.on();
	delay(9000);
	meinLed2.off();
}

Danke Stefan,
werde das testen. Habe noch mit der mobatools lib gespielt :wink:
dort geht das faden jedoch kann ich die helligkeit der leds nicht Ă€ndern, bzw nur ĂŒber den widerstand. aber werde heute abend nochmals alles testen. Danke

Das widerspricht sich total. Ich verstehe unter "faden" die LED wird langsam heller / dunkler

und du schreibst kann ich die Helligkeit der LEDs nicht Àndern

Ja das stimmt. ich meine damit, dass ich die LED ja einschalte. Dann leuchtet die abhÀngig vom gewÀhlten Widerstand in einer konstanten Helligkeit. Diese Helligkeit hÀtte ich gerne gedimmt, so dass die Helligkeit zB nur mit 70% ist oder 30%. Das Faden fÀhrt ja von 100% auf 0% runter oder von 0% auf 100% hoch. Ich hÀtte gerne zB. bei 70% Leuchtkraft gestoppt und dort mit delay() so lange leuchten lassen wie ich dass dan halt möchte. Wahrscheinlich geht das auch.
Man sollte halt keine Geschenke planen die zu einem Zeitpunkt fertig sein mĂŒssen und man noch keinen Plan von der Materie hat :wink: ... selber Schuld.

welchen Microcontroller hast du?
Arduino Uno, Arduino Mega, Arduino Nano,
ESP8266, ESP32

Ausschnitt aus der MobaTools doku
void myLed.on(uint8_t brightness ); ( nicht bei AVR-Prozessoren )
brightness = 0...100 PWM-Wert fĂŒr ‚ON‘ in %
Die Led wird eingeschaltet.und leuchtet dann mit brightness % der maximalen Helligkeit.
Der PWM-Wert wird fĂŒr nachfolgende EinschaltvorgĂ€nge mit on/toggle/write gespeichert.
Aus KompatibilitĂ€tsgrĂŒnden kann die Methode auch bei AVR-Prozessoren aufgerufen
werden, der ĂŒbergebene Paramter wird allerdings ignoriert.
void myLed.off(uint8_t brightness ); ( nicht bei AVR-Prozessoren )
brightness = 0...100 PWM-Wert fĂŒr OFF in %
Die Led wird ausgeschaltet, leuchtet aber noch mit dem eingestellten PWM-Wert.
Der PWM-Wert wird fĂŒr nachfolgende AusschaltvorgĂ€nge mit off/toggle/write gespeichert.
Der PWM-Wert fĂŒr off muss kleiner sein als der fĂŒr on.

Auf den Punkt gebracht Bei AVR-Prozessoren Arduino Uno, Arduino Mega, Arduino Nano,

myLed.on() immer 100% Helligkeit
myLed.off() immer 0% LED ganz aus

bei anderen Prozessoren einstellbar auf beliebige Werte

Ich habe einen UNO und hÀtte auch ein PCA9685 dazu. Nano hÀtte ich auch, den hatte ich aber noch nie in Betrieb.

Ist aber nicht so schlimm. Ich werde dass dan Falls nötig einfach halten und mit dem Widerstand spielen. Faden geht ja. Dann muss ich noch einen Knopf anschliessen und ev einen Wippschalter fĂŒr an und aus. Damit habe ich genug zu tun.

Also mit dem PCA9685 geht das. Da musst du dich jetzt mal festlegen.
Wie viel Strom ziehen die LEDs die von einem Kanal angesteuert werden.

Da muss man ĂŒberprĂŒfen ob der PCA9685 direkt genug Strom liefern kann oder ob man noch einen Transistor oder MOS-FET braucht um das anzusteuern.

Ich habe es im Datenblatt nachgeschaut. maximal 25 mA. Also vermutlich zu wenig.
Du musst unbedingt eine genau Bezeichnung deiner LEDs posten opder noch besser direkt das Datenblatt.
Es ist absolut entscheidend wie viel Strom die Gesamtzahl der LEDs die nachher an einem Kanal hÀngen ziehen.

Ich werde das Datenblatt im Netz suchen. Ich habe jetzt 3 LED angeschlossen und alle leuchten lassen. Danach leuchten ja von ingesamt 11 maximal 2 zusammen, das sollte doch passen oder. die anderen 9 ziehen ja keinen Strom.

Darauf verlasse ich mich nicht.

Und es kommt auch darauf an wie viele LEDs sind es pro Bild.
Pro Bild heißt pro Kanal am PCA9685

Die Leistungsgrenze des PCA9685 ist 25 mA. Die sollte man nicht ausreizen.

LEDs gibt es Millionen verschiedene deshalb Datenblatt und Foto der LEDs posten. Da sind LEDs dabei die viel mehr als 25 mA Strom ziehen.
Wenn du es dann am 22 Dezember wegen StromĂŒberlastung kaputt gemacht hast reicht es nicht mehr.

Deshalb vorher maximalen Strombedarf feststellen.

Hast du ein Digitalmultimeter? Weißt du wie man damit Strom misst?