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.
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.
Partlist:
- Arduino Diecimila, UNO, or some else
- Breadboard or stripboard
- LED, 16 pcs.
- Resistor, 220 Ohm, 1 pcs.
- Some wires
Stückliste:
- Arduino Diecimila, UNO, einen anderen
- Steckprett oder Lochrasterplatine
- LED, 16 Stk.
- Widerstand, 220 Ohm, 1 Stk.
- Ein paar Kabel
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.
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.
Schematic:
Schaltplan:
Code:
Also the code is realy simple and hopefully well comentaded. The mean steps are the followings:
- Every element of the Array columns represent a single column. Every of the 16 bits of the element represent one of the 16 LEDs.
- Counting the elements of the array columns and store it in columnCount.
- The first column will be set corresponding to the first element of the array.
- There is a short delay from length columnTime. If it was too fast, you or your lense wouldn’t notice the column.
- All other elements of the array will be set one by one.
- 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.
Quelltext:
Auch der Quelltext ist sehr einfach gehalten und hoffentlich ausreichend kommentiert.
Die wesentlichen Abläufe sind folgende:
- Jedes Element des Arrays columns repräsentiert eine Zeile. Jedes der 16 Bits innerhalb des Elementes eine der 16 LEDs.
- Die Anzahl der Elemente in dem Array columns wird gezählt und in der Variablen columnCount gespeichert.
- Die erste Zeile wird gemäß des ersten Elementes des Arrays gesetzt.
- 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.
- Es folgt die Abarbeitung der restlichen Zeilen.
- Ist das komplette Array durchgelaufen, werden alle LEDs aus geschaltet. Es folgt eine Pause von columnTime * spacer bevor das Array erneut abgespielt wird.
/*******************************************
*
* 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
}
License:
Lizenz:

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.
Download:
Arduino Sketch: lightPrint_0-1-0.zip (246 kB)
Example:
Beispiel:
Tags: Arduino, code, diy, documentation, download, druck, gimp, led, licht, light, malen, nacht, night, painting, print, project, projekt, quelltext, sketch, zeichnen



Hallo Sebastian
Sieht interessant aus. Die Elektronik habe ich verstanden, aber wie wird aus den einzelnen Spalten ein ganzer Schriftzug? Muss man dafür die Kamera drehen, oder die LEDs verschieben?
Hallo,
genau. Du mußt entweder die Kamera oder die LEDs bewegen. Unter dem Schlagwort POV findet man dazu einiges.
Gruß
Sebastian
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 !
Bitte sehr, freut mich wenn es so gut klappt
Ich hab auch noch ein paar von denen rumliegen die ich mal in Betrieb nehmen möchte…
Geil!
Bau ich gleich morgen mal nach.
.
P.S.: Die IR-Remote Library ist auch richtig nice
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
Moin Jasper,
das ist die binäre Schreibweise von 25353. Die Grafiken erstelle ich mit einem ganz simplen Grafikprogramm. Achte darauf, dass bei der Schrift kein Antialiasing angewendet wird.
Gruß
Sebastian
Ok danke:D
ja das mit dem Binärsystem war mir auch schon in denn Sinn gekommen, aber es ging bei mir nicht auf.
Aber jetzt geht alles.
Nochmal vielen Dank für die Super Anleitung
Jesper
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,
ich werd nachher mal nach dem Code sehen…
Bis später
Sebastian
Hallo Sebastian
Ich wollte nochmal nachfragen, ob du den Code gefunden hast oder mir einen Tipp geben kannst mit welchem Processing Befehl ich da weiter komme. Gerne auch per mail!?
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
Hi,
coole Anleitung. Danke dafür.
Ich habe noch eine Frage: Was für LEDs soll man da nehmen? Weiß 3V? Ich kenne mich leider nicht so mit Elektronik aus.
Grüße
Flo
Hi Flo,
Du kannst nehmen was Du möchtest. Ich habe weiße 3mm LEDs benutzt, natürlich ist aber auch jede andere Farbe denkbar. Wie Dir beliebt. Dann aber den Vorwiderstand anpassen.
Gruß
Sebastian