Project: OnePixelDisplay | |
---|---|
Naam | OnePixelDisplay |
Door | SA007, BugBlue, Eightdot |
Status | Afgerond |
Madskillz | LEDstrips, wires, glas-in-lood |
Doel / Omschrijving | |
Het glas-in-lood raam boven de deur omgetoverd tot OnePixelDisplay | |
Alle Projecten - Project Toevoegen |
What is it
Aan de binnenkant tegen het kozijn van het raam zijn 16 RGB-ledstrips bevestigd, deze zitten met een draad richting het serverhok.
Deze zitten met een print op basis van een attiny45 met v-usb via USB aangesloten op kleintje2. Hierop draait wat lelijke scripts waardoor op basis van de spacestate de ledstrips bediend worden.
Electronics
De 16 ledstrips zijn common-anode strips met superflux leds, 9 per kleur per strip. Komen origineel als misproductie van niels van samenkopen.
De strips zijn niet overal 100% (meer), maar dat is in het resultaat niet-/nauwelijks zichtbaar.
Dit zit met een stuk 4-polig draad richting het serverhok. De controller daar is een zelfbouwcontroller op basis van v-usb. Een echt schema is er niet, in principe is de pinout van de attiny45:
- NC/Reset
- Blue via mosfet
- USB D-
- Ground
- Green via mosfet
- Blue via mosfet
- USB D+
- VCC
Voor de usb het een standaard schema met 3 weerstanden en 2 3.6V zeners, zie v-usb website: http://www.obdev.at/products/vusb/index.html
Software
µC Software
Download: http://hack42.sa007.nl/avr-usb-rgb.tar.gz
Software op kleintje
Deamon die spacestate in de gaten houdt en op basis daarvan dingen doet:
start.sh
#!/bin/bash screen -d -m -S "OnePixel" /usr/bin/php runled.php
runled.php
<?php // sort-of-deamon to cycle trough som fun colors, will quit if 'stop' file found. function spacestate() { global $spacestate,$lastcheck; $now=time(); if($lastcheck+120>$now) return $spacestate; $lastcheck=$now; $fp = stream_socket_client("tcp://igel2:667", $errno, $errstr, 30); if (!$fp) { $spacestate=FALSE; return FALSE; } $state=fgets($fp, 1024); fclose($fp); if($state=="open\n") {$spacestate=TRUE; return TRUE; } $spacestate=FALSE;return FALSE; } function setcolor($r,$g,$b) { setled($r*5,$g*5,$b*5); if(!spacestate()) { setled(0,0,0); while(!spacestate()) sleep(60); } } function setled($r,$g,$b) { global $setled; if(!$setled) { $setled=popen("./set-led RGB-STREAM","w"); } //connection error, g/b switched in the actual display if(!fwrite($setled,chr(2).chr($r).chr($b).chr($g).chr(4))) { $setled=NULL; } return TRUE; } // some global variables $spacestate=FALSE; $lastcheck=0; $setled=NULL; $sequence = array( array(51,0,0), array(51,51,0), array(0,51,0), array(0,51,51), array(0,0,51), array(51,0,51)); $currentcolor = array(0,0,0); while (true) { foreach($sequence as $color) { while ($color != $currentcolor) { for ($x = 0; $x<3; $x++) { if ($color[$x] > $currentcolor[$x]) { $currentcolor[$x]++; } else if ($color[$x] < $currentcolor[$x]) { $currentcolor[$x]--; } } setcolor($currentcolor[0],$currentcolor[1],$currentcolor[2]); usleep(250000); } } } ?>
Video naar onepixeldisplay
ffmpeg -i ~/Videos/video.avi -s 1x1 -f rawvideo -vcodec rawvideo -r 15 -pix_fmt rgb24 ~/Desktop/onepixel.avi
daarna *iets* met doorsturen naar display. :-)
Todo
- Foto's maken...
- Attiny45 code veranderen zodat fade in de controller kan, dit om de load op kleintje fors te verlagen.
- Alle stukken code samenvoegen om het grote hoeveelheid forken omlaag te brengen.
Dat samen zou ervoor moeten zorgen dat het kan werken met vloeiender overgangen tussen kleuren zonder kleintje op zijn knieen te drukken.