Ik ben bezig geweest met een moodlight project. Een deel van de voortgang heb ik al in Het RGB (mood)light topic - deel 2 gepost. Aangezien er niet veel zelfbouw DMX op GoT te vinden is zet ik alles in dit topic, in de hoop dat iemand er iets aan heeft.
Het doel was om met ledstrips sfeerverlichting te maken in mijn woonkamer. De ledstrips moesten afzonderlijk aan te sturen zijn. Voor dit project heb ik een USB-DMX interface gemaakt, enkele DMX ontvangers met Atmel μC en ben ik alvast begonnen aan een stand-alone DMX zender.
In deze post staat ergens een link naar een bestand met alle project bestanden.
Er zijn meerdere manieren om verlichting in een woonkamer aan te sturen. In het verleden heb ik wel eens met DMX apparatuur gewerkt, en dat is een van de redenen waarom ik voor DMX heb gekozen. Het is misschien een beetje overkill voor in de woonkamer, maar van een beetje overkill is nog nooit iemand doodgegaan

Over de naam van het project: Als ik een naam aan een project moet geven dan is Scrap het eerste waar ik aan denk. (het stamt af van m'n oude netwerk server die de naam had, en eer aan deed)
DMX
In het kort is DMX het protocol wat gebruikt wordt om professionele verlichting aan te sturen bij concerten, theaters, disco's etc.
Het DMX512-A protocol beschrijft de manier van data overdracht over een RS-485 netwerk.
De data wordt serieel verzonden over twee signaallijnen. Voor deze signaallijnen (A,B) wordt een twisted pair gebruikt met differentiële spanning (als A positief is dan is B negatief, en andersom). Het voordeel hierbij is dat er ten opzichte van bv rs232 veel langere kabels gebruikt kunnen worden.
Een DMX netwerk (universe) bestaat uit één zender en één of meerdere ontvangers. volgens rs485 kunnen er maximaal 32 ontvangers aangesloten worden, maar er kunnen repeaters gebruikt worden om dit uit te breiden.
Bij het maken van de standaard is er rekening mee gehouden dat sommige ontvangers data terug sturen, maar dat wordt eigenlijk niet gebruikt. Vandaar dat de standaard 5 polige stekker voorschrijft, en dat er vaak 3 polige stekkers gebruikt worden.
Een DMX zender verstuurt continu pakketten met 512 databytes (adressen). Ontvangers worden niet afzonderlijk door de zender geadresseerd, dus twee ontvangers kunnen naar hetzelfde adres luisteren.
Een verzonden pakket bestaat uit:
- Een break. Een laag signaal (minimaal 88 μS) om aan te geven dat een nieuw frame begint.
- Een Startbyte. Deze moet aangeven voor welke soort apparatuur het is, maar dit wordt eigenlijk niet gebruikt. Voor dimmers geldt startbyte = 0
- 512 Databytes, waarbij byte(n), waarbij n het adres is.
De data wordt serieel verstuurd met 1 startbit, 8 databits en 2 stopbits op 250 Kbaud.
Een pakket duurt dus ongeveer 22 ms, wat neerkomt op een verversingssnelheid van 44Hz.
Er wordt niet aan error detectie gedaan, en daarom mag je nooit gevaarlijke dingen als pyrotechnische apparatuur aansturen met DMX (maar voor in de woonkamer is dat sowieso al niet verstandig

Een DMX ontvanger is een apparaat dat de via DMX verzonden data ontvangt, en op één of meerdere kanalen reageert bv parcans en movingheads. In het algemeen heeft een ontvanger een startadres (het eerste kanaal waar hij naar luistert) en een bepaald aantal opeenvolgende kanalen.
De ontvangers die ik gemaakt heb doen het volgende (ik neem aan dat andere ontvangers dat ook doen):
- Wachten op een break
- De startbyte controleren
- Meetellen met de ontvangen bytes, tot Byte(n) waarbij n het startadres is.
- Vanaf Byte(n) de waardes van een aantal kanalen opslaan.
- Wachten op een nieuwe break. (sommige DMX zenders sturen niet alle 512 waardes mee, maar kleinere pakketen)
Wat het apparaat in de tussentijd met de data doet kan verschillen. Voorbeelden voor kanalen zijn: kleur, pan/tilt, intensiteit, etc.
Meer info staat hier:
[HOWTO] DMX-512 met een Picmicro
http://www.renebiemans.nl/page.php?al=dmx
Handig diagram voor timing: http://www.DMX512-online.com/gifs/dmxpack.gif
Ik ben niet de eerste met een DMX project voor μC's, maar dit topic gaat over wat ik allemaal zelf gemaakt heb.Ik weet niet hoeveel mijn project lijkt op die van anderen. Het aansluiten van een rs485 converter op een usart is redelijk standaard, dus daar zal weinig verschil in zitten.
DMX interface.
In het begin van mijn project had ik een kip en het ei probleem. Ik kon wel een ontvanger maken, maar die kon ik dan niet testen omdat ik geen signaal kon zenden. Ik kon ook een zender maken, maar dan had ik weer niets om te testen of het signaal wel goed was. Daarom heb ik toen besloten om een bestaande open source DMX interface na te maken.
De basis voor mijn DMX interface is de open source Enttec open DMX usb interface. Het bestaande ontwerp heb ik een beetje aangepast. Voornamelijk om er een usb kitje van voti in te kunnen gebruiken, en om ontvangers van een voedingsspanning te voorzien.
Er zijn nog andere open source ontwerpen (bv uDMX), maar ik weet eigenlijk niet meer waarom ik deze heb gekozen.
klikbaar
De usb kit heb ik gekocht zodat ik makkelijk kon beginnen op een breadboard:
En later, nadat ik maar eens was begonnen met het zelf etsen van printplaten, heb ik eerst een versie gemaakt met een header aansluiting. Laatst heb ik het ontwerp aangepast voor een model met een normale USB aansluiting.
-Het rechter weerstandje heb ik in het ontwerp weer verplaatst zodat de IC voet niet meer ingezaagd hoeft te worden.
-De extra pinnen op de interface zijn te gebruiken voor stroomvoorziening in een test opstelling, maar ik denk niet dat het verstandig is om ze te gebruiken in een permanente opstelling met veel ledstrips.
Dit is een interface en dus geen DMX zender. Het genereren van een DMX signaal moet bij deze interface door een pc gedaan worden. De interface gebruik ik in combinatie met de gratis DMX control software Freestyler.
DMX ontvanger
Nadat ik de interface gemaakt had, kon ik beginnen met het maken van een ontvanger. M'n eerste opzet voor een ontvanger was op basis van een attiny2313 met softwarematige pwm. Dit laatste was omdat ik nog niet wist hoeveel kanalen ik aan wilde sturen met één ontvanger. M'n DMX ontvanger code werkt zo dat de DMX adres waardes worden ontvangen en verwerkt in een interrupt, zodat de 'main loop' vrij blijft voor andere dingen. Hierdoor is mijn DMX interrupt makkelijk te gebruiken voor andere toepassingen dan ledjes dimmen.
Dit was m'n eerste setup:
klikbaar
Op het breadboard zitten twee afzonderlijke DMX ontvangers. Links zie je een attiny2313 met rotary encoder en aansluiting voor hd47780 display om de kanaal waardes uit te lezen, en rechts zie je een attiny2313 met 6 dmx->pwm kanalen en twee dmx->servo kanalen. (geschakeld via een uln2803A)
Dit is een kort Filmpje van één van mijn eerste tests, waaruit al een beetje blijkt hoe makkelijk het is om iets aan te sturen met DMX als je de ontvanger code eenmaal hebt.
Daarna ben ik begonnen met solderen.
Vanaf het begin af aan was ik van plan om deze of deze ledstrips aan te sturen. De bedoeling was om de ontvangers direct te koppelen aan de ledstrips, en daarom moesten ze zo smal mogelijk worden om ze netjes weg te kunnen werken.
Dit is ongeveer het schema voor het mijn eerste losse ontvanger.
klikbaar
Het schema is eigenlijk erg simpel. Een max485 (of sn75176) IC ontvangt het DMX (rs485) signaal, en zet het signaal om naar ttl. Omdat mijn DMX ontvanger geen data terug stuurt is er alleen een Rx lijntje nodig naar de attiny2313 μC, en kan de max485 op ontvangen gezet worden door pinnen 2 en 3 aan de gnd te hangen. De Attiny leest de binnengekomen data uit in een interrupt, en pwm't continu 3 kanalen. Deze ontvanger gebruikt softwarematige PWM, en daardoor kan de ontvanger met wat aanpassingen meer kanalen aansturen dan de 4 hardware PWM kanalen van de μC. De 'common-anode' ledstrips worden geschakeld via een ULN2003.
Dit was het resultaat van mijn eerste soldeer actie:
De ontvanger heeft een 5x2 header om dmx(a), dmx(b), gnd, +5V en +12V aan te sluiten en door te lussen.
Onder de IC voet zit een 20Mhz kristal verstopt. Door de draadjes aan andere pinnen van de μC te hangen, kan met dit ontwerp ook hardware pwm gebruikt worden.
(ik heb tussendoor ook nog zelf ledstrips met geïntegreerde ontvanger gemaakt, maar die laat ik even buiten beschouwing)
Deze ontvanger heb ik gemaakt voor bij m'n fluxledstrips. Die strips hebben een andere pinout (+12,R,B,G) dan de 'SMD ledstrips' (+12,R,G,B) die ik latergebruikt heb. Maar dat is op te lossen door of de draadjes op de print, of de firmware, of de instellingen op de PC aan te passen
In mijn queeste naar de voor mij kleinst mogelijke print heb ik toen de ULN2003 vervangen voor losse fetjes. Omdat ik toch maar één ledstrip aan ging sturen per ontvanger heb ik 2n7002 smd fetjes gebruikt.
Deze ontvanger heeft ook nog software PWM, maar ik heb ondertussen het schema voor de enkelzijdige pcb aangepast voor hardware pwm. In de project bestanden zitten twee ontwerpen, één met een losse 5V lijn, en één met een 78l05 op de pcb.
Daarna heb ik maar de overstap naar SMD gemaakt. En om dat voor elkaar te krijgen heb ik een ontwerp gemaakt voor een dubbelzijdige print.
Dit is het schema dat ik uiteindelijk voor m'n ontvangers gebruikt heb:
klikbaar
De ontvangers ets ik per 6. Er passen denk ik met een beetje proppen 24 ontvangers tegelijk op een euro print, maar als dat mislukt door bv een foutje bij het uitlijnen kan de hele print weg.
Dit is een foto van het eerste paneeltje dat ik gemaakt heb, maar hier zit nog een ontwerpfout in. Met wat creatief solderen en frezen valt deze nog te gebruiken, maar ik ets liever nieuwe printjes.
Na wat testen, proberen en connectors vervangen zien mijn controllers er nu zo uit:
3,8 x 1,8 cm (zonder connectors).
Om de μC te programmeren gebruik ik dit adaptertje dat ik gemaakt heb van een oud RAM slot.
De ontvanger gebruikt nu een hardcoded DMX startadres, dus is het ontwerp nog niet erg handig voor toepassingen waar het adres vaak veranderd moet worden.
Om de ledstrips op te hangen heb ik de afdekking van een kabelgoot in stukjes gezaagd, en zo de ledstrips er op gezet:
Zo heb ik er tien gemaakt, en aan m'n plafond gehangen. Ik heb de standaard connectors van de ledstrips af gesoldeerd (scheelt ook wat schaduw), en een haakse header aan de onderkant gezet.
Het resultaat
Het was me wel eens opgevallen, maar mijn muur is niet egaal. Als de ledstrips aan staan zijn er schaduwen van oneffenheden te zien. Ik had de kabelgoot eerst dicht tegen de muur aan vastgezet, maar om het schaduw effect iets te verminderen heb ik de kabelgoot zo ver mogelijk van de muur af vastgezet (op de plafondlijst) Hierdoor valt de normale schaduw van de ledstrips wat meer op als ze uit staan, maar hinderlijk is het niet.
Mijn fototoestel heeft een beetje moeite met de hoeveelheid licht, waardoor ik de gevoeligheid terug moest schroeven om rare vlekken op de foto's te voorkomen. Hieronder staan de gebruikelijke RGB foto's, maar de lichtopbrengst is in het echt wat beter dan op de foto's.
De muur is iets langer dan 4 meter
Dit had ik ook kunnen doen door de ledstrips gewoon door te lussen aan één controller, maar het leuke van het hele DMX verhaal is dat ik nu ook dit soort dingen kan doen:
DMX is ontwikkeld voor het aansturen van licht effecten, dus om te zien wat er mogelijk is met wat simpele scènes in Freestyler moet je dit filmpje even bekijken:
Voor het filmpje heb ik de snelheid van de effecten aangepast, normaal staat alles wat rustiger te faden

(bv een RGB gradiënt zoals in de foto hierboven laten scrollen, 1 stap per minuut)
Ik ben na het ophangen en het testen van het schema nog een (redelijk groot) probleem tegen gekomen.
Om de ontvangers aan elkaar te koppelen had ik een oude netwerkkabel opgedeeld, en er c-grid connectors tussen gezet. (1x 2 pins signaal en 2x 3 pins power). Één ledstrip zou maximaal 240 mA nodig hebben, maar bij mij nam de maximale stroom per ledstrip af als ik extra ontvanger en ledstrips aansloot.
Zie dit grafiekje:
De blauwe reeks is wat ik ongeveer had moeten halen, de rode reeks heb ik gemeten in de opstelling, en gecorrigeerd voor het verbruik van de ontvangers met 0% dutycycle.
Als ik 9 strips op 100% dutycycle had, was het verbruik nog maar ongeveer 60% van de stroom die nodig zou moeten zijn.
Ik ging er van uit dat het aan de netwerk kabel lag, dus die heb ik vervangen door 2x 1,5mm2 installatiedraad (zie eerdere opmerking mbt overkill) en die op bepaalde plaatsen een stukje gestript en er aftakkingen aan gesoldeerd (Ik heb eerst een soort snijklem koppelingen geprobeerd, maar die paste niet goed in de de kabelgoot

Met de nieuwe stroomvoorziening lijkt het probleem verholpen, en nu kan ik eventueel de draad verlengen voor extra ledstrips.
Nu zit het zo vast:
Het groenige blokje is een stukje hout waarvan ik de randen heb ingefreesd, zodat de kabel in de goot geklemd wordt
Project bestanden
HIER staat een zipfile met alle projectbestanden die ik bij elkaar gezet heb. Het gaat vooral om de software, maar ik heb de rest er ook bij gezet.
(EDIT: Zie hier voor de nieuwe firmware Anthor in "Project: ScrapDMX")
Dit zit er in, ik hoop dat iemand er wat aan heeft:
- Bijgewerkte Schema's voor verschillende ScrapDMX ontvangers
- Kicad project voor de verschillende receivers met pcb layouts
- ScrapDMX_hpwm_v1.0 .hex en AVR studio projecten
- ScrapDMX_spwm v1.0 .hex en AVR studio projecten
- Schema voor Enttec open DMX - USB interface, en mijn aangepaste versie daarvan
- Freestyler fixture bestanden
Kicad
De projecten heb ik gemaakt met Kicad (20080825c-final) Dat is een open source ontwerp programma. Als je de projecten goed wil openen dan moet je eerst de inhoud van de map 'Share' op de juiste plek in je Kicad map zetten
Software
Ik heb de software voor de controllers geprogrammeerd in assembly met avr studio 4.15-(623).
De code is voorzien van comments, en ik hoop dat dat genoeg is om de werking ervan te verklaren.
Ik heb de code van de ontvangers geschreven voor attiny2313 μC's, maar met wat aanpassingen zou het ook kunnen werken op een andere AVR. (met een hardware USART)
Het DMX signaal wordt uitgelezen in een interrupt. De 3 kanalen waar de ontvanger op reageert worden opgeslagen in het SRAM. In de 'main_loop' worden de waardes naar de OCRx regsisters geschreven.
Standaard zijn de registers: OC1A: Rood, OC0A: Groen, OC0B: Blauw, maar dat kan aangepast worden. OCR1B is ook nog beschikbaar voor PWM, maar ik heb voor de huidige pin-out gekozen omdat dat beter uit kwam voor de layout van de dubbelzijdige print.
Dit gebeurt er als er een ontvanger aangezet wordt:
- Als een ontvanger opstart, dan wordt er +/- 2 seconden een test signaal naar de ledstrip gestuurd (groen met een beetje rood en blauw) om de leds te testen
- Als het startadres 0 of groter dan 512 is dan knippert de ledstrip rood. (als het startadress 511 of 512 is wordt alles boven 512 genegeerd door het aantal adressen aan te passen)
- De strips staan bij een kanaal waarde '0' niet helemaal uit. Er is altijd een beetje licht te zien.
- Als het DMX signaal ongeveer een kwart seconde uitvalt dan wordt de output geel tot er weer een signaal gedetecteerd wordt. (kleur kan in de software aangepast worden)
Het startadres van een ontvanger is hardcoded, maar het is makkelijk aan te passen.
Als je de μC programmeert vanuit avr studio:
- open het project
- scroll naar benenden
- verander daar de aangegegeven waardes
- compileer en upload naar de μC
ponyprog:
- open het .hex bestand
- ga naar 'Edit' en zet vink 'write buffer enabled' aan
- scroll naar het einde
- verander de waarde van adressen 0x07DF en 0x07EF in het nieuwe startadres (0x07EF is bit 9 van het startadres)
De te veranderen adressen zijn de laatste in de regel van de tweede kolom
(let op dat je niet in de tekst kolom edit, omdat bv. het karakter "1" een andere waarde (31) heeft dan het getal 1
- upload naar de μC
Na het uploaden heeft de μC misschien nog een 'harde reset' nodig
De softwarematige pwm heb ik nog een update gegeven nadat ik klaar was met de hardware-pwm. De firmware werkt wel, maar ik heb het niet uitvoerig getest,
Hardware
De ontwerpen zitten in de zipfile, Ik gebruik zelf alleen de dubbelzijdige printjes.
Een nadeel is dat een ISP connectie of op de print gesoldeerd moet worden (heb ik niet geprobeerd), of dat er programmeer adapter gemaakt moet worden van een oud ram-slot oid (ik weet niet meer welk type, de afstand tussen de printbanen is 0,05" )
De bijgewerkte versie van de enkelzijdige prints heb ik aangepast, geëtst en even getest.
Voor condensator C5 heb ik geen waarde ingevuld. Ik heb hem toegevoegd als buffer, ik weet niet wat een goede capaciteit zou zijn. Voor de dubbelzijdige print heb ik 1 μF gebruikt, maar dat was alleen omdat dat de hoogste capaciteit was die ik in 0805 had liggen.
Er zitten geen ISP aansluitingen bij de enkelzijdige prints, maar is de attiny is te programmeren door een el-cheapo model ic-voet op deze manier over de uC te schuiven.
De aansluitingen voor signaal en voedingsspanning zijn bij alle prints anders, dus als je ze wil gebruiken moet je daar goed op letten.
ToDo
Ik ben nog niet klaar met het project, er zijn nog een paar dingen die ik wil doen:
• Ontvanger
-De hardware kan weer aangepast worden, ik gebruik nu maar 4 pinnen voor power & signaal.
Het liefst heb ik een systeem dat makkelijk modulair aan te sluiten is. Het systeem is ook nog niet beveiligd tegen aansluit fouten e.d., daar moet ik ook nog wat voor verzinnen.
- Ik wil nog een 'intensiteit' kanaal in de software toevoegen, waardoor een kleur beter gedimd kan worden.
- Misschien kan ik de code nog aanpassen zodat het makkelijker als 'include' gebruikt kan worden (ik weet alleen niet wat de beste manier is om dat te doen)
• Ondertussen ben ik ook nog een beetje bezig geweest met het maken van een een DMX zender op basis van een atmel μC. Ik heb een Atmega88 μC gebruikt om de zender te maken. Deze μC heeft genoeg SRAM om alle 512 kanalen bij te houden. De zender gebruikt de 'UDR Empty' en 'Timer0 output compare' interrupts om het DMX signaal te genereren. De code voor de zender zit nog niet in de zipfile, omdat ik overstap op een andere μC als ik er mee verder ga. (omdat ik dan een extra usart wil voor bv
een afstandsbediening.)
• Alles hangt nu aan mijn pc- of labvoeding (op een manier waar ik liever geen foto's van maak

Ik heb de interface als in een behuizing gestopt en daar is nog ruimte voor mooie aansluitingen, maar daar moet ik nog iets moois van maken.
Als ik een losse zender maak dan lijkt een losse voeding mij beter.
• Ik heb ook een basis systeem gemaakt voor een servocontroller (12 bit resolutie). Ik ben er niet helemaal tevreden over omdat het bij kleine stapjes een beetje schokkerig gaat, en omdat de aansturing specifiek voor mijn servo's is. maar de basis is er. Ik heb er geen serieuze plannen mee, dus ik weet niet of ik er nog wat aan ga doen.
Disclaimer
Ik heb geen electrotechnische achtergrond dus ik kan NIET garanderen dat het werkt en/of veilig is.
Ik noem dit een DMX project omdat het werkt op de open DMX-usb interface, maar ik heb niet kunnen controleren of het werkt op andere dmx apparaten. (als iemand dat wel heeft kan ik misschien wel een printje opsturen) Ik ga binnekort even proberen of ik zo'n uDMX interface kan maken, dan kan ik daarmee ook even testen.