Light Print, a Arduino POV

[topcolumn]light printed Arduino Logo[/topcolumn]
[leftcolumn]

Project Discription:

Since I’ve started my photography carrier I’m fascinated of long exposing times and the creative possibilities. With the digital photography it becomes very easy, you can see directly the results. But for me it’s still not easy the produce a long sentence or big drawings. Often I need the help of GIMP.
One of my first little projects were a row of 5 LEDs, which gave me the possibility to write a whole sentence. After some experience in the Arduino platform I can easily control 16 LEDs with only some lines of code. Here I would like to share my code with you. Below you will find the wireing, code and a download file with everything you need.[/leftcolumn] [rightcolumn]

Projektbeschreibung:

Seit meiner ersten Kamera war ich von Langzeitbelichtungen und deren kreativen Möglichkeiten fasziniert. Die Lichtmalerei wird mit der digitalen Fotografie deutlich vereinfacht. Die Ergebnisse sind praktisch sofort sichtbar. Allerdings ist es für mich nicht leicht, ganze Texte oder komplexe Zeichnungen in angemessener Zeit auf die Speicherkarte zu bekommen. Oft muß GIMP nachhelfen.
Eines meiner ersten kleineren Projekte mit dem Arduino war die Realisierung von kleinen Texten mittels fünf LEDs in einer Reihe. Nach einiger Erfahrung im Umgang mit der Arduino Plattform ist es mir nun möglich einen effizienten Quelltext für 16 LEDs zu schreiben und möchte diesen gern zur Verfügung stellen.
Die Verkabelung und der Quelltext sind folgend zu finden. Der Download ganz unten enthällt die Arduino Sketch, Verkabelung und Beispielbilder.[/rightcolumn] [topcolumn] [/topcolumn]
[leftcolumn]

Partlist:

  1. Arduino Diecimila, UNO, or some else
  2. Breadboard or stripboard
  3. LED, 16 pcs.
  4. Resistor, 220 Ohm, 1 pcs.
  5. Some wires

[/leftcolumn] [rightcolumn]

Stückliste:

  1. Arduino Diecimila, UNO, einen anderen
  2. Steckprett oder Lochrasterplatine
  3. LED, 16 Stk.
  4. Widerstand, 220 Ohm, 1 Stk.
  5. Ein paar Kabel

[/rightcolumn] [topcolumn] [/topcolumn]
[leftcolumn]

Wireing:

Wireing is nothing complicated. Every single anode get one I/O pin from 0-13, and the two analog pins 0 and 1. The cathodes are together at one single current limiter resistor and than to GND.[/leftcolumn] [rightcolumn]

Verkabelung:

Die Verkabelung stellt keine Herausforderung dar. Die Anode jeder LED wird an die digitalen Ports 0 – 13, sowie die analogen Pins 0 und 1 angeschlossen. Die Kathoden sind zusammengefaßt und mit einem Strombegrenzendem Widerstand an GND angeschlossen.[/rightcolumn] [topcolumn]Wiring of Arduino lightPrint[/topcolumn]
[leftcolumn]

Schematic:

[/leftcolumn] [rightcolumn]

Schaltplan:

[/rightcolumn] [topcolumn]schematic of Arduino multi camera ir controler library[/topcolumn] [leftcolumn]

Code:

Also the code is realy simple and hopefully well comentaded. The mean steps are the followings:

  1. Every element of the Array columns represent a single column. Every of the 16 bits of the element represent one of the 16 LEDs.
  2. Counting the elements of the array columns and store it in columnCount.
  3. The first column will be set corresponding to the first element of the array.
  4. There is a short delay from length columnTime. If it was too fast, you or your lense wouldn’t notice the column.
  5. All other elements of the array will be set one by one.
  6. After every element has already been set, every LED will switch off and there will be a delay to separate the end of the array to the beginning of the next loop.

[/leftcolumn] [rightcolumn]

Quelltext:

Auch der Quelltext ist sehr einfach gehalten und hoffentlich ausreichend kommentiert.
Die wesentlichen Abläufe sind folgende:

  1. Jedes Element des Arrays columns repräsentiert eine Zeile. Jedes der 16 Bits innerhalb des Elementes eine der 16 LEDs.
  2. Die Anzahl der Elemente in dem Array columns wird gezählt und in der Variablen columnCount gespeichert.
  3. Die erste Zeile wird gemäß des ersten Elementes des Arrays gesetzt.
  4. Es folgt eine Pause der Länge columnTime. Ist diese Zeit zu kurz, sind die einzelnen Zeilen praktisch nicht sichbar, weil sie zu schnell abgearbeitet werden.
  5. Es folgt die Abarbeitung der restlichen Zeilen.
  6. Ist das komplette Array durchgelaufen, werden alle LEDs aus geschaltet. Es folgt eine Pause von columnTime * spacer bevor das Array erneut abgespielt wird.

[/rightcolumn] [topcolumn]

/*******************************************
 *
 * Name.......:  lightPrint
 * Description:  A small and fast scetch to draw words and grafics in to the night. Just with 16 LEDs. For more Information, required hardware, wireing and examples please check the project page.
 * Author.....:  Sebastian Setz
 * Version....:  0.1.0
 * Date.......:  2010-11-25
 * Project....:  http://sebastian.setz.name/arduino/my-projekts/light-print
 * Contact....:  http://Sebastian.Setz.name
 * License....:  This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
 *               To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to
 *               Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
 *
 ********************************************/

const int columnTime = 15; // Time[ms] of every single column is switched on
const int spacer = 10; // This value multiplied the columnTime to get a spacer between the content of the whole array

int columns[] = {
  7230,25353,16702,34944,35007,34949,16698,25344,15935,25377,16670,34944,40127,34976,16703,25344,7231,128,1983,140,63,1920,286,1953,30}; // Array of colums. Add characters, words, symbols, ...
int columnCount = sizeof(columns) / sizeof(columns[0]); //Counting columns

void setup(){
  // Define digital pin 0 to 16 as OUTPUT, switch it on, wait, switch it off
  for (int i=0;i<16;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,HIGH);
    delay(columnTime);
    digitalWrite(i,LOW);
  }
}

void loop(){
  // Read from every part of the array a single column
  for (int column=0;column<columnCount;column++){
    // Read every bit and set a row
    for (int row=0;row<16;row++){
      digitalWrite(row,bitRead(columns[column],row));
    }
    delay(columnTime); // Wait, so your eye or a lense can realise the column
  }
  // Set every row LOW
  for (int row=0;row<16;row++){
    digitalWrite(row,LOW);
  }
  delay(spacer*columnTime); //after finishing the whole array wait some time
}

[/topcolumn] [leftcolumn]

License:

[/leftcolumn] [rightcolumn]

Lizenz:

Creative Commons Lizenzvertrag
lightPrint von Sebastian Setz steht unter einer Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported Lizenz.
Über diese Lizenz hinausgehende Erlaubnisse können Sie unter http://Sebastian.Setz.name erhalten.
[/rightcolumn] [topcolumn]

Download:

Arduino Sketch: lightPrint_0-1-0.zip (246 kB)
[/topcolumn] [leftcolumn]

Example:

[/leftcolumn] [rightcolumn]

Beispiel:

[/rightcolumn] [topcolumn]Demo of arduino lightPrinter

Tags: , , , , , , , , , , , , , , , , , , ,

[/topcolumn]

18 Kommentare

  1. danke danke danke
    echt ein tolles teil macht echt spaß damit rum zu spielen.
    bin grade erst auf das arduino gestosen aber deine zwei projekte sind echt toll
    bin nur noch nicht durschgestiegen wie ich den camera sketch auf den attyni bekomme.
    nochmal danke tecnik so einfach !

  2. Hay,
    vllt bin ich einfach zu blöd um zu erkennen wie Aus 0000110001100001 beispielsweise 25353 wird, aber vielleicht könntest du es mir ja noch erläutern. Und wie erstellt ihr die 16 pixel hohen Textbilder für das Script?

    Danke im Voraus

    Jesper

  3. Hallo Sebastian

    Super einfach scheint das ja zu sein. Ich hatte schon immer mal so was gesehen, doch ich glaube ich habe jetzt sogar den Code halbwegs verstanden. Vielen Dank für die Veröffentlichung.

    Eine Frage stellt sich mir aber noch. Wie erstellst du denn die einzelnen Buchstaben. Ich habe das doch richtig verstanden, dass die columns die Buchstaben darstellen!? Wie komme ich von meinem Text zu diesen Zahlen?
    Kannst du das noch erklären?

    Danke

    Kristina

    • Hi Kristina,

      Du meinst vermutlich dieWerte im Array colums[], richtig? Dafür habe ich mir ein kleines Programm in Processing geschrieben. Die Grundlage ist eine Grafik von einer Höhe von 16 Pixeln und einer Breite von X. Nun schaut sich Processing jede Spalte an und schreibt entsprechend der Pixelfarbe jedes der 16 Bits eines integer 1 oder 0. So kommt man von der Grafik zu den integer Werten. Aus 0000110001100001 wird beispielsweise 25353.

      Gruß

      Sebastian

      • Hallo Sebastian

        Ja, genau diese Werte meinte ich.
        Bis zu deiner Antwort war mir Processing unbekannt. Scheint es wert zu sein sich damit zu beschäftigen.

        Zuerst gingen meine Überlegung dahin ging auf Papier und Rechenkästchen (16 Kästchen hoch, x Kästchen breit) etwas zu schreiben und dann die Reihen selbst aus zu zählen und in Zahlen umzuwandeln. Recht umständlich wie mir schnell klar wurde.
        Ich habe mir also einen Schriftzug mit einer Textverarbeitung erstellt, daraus eine Bilddatei gemacht, zurecht geschnitten und dieses auf 16 Pixel Höhe reduziert. Doch jetzt weiß ich nicht weiter.

        Kannst du mir einen Tipp geben, wie ich diese Grafik nun in Processing einbinde und mit welchem Befehl ich dann die Reihen auslesen kann? Wie fange ich an?

        Gruß

        Kristina

            • Hi Kristina,

              sehr spät nun der versprochene Processing Code. Ich hoffe Du steigst durch, denn ich habe nichts kommentiert…

              int dicke = 5;
              PImage grafik;
              color col;
              float colum;
              int laenge;
              String[] inhalt;
              
              void setup() 
              {
              grafik = loadImage("grafik.png");
              laenge = grafik.width;
              //inhalt = new String[laenge];
              inhalt = new String[1];
                size(1500,100);
                noLoop();
                //noStroke();
                stroke(211);
              }
              
              void draw() 
              {
                background(255);
                image(grafik,0,0);
                for(int ii=0;ii<laenge;ii++) {
                  colum = 0;
                  for(int i=0;i<16;i++) {
                    col = get(ii,i);
                    if (red(col)+green(col)+blue(col)!=3*255) {
                      fill(222);
                      ellipse(dicke+ii*dicke,16+dicke+i*dicke,dicke,dicke);
                      colum = colum + pow(2,i);
                    }
                    else {
                      fill(250);
                      ellipse(dicke+ii*dicke,16+dicke+i*dicke,dicke,dicke);
                    }
                  }
                  fill(111);
                  //text(round(colum),0,30+ii*10);
                  inhalt[0]+=str(round(colum))+",";
                }
                saveStrings("daten.txt", inhalt);
              }
              
              

              Es wird eine s/w Grafik geladen, analysiert und dann eine Textdatei abgespeichert aus der dann der String heraus in die Arduino Sketch kopiert werden kann.

              Gruß

              Sebastian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.