Arduino DMX mit Master Dimmer und Strobo mit der DMX.Serial Libary

  • Hallo Miteinander

    Ich bin auf der suche nach einem Weg einen Master Dimmer und Strobo für ein RGB Band zu erstelle mit dem Arduino habe es auch geschafft die LEDs zu mischen das war kein Problem den Dimmer habe ich so halb hin bekommen aber nach der hälfte der Dimmung fangen die LEDs an zu flackern und die Farben sich zu vermischen ich habe 4 TIP31C benutzt 3 für RGB und einen davor geschalten für den Dimmer mit einem 10 Ohm widerstand. Vielleicht weiß ja jemand wie das bei einem Richtigen Scheinwerfer funktioniert. Ich Packe meinen Aufbau und Code mal hier rein nicht wunder auf dem Breadboard sieht es ein wenig unordentlich aus :D



    Ich würde mich über jede Hilfe freuen danke schon mal im Voraus

    LG euer Arduino Master ;)


    Hier mein Code :



    Moderator-Edit:

    ich hab mir erlaubt deinen Code mal in den Code-Tag zu packen - besser lesbar ;)

    Grüße, Souko

  • Einen vierten PWM-Ausgang als vorgeschalteten Dimmer zu verwenden schreit geradezu nach den Schwebungen, die du siehst. Das dürfte nur gehen, wenn dein Gesamt-Dimmer mit einer deutlich höheren PWM-Frequenz laufen würde als die Einzelfarben.

    Ich würde das einfach in Software erledigen: Die einzelnen Kanäle jeweils mit dem Dimmer-Wert multiplizieren und dann wieder auf 0-255 skalieren.

    Etwa so, pro Kanal:


    Code
    analogWrite(RedPin, ((uint16_t)DMXSerial.read(1) * (uint16_t)DMXSerial.read(4)) >> 8);


    Ist aber ungetestet ;) Der Bitshift um 8 nach rechts bringt das Ergebnis wieder in den richtigen Wertebereich und geht viel schneller als eine echte Division durch 255. Da allerdings durch 256 (statt 255) geteilt wird, entsteht ein kleiner Fehler. Der sollte aber nix ausmachen.


    Stefan

  • was bedeutet das unit 16

    uint16_t steht für "Unsigned Integer, 16 Bit", also ein 16 Bit breiter Integer ohne Vorzeichen. In runden klammern vor einer Variable (oder auch Konstante) ist es ein Type Cast, die Variable wird also als der angegebene Typ interpretiert. Das ist hier nötig, da das Ergebnis nicht mehr in eine 8 Bit breite Variable passen würde. Das .read() der DMXSerial-Lib liefert nämlich uint8_t zurück.


    Stefan

  • stimmt und DMX kann ja 8 und 16 bit

    Das stimmt so nicht. Jeder DMX-Kanal kann immer nur 8 Bit haben, also Werte von 0-255. Manche Geräte fassen halt 2 Kanäle zu einem virtuellen 16-Bit-DMX-Kanal zusammen, aber das hat nichts mit dem eigentlichen Protokoll zu tun.

    Der Typecast hat hier aber nichts mit DMX zu tun, sondern ist einfach nötig damit das Ergebnis der Berechnung in den vorgesehenen Speicher passt und nicht abgeschnitten wird.


    Stefan

  • LEDs haben eine nichtlineare Dimmerkurve. Das könnte eventuell das Problem sein, warum nicht genug gedimmt wird, und plötzlich aus ist.


    Schau mal hier ist ein Artikel dazu: https://www.mikrocontroller.net/articles/LED-Fading


    Funktioniert denn die elektritsche Schaltung? Wenn du feste Werte in das Programm einträgst anstelle von DMXSerial.read dann gehts?


    Dann hilft nur, mal die Ausgabe von DMXSerial.read irgendwo hin zu schreiben, sodass man sich das anschauen kann. Eigentlich müsste das ja dem DMX Wert entsprechen.

  • Die Leds gehen bei mir leider gar nicht auch sie flackern schneller oder langsamer und dimmen sich nur minimal

  • Code
    analogWrite(RedPin, ((uint16_t)DMXSerial.read(1) * (uint16_t)DMXSerial.read(4)) >> 8);

    Aber bei dieser Lösunge kommt doch (wenn beide Werte 255 sind) nur 254 raus, oder habe ich gerade einen Gedankenfehler? Müsste es nicht folgendermaßen berechnet werden:

    Code
    uint16_t tmp = ((uint16_t)DMXSerial.read(1) + 1) * ((uint16_t)DMXSerial.read(4) + 1);
    analogWrite(RedPin, ((tmp - 1) >> 8);
  • Newly created posts will remain inaccessible for others until approved by a moderator.

    The last reply was more than 365 days ago, this thread is most likely obsolete. It is recommended to create a new thread instead.