RGBW-Controller mit ATMega88/168 und DMX-Empfang

    RGBW-Controller mit ATMega88/168 und DMX-Empfang

    Viele kennen vielleicht schon den universellen RGB-Controller, den ich vor einiger Zeit noch einmal leicht modifiziert aufgelegt hatte. Seit ca. einem halben Jahr X( arbeite ich an einem 4-Kanal-Controller. Irgendwie kam immer etwas dazwischen. Jetzt ist er fertig geworden (aber was heißt schon fertig...) So, dann zur Tat.

    Wie auch beim 3-Kanal-Controller biete ich hier wieder eine Platine (und auch Bausatz falls gewünscht) an. Ich werde demnächst im Marktplatz etwas dazu einstellen. Schaltung und Layout werden veröffentlicht, so dass jeder seine eigenen Anforderungen umsetzen kann. Die Software wird es auch wieder im Quellcode geben (zumindest die meisten Versionen). Vielleicht will ja der eine oder andere zur Weiterentwicklung beitragen 8) . Hier die Hauptfunktionen zum Controller:
    • bis zu 4 PWM-Kanäle
    • Ausgang entweder direktes PWM-Signal, über Darlington-Array oder über MOSFET
    • bis zu 6 Potis anschließbar (ADC-Eingänge)
    • wahlweise Bestückung der Eingänge mit Tastern oder Encoder (Firmware muss noch angepasst werden)
    • Wannenstecker mit 7 weiteren Ports und Versorgungsspannung, z.B. für den Anschluss eines Displays
    • Bedienung über handelsübliche RC5-Geräte Fernbedienung möglich
    • DMX-Receiver vorbereitet (muss in der Firmware adaptiert werden)


    In der Abbildung sind die beiden Varianten zu sehen. Warum optional mit Darlington-Array? Ganz einfach: ich habe selbst oft die Anforderung, dass ich nur ein paar mA am Ausgang benötige und dafür jedesmal die MOSFETs verwenden erscheint mit sehr aufwendig.



    Die Platine ist in China gefertigt worden. Deshalb ist der Preis ähnlich wie bei der 3-Kanal-Version (3,90 EUR). Ich habe mich diesmal für 70µ Kupfer entschieden, um höhere Ausgangsströme möglich zu machen. Die Leiterbahnen sind schon recht breit, jedoch würde ich generell nicht mehr als 10A gesamt empfehlen.

    Anbei noch die Schaltung und der Bestückungsplan. Wie man sieht habe ich auch einen DMX-Eingang vorgesehen, jedoch noch nicht programmiert. Das wird noch geschehen, aber zunächst stehen noch ein paar andere Funktionen an. Die Firmware (V11) beinhaltet derzeit nur die Fernbedienung. Auch die Potis müssen noch programmiert werden. Dann schweben mir noch ein paar mehr Funktionen vor. Ich wurde auch schon zu anderen Programmen gefragt. Mal sehen, was sich so alles machen lässt.

    Ich hoffe, dass ich keine grundlegenden Fehler im Layout/Schaltung habe. Zumindest sind alle Tests bisher positiv verlaufen. Für Anregungen, Kritik, Wünsche etc. bin ich jederzeit offen.

    ATMega8UniContr v51sch.pdf
    ATMega8UniContr v51Best.pdf
    4K-RC5-v11_20100219.zip

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „turi“ ()

    Software-Varianten

    Hinweis zur Fernbedienung: der Quellcode ist für eine Universal-Fernbedienung vivanco UR12 im TV-Modus Code 102 voreingestellt. Andere FBs oder Codes bedingen meist andere Tastencodes, die im Quelltext angepasst werden müssen.

    Programm v11 Mega88: 4K-RC5-v11_20100219.zip
    • fernbedienbar mit Universal-FB und Philips-TV-Modus
    • 4 Programmteile mit Zifferntaste aufrufbar: 7:"weiß", 8:"RGB", 6:"HSB manuell", 9:"HSB-Fading"
    • Gesamt-Helligkeit über Kanal +/-
    • manuelle Farbanpassung RGB: 1: rot, 2: grün, 3: blau zur Farbwahl und Lautstärke zur Einstellung
    • manuelle Farbanpassung HSB: 1: Sättigung, 2: Farbton zur Farbwahl und Lautstärke zur Einstellung
    • im Fading-Prigramm: 3 zur Geschwindigkeit Fading mit Lautstärke +/-
    • Speicherung eines Programms als Startprogramm: Taste 0, >> (Vorwärts)
    • Aus-/Einschalten möglich
    • div. Spezialtasten für voreingestellte Farben

    Programm v21 Mega168: 4K-RC5-v21_20100405.zip
    • Funktionsumfang von v11
    • einige Farben und Funktionen der Fernbedienung etwas angepasst/verbessert
    • Anschluss-Möglichkeit für 5 Potis (4x Farbe, 1x Helligkeit); Enable über PB6 (Brücke anstelle von C1); ADC-Ports 1-4, 6)
    • Anschluss-Möglichkeit eines Tasters an PB0 (im Wannenstecker gegen Masse Kontakte 9/10) zur manuellen Programmumschaltung, Entprellen über 100nF-Kerko
    Programm v31 Mega168: 4K-RC5-v31_M168_20100420.zip
    • Funktionsumfang von v21
    • Anschluss eines Displays zur Anzeige von Programm, Werten der Fernbedienung etc.
    • zusätzliches Strobo-Programm

    Programm v32 Mega168: 4K-RC5-v32_M168_20100524.zip
    • Funktionsumfang von v31
    • DMX-Empfang auf 10 Kanälen, Startadresse 1 derzeit fest im Quellcode
    • Standalone-Programm für Strobo

    Programm v33 Mega168: 4K-RC5-v33_M168_20100527.zip
    • Funktionsumfang von v32
    • DMX-Empfang auf 6 Kanälen mit Mehrfachbelegung, Startadresse 1 derzeit fest im Quellcode
    • Standalone-Programme für Strobo und Fading



    Bauteilliste

    Die Bauteil-Liste liegt als Anlage bei. Zu beachten ist, dass diese beide Bestückungsvarianten beinhaltet. Die Varianten sind ein einer Spalte entsprechend gekennzeichnet. Alle ICs sind sinnvollerweise auf Sockel zu platzieren.

    BOMVarianten.pdf

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „turi“ ()

    Ja, Preise stehen erst mal fest. Bausatz-Variante 1 mit MOSFETs liegt bei 29 EUR, Variante 2 mit ULN bei 24 EUR. Ich werde wie gesagt gelegentlich noch im Marktplatz das Angebot einstellen. Ich habe inzwischen oben mit der Vervollständigung vom 2. Thread begonnen. Dort sind die Bauteilliste und die Beschreibung der Software untergebracht.
    Also das mit dem DMX-Empfang ist eigentlich recht simpel: Du hast ne ISR, die immer aufgerufen wird, wenn ein Byte reinkommt - das wird dann genommen, und auch geschaut, ob ein Frame Error passiert ist. Dann gibt's noch nen "Zähler" für den aktuellen Zustand, je nachdem wird dann mit dem Byte dies oder das gemacht, also z.B.:

    Status 0: Warten auf den nächsten FE = Beginn einer Übertragung
    Status 1: beim letzten Aufruf war ein FE, also muss nun das Startbyte gekommen sein (überprüfen, ob Byte == 0)
    Status 2: die Bytes werden gezählt, bis die eingestellte Adresse erreicht ist
    Status 3: Adresse erreicht, die Bytes werden in ein Array gespeichert

    und sobald die 4 Kanäle empfangen sind, wird wieder auf Status 0 geschaltet - bei jedem FE auf Status 1...

    wenn man einzelne Adressen "rauspicken" will, bietet es sich auch an, einfach alle 512 Kanäle abzuspeichern, dann entfällt Status 2 z.B. schon mal, und es muss auch nicht gezählt werden, wie viele Kanäle schon gespeichert wurden...

    ich kann kein C, will damit aber auch mal anfangen, soll ich mich mal dran versuchen...? - Sollte ja mit so einer "Case"-Abfrage gehen... Fehler kannst Du ja dann evtl. ausbügeln, sollten nur Syntax-Probleme sein...

    weil das wäre dann insg. schon ein interessantes Teil, auch ne echte Alternative zum "EiWoMiSa", insb. wenn man direkt am Gerät bedienen will, bei dem sind die Tasten ja eigentlich grad für nix dran, und Hue, Saturation und Value jeweils direkt per Poti hinzudrehen finde ich persönlich schon "intuitiver" und einfacher, als dieses "Farbkreis-Anschuggen" mit 2 Tasten...

    Und deutlich billiger sollte es auch noch kommen...
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!
    Also wenn Du C lernen willst und das mit dem DMX gleich versuchst, das wär Spitze! :thumbsup:

    Ich hab mich wie gesagt kaum damit beschäftigt. Man muss da ja auch ein paar mehr Kanäle definieren als nur die Farben, wenn ich das richtig in Erinnerung habe. Ich wollte eigentlich die Start-Adresse speichern (Eingabe per FB) und dann n Kanäle in Folge benutzen. Ist das sinnvoll? Dann kan man natürlich auch mal suchen, ob es nicht schon eine Bibliothek in C gibt, die sinnvoll für die Anwendung ist.

    2 Timer sind ja schon für die Hardware-PWM weg. Reicht der dritte dann für die ISR aus oder nimmt man einen anderen Interrupt?

    Ach ja, als Dank gibt es auf jeden Fall ein Platine vom Controller.

    Bzgl. EiWoMiSa: ich denke, auch wenn beides 4-Kanal-Controller sind, so haben beide doch ihre Berechtigung. Benny hat da schon ein ausgefeiltes Konzept inkl. Display usw. aufgesetzt. Aber mein Ansatz ging eben eher in Richtung Poti/FB.
    Auf das Angebot komm' ich dann ggfs. zurück, wenn mein Beitrag hilfreich war... ;)

    Timer brauchst Du da keinen, das ist eben ein extra Interrupt, der aufgerufen wird, wenn der USART ein Byte empfangen hat...

    Das mit der Start-Adresse und dann x Kanäle (Geschmackssache, wie viele man nimmt) in Folge macht Sinn, ich wüsste jetzt nicht, wieso jemand z.B. Rot auf 57, Grün auf 88, Blau auf 107 und Weiß auf 389 senden sollte..? :D

    Nach ner fertigen Routine suchen macht *für mich* keinen Sinn, das Prinzip ist ja simpel, in asm oder Bascom könnte ich es direkt hinschreiben, nur für C muss ich eben erst mal schauen und das wäre dann gleich die erste Übung... ;)

    klar, das mit dem Eiwo...., aber bei Dir ist ja auch optional ein Display vorgesehen, und das kann man ja alles noch erweitern (Farbverlaufs-Programme etc.) ... wie gesagt, Geschmackssache, mich persönlich würde halt das mit den Potis statt Tasten mehr ansprechen

    Übrigens bei Dir der selbe "Kritikpunkt" wie beim Eiwo...: hättest Du noch optional Plätze für 4 Transistoren und Hochlast-Widerstände vorgesehen, hätte man bei Bedarf auch noch die ("instructables"-)-KSQ gleich mit drauf auf dem Teil... ;)
    It's only light - but we like it!

    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

    Pesi schrieb:

    Übrigens bei Dir der selbe "Kritikpunkt" wie beim Eiwo...: hättest Du noch optional Plätze für 4 Transistoren und Hochlast-Widerstände vorgesehen, hätte man bei Bedarf auch noch die ("instructables"-)-KSQ gleich mit drauf auf dem Teil... ;)
    Ich hatte überlegt, noch die Pegelwandlung vorzusehen. Aber dann hätte es nochmal ein paar Wochen gebraucht. Und abgesehen davon soll es ja mal eine Version 2 geben ... Mal sehen, was mir da noch einfällt :rolleyes: Erst mal soll sich die Software weiter entwickeln.
    Hier mal der DMX Code, den ich auf meinem Atmega 32 verwendet:

    PHP-Quellcode

    1. #ifndef F_CPU
    2. #define F_CPU 16000000
    3. #endif
    4. #define DMX_FREQ(FREQ) ((FREQ) / (250000 * 16) - 1)
    5. static volatile uint8_t dmx_array[512]; /* Kann auch in SIGNAL(SIG_UART_RECV) */
    6. void
    7. dmx_init(void)
    8. {
    9. UBRRL = DMX_FREQ(F_CPU) & 0xFF;
    10. UBRRH = DMX_FREQ(F_CPU) >> 8;
    11. UCSRC = _BV(URSEL) | (3 << UCSZ0);
    12. UDR = 0;
    13. UCSRA = 0;
    14. UCSRB = _BV(RXCIE) | _BV(RXEN);
    15. }
    16. SIGNAL(SIG_UART_RECV)
    17. {
    18. static uint16_t dmx_channel, dmx_start = 1;
    19. uint8_t dmx_status, dmx_data;
    20. int16_t dmx_index;
    21. dmx_status = UCSRA;
    22. dmx_data = UDR;
    23. if(dmx_status & _BV(FE))
    24. {
    25. if(!dmx_data)
    26. dmx_channel = 0;
    27. else
    28. dmx_channel++;
    29. }
    30. else
    31. {
    32. dmx_index = dmx_channel - dmx_start;
    33. if(dmx_index >= 0 && dmx_index < 512)
    34. dmx_array[dmx_index] = dmx_data;
    35. dmx_channel++;
    36. if(dmx_index == 511)
    37. {
    38. /* Hier werden die Werte verarbeitet */
    39. touchscreen_gotoxy(0,30);
    40. touchscreen_printf("%3d %3d %3d %3d %3d", dmx_array[0], dmx_array[1], dmx_array[2], dmx_array[3], dmx_array[511]);
    41. }
    42. }
    43. }


    Dürfte eigentlich alles selbsterklärend sein (bzw im Datenblatt nachzulesen). Ehrlich gesagt weiß ich garnicht mehr, ob der Großteil des Codes auf meinem Mist gewachsen ist oder ob er auf Code von jemand anderem basiert.

    Vielleicht hilft der Code euch ja =)

    Edit:

    Seltsam ... in den normalen Code Tags werden die Einrückungen des Codes gelöscht O_o
    Der Programmcode entwickelt sich weiter. Wir haben jetzt den Stand, dass sowohl Potis zur Einstellung anschließbar sind als auch ein Taster, um die 4 Programme umzuschalten. Im 2. Thread ist der Quellcode und die complilierte Datei ladbar. Es ist jetzt für einen Mega168 compiliert, kann aber auch noch im Mega88 laufen. Der Taster muss unbedingt über einen Kondensator entprellt werden.

    Als nächstes stehen dann das Display und DMX auf dem Programm. Wäre schön, wenn es ein paar Tester für die Version gibt...
    hi,

    versuche das erst mal auf der universeller Controller mit ATmega8 - Platine aufzubauen, da bei ihr ja noch PIN 5 (für PWM) und PIN 14 (für Taster) frei sind.
    Ich würde auch lieber die alte Reihenfolge der PWM-Kanäle beibehalten :
    rot: LEDr OCR1A PIN 15
    grün: LEDg OCR1B PIN 16
    blau: LEDb OCR2A PIN 17

    und neu:
    weiss: LEDw OCR2B PIN 5

    Bin mir aber unsicher, ob das geht.
    Den HW-Umbau würde ich dann vornehmen, wenn das SW-mässig geht
    Als Controller werde ich den ATmega168 verwenden.


    Gruss mausi_mick
    Wenn ich es richtig verstanden habe, willst Du den Quellcode nutzen, um auf dem RGB-Controller die Software zu testen. Das sollte prinzipiell erst mal möglich sein, wenn auch der Pin für den zusätzlichen PWM-Kanal noch frei ist.

    Die Zuordnung von Ausgangspin zu Farbe ist ja nur an einer Stelle im Quellcode und kann geändert werden. Die Folgen sind dabei, dass z.B. die Poti-Zuordnung nicht mehr stimmt (auch die Tasten auf der Fernbedienung) und dass der Farbkreis im HSB-Modus nicht mehr von rot nach rot läuft. Aber ansonsten sind mir keine weiteren Nachteile bekannt. Ich hatte anfangs sogar die OCR1-Pins vertauscht und hab das erst später korrigiert.
    hi turi,

    hab aber den Eindruck, das irgendwas mit dem RC5 nicht geht.


    im rc5.c:

    beim ATmega8 : MCUCR = (MCUCR | (1 << ISC11)) & ~ (1 << ISC10);
    beim ATmega168 : MCUCR = (MCUCR | (1 << IVSEL)) & ~ (1 << IVCE); ??

    ich glaube, das Programm kriegt die Daten von der FB nicht mit.

    Vielleicht liegt es aber auch an was anderem.

    Gruss mausi_mick