Uit Hack42
Ga naar: navigatie, zoeken
Project: OnePixelDisplay
Schroefje24.png
Schroefje24.png
Schroefje24.png
Schroefje24.png
OnePixelDisplay Picture.jpg

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
File:OnePixelDisplay_Picture.jpg noez


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:

  1. NC/Reset
  2. Blue via mosfet
  3. USB D-
  4. Ground
  5. Green via mosfet
  6. Blue via mosfet
  7. USB D+
  8. 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.