DIY-RGB-Controller mit IR-Fernbedienung und DMX - modular erweiterbar

  • Zitat

    Naja, diese Vermutung gab es doch schon mal im Dezember ...

    Jup, wollte das nur bestätigen.

    Zitat

    Vielleicht könntest Du die Schaltung + Firmware für die Eigenbau-Fernbedienung auch hier vorstellen?

    Ich war unkreativ und habe einfach ein anderes Projekt aus dem Internet nachgebaut. Das interessante ist, mit wie wenig externen Teilen man dort auskommt. Das ganze ist in C geschrieben und braucht entsprechend auch 460Byte auf dem Attiny2313, aber nagut, man hat's ja.

  • So, ich habe jetzt mal den Nachmittag damit verbracht zu probieren, eine Version mit LCD, allen Programmen, aber ohne DMX und DIP zusammenzustellen. Natürlich sind die 2048Byte dabei eine sehr interessante Herausforderung. Hier einige Ideen und Fragen dazu:
    In der Dimmerkorrektur-Funktion. Ich weiß nicht, wie die Werte ausgewählt wurden, aber die sind verdammt nah an x²/4 dran. Könnte man dann icht auch kürzer diesen Code verwenden:


    Zu der Baumarkt Funktion brauche ich glaube nicht viel zu sagen... Wiederholungen pur. Ich habe da im Moment etwas extrem unhübsches zusammengehackt, aber hey 80Byte.(Habe aber noch eine bessere Idee, deshalb hier noch kein Code).
    In der Keyselect-Funktion kann man die Zahlen-Keys auch durch eine viel kürzere Schleife erfassen.
    Ich baue im Moment auf der TinyControlStandard2313-Version auf, wofür ist die Status-LED da?


    MfG Empirelord

  • Natürlich sind die 2048Byte dabei eine sehr interessante Herausforderung.

    Aber dieser Nervenkitzel ist nur für absolute Minimalisten notwendig, da es fast zum gleichen Preis den Tiny 4313 gibt. ;)


    wofür ist die Status-LED da?

    Einerseits als Betriebsanzeige, wenn Controller und Lichtelement räumlich getrennt betrieben werden.
    Andererseits blinkt die Status-LED (gemeinsam mit dem Grün-Kanal), wenn die Speichertaste betätigt wurde, also das Vorzugsprogramm und seine Parameter abgespeichert werden.

  • In der Dimmerkorrektur-Funktion. Ich weiß nicht, wie die Werte ausgewählt wurden, aber die sind verdammt nah an x²/4 dran.

    Ja, so wurden die letztlich auch berechnet, dann noch bisschen "geschoben"... ;)


    Könnte man dann icht auch kürzer diesen Code verwenden:

    Ja, das würde gehen (*, Du hast halt nen etwas anderen Bereich, weil 1 x 1 >> 2 ist dann 0, nicht 1 - im Prinzip auch kein Problem, ich hatte das halt so gemacht, dass man mit dem Dimmer nicht ganz runter kommt, damit's keine Verwirrung gibt, ist das Teil nun ausgeschaltet oder nur ganz runter gedimmt...


    *) da ist übrigens noch ein Fehler, es muss natürlich "ror" heissen für rechts rotieren, rol ist links rotieren... ;o)


    bei 31 ergibt sich dann 240, also nicht die volle Helligkeit von 255...


    man könnte nun einfach zu temp1 erst mal 1 dazu addieren (Eingabe 1-32 statt 0-31), dann geht der korrigierte Wert mit 1 los statt mit 0 - bei 32 dann aber das Problem, 32x32 = 1.024, >>2 macht 256, also LB Null,also LEDs aus statt maximaler Helligkeit...


    um diese ganzen Probleme zu umgehen, habe ich eben die Tabelle gemacht, auch wenn das natürlich deutlich mehr Platz braucht - aber wie Lötmeister schon sagte, da gibt's auch den 4313, oder man kann auch nen ganz anderen AVR nehmen mit noch mehr Speicher...


    das mit dem 2313 war wie gesagt hauptsächlich sportlicher Ehrgeiz, das alles da rein zu bringen, muss ja aber auch nicht - da ist man dann eben beschränkt, das Ganze hier ist eher so als Art "Framework" zu verstehen, man hat gewisse Komponenten vorgefertigt, und kann sich daraus was zambasteln, was aber natürlich nicht zwingend in nen 2313 passen muss...


    Zu der Baumarkt Funktion brauche ich glaube nicht viel zu sagen... Wiederholungen pur.

    Klar! - so ist das Programm halt, Rainbowfader wie bekannt und oft gewünscht...


    Ich habe da im Moment etwas extrem unhübsches zusammengehackt, aber hey 80Byte.(Habe aber noch eine bessere Idee, deshalb hier noch kein Code).

    Bin shcon neugierig - Bitte dann hier rein stellen, das ist ja ein Mitmach-Thread, wo jeder gerne seine Umbau-Ergebnisse posten soll - kann ich dann auch gerne im Startpost verlinken...


    In der Keyselect-Funktion kann man die Zahlen-Keys auch durch eine viel kürzere Schleife erfassen.

    Ja, ginge sogar noch kürzer: Bei den allermeisten (zumindest die ich kenne) Fernbedienungen ergeben die Tasten 0-9 dann auch Code 0-9...


    man müsste also hier (die 7 Programme) nur prüfen, ist der Wert in temp2 zwischen 0 und 6, falls ja, wird er in temp0 geschoben und weiter zu _key_command_store, ansonsten Ende Auswertung.


    das habe ich hier deswegen nicht gemacht, weil so die Struktur besser erfassbar ist (v.a. für Anfänger), also es wird stur der Reihe nach das empfangene Kommando mit div. Codes verglichen - so (Schieberei) oder mit Schleife wäre es für Anfänger evtl. verwirrend, wieso kommen nun einmal Vergleiche, und dann plötzlich ne Schleife...


    aber klar, wenn's wirklich auf das letzte Byte ankommt, kann man das auch noch ändern - da ist bestimmt an 2, 3 weiteren Stellen auch noch Spar-Potenzial drin... ;)

    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!

  • Stimmt, diese Macken hat die neue Dimmerkorrektur-Funktion dann leider, naja, werde mir das heute Nachmittag nochmal angucken. Im Moment habe ich aber auch noch genug Speicher um die Tabelle drin zu haben.


    Zu der Baumarktfunktion: Die grundsätzliche Idee hierbei war, dass man die Operation die auf die daten ausgeführt wird nicht mehr 3-mal drinhatt und per Bedingung auswählt, welche man ausführt, sondern durch ein bisschen Pointer-Arithmetik die Adresse abhängig vom aktuellen Fade gesetzt wird und man dann die Datenoperation entsprechend nur noch 1-mal drinhatt. Ich bin mir aber leider nicht sicher, ob das ganze so noch funktioniert. Außerdem habe ich (um noch ein paar Bytes rauszupressen) die rjmp/br** _Baumarkt_Ende Konstrukte durch entsprechende direkte Sprungbefehle nach _RGB_Output ersetzt, aber das ist ja eine Kleinigkeit. Weil der Beitrag wundeschön lang werden würde, wenn ich das einfach so reinposte, habe ich es in den Anhang getan.


    Bezüglich _Key_Select: Das habe ich ganz übersehen, dass man das ja auch explizit setzen kann. Danke, nochmal 10Byte weniger.


    Edit: Eine andere Stelle, wo ich nochmal ein paar Byte herausholen konnte war bei _pgm_select, und zwar indem ich eine Sprungtabelle verwendet habe. Wie bei meinem restlichen Code gilt auch hier: Ich weiß nicht, ob es funktioniert, aber hier ist der code (zero ist das nicht benutzte R27-DMX register, im ganzen Programm auf 0 gesetzt, sparrt ein paar Byte):

  • Zu der Baumarktfunktion: Die grundsätzliche Idee hierbei war, dass man die Operation die auf die daten ausgeführt wird (...)

    Das muss ich mir mal in Ruhe ansehen, ist mir gerade zu viel zum nachvollziehen...


    Bezüglich _Key_Select: Das habe ich ganz übersehen, dass man das ja auch explizit setzen kann. Danke, nochmal 10Byte weniger.

    Ja, aber wie gesagt nur, wenn die Codes für die Ziffern-Tasten passen - deswegen hatte ich das nicht so gemacht, weil man die dann nicht mehr in der Settings.inc anpassen kann, z.B. wenn die FB da andere Codes sendet oder man das auf anderen Tasten haben will...


    Eine andere Stelle, wo ich nochmal ein paar Byte herausholen konnte war bei _pgm_select, und zwar indem ich eine Sprungtabelle verwendet habe. Wie bei meinem restlichen Code gilt auch hier: Ich weiß nicht, ob es funktioniert

    Da gilt: Ausprobieren! ;) - ein Fehler ist drin, "brlo _main" springt ja zu main, wenn der Wert unter 6 ist, es soll ja aber gesprungen werden, wenn's größer ist - das wäre brsh (same or higher) und dann mit 7 vergleichen - übrigens macht man das normal so, dass man da nicht direkt ne Zahl in den Code schreibt, sondern Du definierst das weiter oben z.B. als ".equ MAX_PROGRAMS = 6 ; Höchste Programm-Nummer", weil dann weiß man, was diese Zahl bedeutet, und Du brauchst das nur an dieser zentralen Stelle ändern, wenn Programme dazu kommen (bei der Tasten-Abfrage benutzt Du diesen Wert ja noch mal).


    Ansonsten ist so ne Sprungtabelle ganz üblich - ich hatte das wiederum deswegen nicht so gemacht, damit's für die Anfänger "einheitlich" ist, weil's ja dieses Programm 255 gibt, da wäre dann auch wieder erst mal ein Vergleich, dann Sprungtabelle...


    den Trick mit Adresse auf den Stack legen und dann per ret springen kannst Du Dir übrigens auch sparen, dafür gibt's den Befehl ijmp (indirekt jump), der springt zu der Adresse im Z-Register, also statt den 3 Zeilen push push ret einfach nur ijmp...


    zero ist das nicht benutzte R27-DMX register, im ganzen Programm auf 0 gesetzt, sparrt ein paar Byte

    ja, das hatte ich früher auch oft gemacht, also ein Register *immer* auf 0, spart öfter mal ein clr, einfach überall wo man Null braucht, dann dieses Register benutzen - da kann man auch eines der unteren 16 nehmen, da muss man ja nicht sowas wie cpi etc. benutzen.


    Wichtig: das Register am Anfang explizit löschen mit clr zero - nach dem einschalten ist da ein zufälliger Wert drin, da hatte ich mir auch schon mal in's Knie geschossen, weil ich das vergessen hatte und dann überall einfach irgendwas addiert wurde, wo eigentlich 0 benutzt werden sollte... ;)

    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!

  • hallo zusammen :)


    zu allererst, ein prost auf die entwickler :) feines teil - ich bin gerade am erstellen des 2ten gerätes und
    möchte heute mal meinen fertigen controller vorstellen. ( standartversion)
    das alugehäuse ist zwar sehr hübsch, war mir aber ( mit versand ) dann doch etwas teuer...
    also hab ich dieses hier verwendet :
    http://www.conrad.de/ce/de/pro…x-H-124-x-72-x-30-mm-Blau
    dieses gibt es auch noch in schwarz und in farblos, für unter 3€
    wer also bisl aufs geld achten muss/will :) eine gute alternative, zumal die led auch wunderbar hindurchleuchtet und das ganze auch ir-durchlässig ist.
    also auch hier kein bohren von löchern nötig.


    was mich sehr interessieren würde:
    anfangs war mal die rede von einer tiny45 version die dann noch kleiner werden würde ( ohne display und dmx )
    in wieweit ist dieses projekt realisiert worden? gibt es da schon eine software und einen schaltplan?
    das wäre eine feine sache, zumal ich von den 45ern noch eine hand voll rumliegen habe :)


    liebe grüsse

  • Hi, freut mich ja zu sehen, dass es noch mehr Leute gibt, die das Nutzen. (sehr schöne Arbeit übrigens)
    Der Hauptentwickler hier ist ja Pesi, ich bin ja nur dabei die Software anzupassen. Insofern weiß ich nicht, was er in der Richtung 45 gemacht hat.
    Aufgrund des "schrecklicken" Versionsmanagements der Software bin ich gerade dabei, dass unter anderem mit .ifdef umzuschreiben und könnte somit eine 45-Version morgen/übermorgen fertig haben.
    (Mehr dazu, wenn ich soweit bin Bugs zu suchen)


    Edit: Ich habe jetzt doch einfach schnell aus der TinyControl-Version eine 45-Version zusammengehackt. (Leider musste die Status LED dran glauben)
    Ich habe keinen 45 hier um das ganze zu testen, aber prinzipiell sollte es mit Rot(PB0), Grün(PB1) und Blau(PB2), sowie einem 16MHz-Quarz an PB3-PB4 und rc-empfänger an PB5 klappen.
    Netter Nebeneffekt: Die Software ist wieder so klein, dass sie auch in den Attiny25 passen sollte. (Source + hex sind im Anhang)


    Edit2: Der DMX-Kanal ist logischerweise rausgefallen, so dass auf Programm 0 nun Gewitter liegt und es nur noch 6 Programm sind.


    MfG Empirelord


  • Edit: Ich habe jetzt doch einfach schnell aus der TinyControl-Version eine 45-Version zusammengehackt. (Leider musste die Status LED dran glauben)


    Die status led kann ruhig geopfert werden, sie existiert ja in der 2313 version:-)


    Klasse, das geht ja voran :)
    Ich muss morgen mal schauen, ob ich noch einen 16 mhz quarz in der bastelkiste finde um das ganze mal auf dem steckbrett aufzubauen, es sei denn es ist jemand schneller ... :)
    Ich liebe diesen controller, er ist schnell aufgebaut und arbeitet zuverlässig, werde ihn als steuerung für einen infinity mirror verwenden.
    Bei der 45er version kommt es mir dann wirklich auf "tiny" an. Mal sehen wie klein man das sinnvoller weise bauen kann :)


    Danke dir und allen die weiter daran mitwirken! :led:

  • wenn "wirklich tiny", dann den Tiny45 in SMD, und Quarz weg lassen, die RC5-Routine läuft auch mit dem internen 8-MHz-Oszi (die Takte in der Empfangsroutine dazu anpassen!)... ist dann zwar nur noch 122 Hz PWM-Frequenz, aber das reicht i.A. auch... dann wäre sogar wieder ein Pin frei, wenn man z.B. die Status-LED doch drauf haben will... ;)


    oder, falls man das z.B. in ein Deko-Objekt einbauen will, könnte man statt dessen auch nen Taster dran machen, z.B. bei Dauer-Druck wird rauf- und runter gedimmt, bei kurzem Druck die Programme durchgewechselt...


    Aufgrund des "schrecklicken" Versionsmanagements der Software

    Ja, da weiß ich immer noch nicht, wie ich sowas "richtig" machen soll - jede Version (mit/ohne Display, mit/ohne DMX, DIP, Tastern, etc., versch. µC-Typen, RC5 oder NEC, usw.) in nem eigenen Ordner, oder alles in ein "Riesenprojekt", bei dem man dann mit .ifdef die "Module" "an- und abschaltet"...


    P.S.: Sorry, ich weiß, da fehlen noch paar Sachen, ich komm' i.M. aber leider zu gar nix, hatte die letzten 4 Wochen keinen einzigen freien Tag...

    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!

  • Ich bin nochmal in das Datenblatt des Tiny45 gegangen, und wie es scheint, hat der auch eine interne 16MHz-Taktquelle. Damit wäre der Quarz obsolet und das ganze sollte mit nur minimalen Änderungen laufen.
    (Ich werde das morgen dann kurz machen)


    Pesi:
    Ich würde definitiv sagen, dass es ein geringerer Aufwand ist, sich seine eigene Version zusammenzubasteln, wenn man nur Werte setzten muss und alles dann per .ifdef läuft, allerdings wird der Code dadurch natürlich auch lang und ugly.
    Ich habe im Moment einiges an Zeit und auch Lust AVR zu lernen, wenn du also die Zeit finden solltest deine neuesten Versionen mit den features hochzuladen würde ich da durchgehen und das zu einem Projekt verbacken.


    MfG Empirelord

  • @ pesi
    natürlich gern auch smd ! :) obwohl die dil-version auch schon beträchtlich kleiner werden würde :)
    und wenn die rc5 routine mit dem internen takt auch klar kommt - fliegt auch der quarz noch raus
    die status - led würde ich gegen den taster "eintauschen" :) zumal beim abspeichern von eigenen einstellungen die angeschlossenen rgb-leds ja ebenfalls 3x aufleuchten
    da wäre der taster zum dimmen ggf fast besser


    @ Empirelord
    dann leg dich mal ins zeug :)
    der ruhm ist dir sicher :)

  • da wäre der taster zum dimmen ggf fast besser

    Ja - nur vorsichtshalber zum Verständnis: Das ist aber nicht so, dass Du nur irgendwo nen Taster anschließt, und dann funktioniert das, das musst Du erst programmieren... ;)


    ich würde da in der Hauptschleife ganz oben noch ne Routine einfügen zum Taster abfragen - ist der Taster kurz gedrückt, wird die Programm-Nummer rauf gezählt (also das Programm gewechselt), ist er lang (dauerhaft) gedrückt, dann dimmt er rauf und runter - also kurzer Druck Programm wechseln, lang drauf bleiben ändert sich die Helligkeit, bei der gewünschten wieder los lassen...


    die Unterscheidung würde ich so machen: Du zählst ne Variable hoch, sobald der Taster gedrückt ist - natürlich nicht bei jedem Aufruf, sonst geht das viel zu schnell (hierzu in der Timer-ISR regelmäßig ein Flag setzen).


    erreicht die Variable einen bestimmten Wert, dann wurde die Taste lang gehalten, dann nicht weiter zählen, sondern Helligkeit ändern - so lange man also auf der Taste bleibt, ändert sich die Helligkeit.


    ist die Taste nicht gedrückt, wird der Zähler geprüft - ist er kleiner als dieser Wert, dann wurde die Taste nur kurz gedrückt, dann Programm wechseln. Hier kann man zusätzlich abfragen, wie lange (Zählerstand) die Taste gedrückt wurde, und sie so auch gleich entprellen, ist der Wert zu klein, dann war's kein Tastendruck, sondern nur prellen - wieder ein Bauteil gespart (der Kondi zum HW-entprellen).


    also z.B.:


    Zähler < 5 = kein Druck (Taste prellt nur)
    Zähler 5 - 15 = kurzer Druck
    Zähler == 16 = Taste gehalten


    und beim loslassen dann natürlich wieder den Zähler auf 0 setzen...

    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...
    Die Version, die ich hier als Tiny45 schon hochgeladen habe, sollte, wenn man die Flags richtig setzt, auch ohne Kristall funktionieren, wenn sie überhaupt funktioniert.
    Ich habe jetzt die letzten Stunden damit verbracht zu probieren Pesi's Idee von einem Taster zu implementieren. Ich werden jetzt erstmal was essen und dann testen, also stay tuned.
    Das ganze hält mich natürlich effektiv von der "Restrukturierung" ab, ab dafür kann ich dann gleich die neuen Sachen einbringen.


    Edit: wurde von bioshock infinite aufgehalten, updates morgen.


    Edit2: Ich kann hier ja wunderbar viel Code schreiben, aber das hilft nicht viel, wenn mein Entwicklerboard streickt.
    Kurzversion: Es läuft nicht so gut/schnell wie geplant, aber es ist ja auch kein Projekt, welches besonders dringend wäre, oder?


    MfG Empirelord

  • Habe nochmal ins Datenblatt geschaut, und in der aktuellen Version sollte es auf dem Tiny45 nicht laufen, weil der Timer keine 16, sondern nur 8 Bit hat. Es gibt aber natürlich einen einfachen Workaround: Ein Register zum Zählen abstellen und nur jeden 2^8=256 Takt die Routine wirklich durchlaufen. Wird dann auch noch implementiert...


    Edit: Wie es scheint, habe ich den code noch nicht verinnerlicht. In der Ursprungsversion läuft das ganze ja auch im 8Bit Timer... Ich werde jetzt erstmal probieren, meine Testumgebung zum Laufen zu kriegen, das lohnt sich ja sonst nicht.


    MfG Empirelord

  • testumgebung, da bist du schon mal besser als ich , hab nur ein steckbrett :)
    ich kann allerdings auch nicht programmieren :( *leider* mir fehlt schlicht und ergreifend die zeit welche man als blutiger anfänger brächte ..
    aber .asm dateien editieren und compilieren kann ich schon :):):) na immerhin

  • Öh, ja. ich werde demnächst mal Bilder posten, aber mehr als ein Steckbrett und ein gutes Multimeter habe ich hier auch nicht.
    Mein Problem ist im Moment eher, dass ich höllisch viele Wackelkontackte habe, was zu ätzender Frickelei führt.
    Ich habe zwar mal ein wenig c programmiert(~1000 Zeilen), aber bei µC ist mir das auch ein Buch mit 7 Siegeln. Also halte ich mich an den Assemblercode und betreibe Learning by Doing.
    Allerdings mache ich zur Zeit mein Abi und habe somit tonnenweise Zeit(von der nächsten Woche mal abgesehen).


    Pesi:
    Zwischen der RC5+... und TinyControl Version gibt es eine Änderung in der Wait.inc Datei, und zwar wird temp0 statt 50 nun 10 zugewiesen. Das sollte ja eigentlich die Zeit ändern, die die Funktion braucht. (Welches ist nun richtig?)