Hallöchen liebe Forenbesucher und Nutzer!
Mir ist zum Jahreswechsel eine spontane Idee gekommen.
Nach einem kurzem Einkauf im Elektroladen fürn paar markfuffzich
und einer kleinen löt- bastel- programmier- und fotosession ist folgendes bei rumgekommen:
Allet jute füret neue, wa?!:thumbs1:
(ist nicht der beste shot, aber ich fand den Fotografen iwie witzig und passend. )
Erstmal zu den verwendeten Materialien/Komponenten:
14x LED Low current 5mm rot (TLLR 5400 VIS)
1m Flachbandkabel 26 Adern
1x Pfostenverbinder
1x Plastikstab
1x Mobile Stromversorgung
1x Joypad (PS2 Nachbau)
Gesamtkosten ca. 10€ (ausgenommen Stromversorgung und Joypad)
Ursprünglich hatte ich geplant den Stick mit einem Drucktaster zu steuern, aber da die Tante von der Elektronik-Apotheke scheinbar nicht zählen kann, habe ich 14 Pulldown-Widerstände für einen Taster und einen Widerstand für die 14 LED's in der Tüte gehabt. Hab dann kurz ausprobiert, ob die LED auch ohne Vorwiderstand betrieben werden kann und darauf verzichtet. Die Steuerung über eine Taste erschien mir für ein kurzes Programm auch erstmal zu aufwändig, also habe ich auf mein Joypad zurückgegriffen. So ließen sich auch einfacher mehrere Texte abspielen und ich konnte mir Lötarbeit sparen.
Pfostenverbinder auf das Kabel aufgesetzt und am andere Ende das Kabel aufgespleißt. Überflüssige Kabel wurden einfach abgeschnitten.
Einen Plastikstab hat sich in einer Bastelkiste gefunden. Den habe ich mit einer heißen Nadel durchlöchert und die LED's eingesteckt.
Die Kathoden (kurzes Bein) habe ich dann auf der Rückseite des Stabes zusammengelötet und mit der Masse verbunden.
Das Iso-Band aus Muttis Werkzeugkiste hatte die besten Tage schon hinter sich und hat nur noch geschmiert. Also hab ich auf das allbewährte Tesa zur Isolation zurückgegriffen.
Die Anode der einzelnen LED's wurden mit dem Kabel verlötet und ebenfalls mit Tesa isoliert.
Welche Pins ich benutzt habe, kann man aus dem Python-Programm ablesen. Im Programm habe ich die GPIO Nummerierung gewählt, eine Übersetzung auf die Pins müsst Ihr in einer entsprechenden GPIO Belegungstabelle nachschauen. Falls andere Pins benutzt werden, kann man das entsprechend im Programm abändern.
Das ganze schaut dann folgendermaßen aus:
(sry für die miese Qualli, aber man kann immerhin erkennen wie das ganze aussieht)
" />
Das war schon die ganze Hardware.
Nun zur Software:
import os,pygame, RPi.GPIO as GPIO, time
GPIO.setmode(GPIO.BCM); GPIO.setwarnings(False)
gpio_led = [0,7,8,11,25,9,10,24,23,22,27,18,17,15,14] #hier die verwendeten GPIO Ports einsetzen. die null bleibt, da ich gerne bei eins anfange zu zählen.
a = 0
pygame.init()
j = pygame.joystick.Joystick(0)
j.init()
while a < 14:
a += 1
GPIO.setup(gpio_led[a], GPIO.OUT); GPIO.output(gpio_led[a],0)
a = 0
###################
#
# hier zeichensatz einfügen. ist zur besseren übersicht im nächstem code
#
###################
stext = [" ",
"frohes neues jahr",
"text zwei",
"text drei",
"text vier",
#.....
"text elf"]
#
# mein zeichensatz beschränkt sich auf kleinbuchstaben. weitere zeichen müssten entsprechend in der ausgabe ergänzt werden
###################
def abfrage():
taste = 0
for a in range(0, j.get_numbuttons()):
time.sleep(.5)
pygame.event.pump()
if j.get_button(a) is 1:
while j.get_button(a) is 1: #warten bis taste losgelassen wird, um keine endlosschleife zu provozieren
pygame.event.pump()
taste = j.get_button(a)
taste = a + 1
break
return taste
def ausgabe(text):
print(text)
text += " #"; z = 0
while text[z] <> "#":
x = ord(text[z]) - 97
if (x < 0) + (x > 25) is 1: x = 26 #sollte sich der buchstabe außerhalb von den 26 buchstaben befinden, wird das leerzeichen verwendet.
print("Buchstabe : " + text[z] + " Nummer : " + str(x)) #dient nur der überprüfung. kann natürlich im headless-betrieb ausgelassen werden.
a = 0
while abc[x][a] <> 9:
b = 0
while b < 14:
GPIO.output(gpio_led[b+1],int(abc[x][a])); b += 1
a += 1; time.sleep(.05) #hier lässt sich die geschwindigkeit regulieren.
z += 1
return
###################
while 1:
a = abfrage()
if a is 12: break # bei taste 12 wird das programm abgebrochen und der pi runtergefahren
if 2 > a > 0: ausgabe(stext[a]) # statt "2" die anzahl verwendeter texte +1 einsetzen
GPIO.cleanup()
os.system("sudo shutdown -h now")
Alles anzeigen
Das Programm ist nicht perfekt, aber für meine Zwecke hat es vorerst gereicht. Die Zahlen habe ich hier erstmal ausgelassen.
Wer sich die Mühe sparen will und keinen Zeichensatz selber erstellen möchte kann gerne folgenden Code in das Programm kopieren:
(Mir ist erst beim "G" aufgefallen, das ich spiegelverkehrt geschrieben habe. Das umzuändern schien mir aber überflüssig. Wollte ja fertig werden )
abc = [["00000000000000",
"00000011111111",
"00001111111111",
"00111101100000",
"01110001100000",
"11000001100000",
"01110001100000",
"00111101100000",
"00001111111111",
"00000011111111",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"11000011000011",
"11000011000011",
"11000011000011",
"01100111100110",
"00111100111100",
"00011000011000",
"00000000000000",9],
["00000000000000",
"00011111111000",
"00111111111100",
"01100000000110",
"11000000000011",
"11000000000011",
"11000000000011",
"01100000000110",
"00100000000100",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"11000000000011",
"11000000000011",
"11000000000011",
"01100000000110",
"00111111111100",
"00011111111000",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"11000011000011",
"11000011000011",
"11000011000011",
"11000000000011",
"11000000000011",
"11000000000011",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"11000011000000",
"11000011000000",
"11000011000000",
"11000000000000",
"11000000000000",
"11000000000000",
"00000000000000",9],
["00000000000000",
"00011111111000",
"00111111111100",
"01100000000110",
"11000000000011",
"11000000000011",
"11000001100011",
"01100001100110",
"00110001111100",
"00010001111000",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"00000011000000",
"00000011000000",
"00000011000000",
"00000011000000",
"11111111111111",
"11111111111111",
"00000000000000",9],
["00000000000000",
"11000000000011",
"11111111111111",
"11111111111111",
"11000000000011",
"00000000000000",9],
["00000000000000",
"00000000001000",
"00000000001100",
"00000000000110",
"00000000000011",
"00000000000011",
"00000000000011",
"11000000000110",
"11111111111100",
"11111111111000",
"11000000000000",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"00000011000000",
"00000111100000",
"00001100110000",
"00011000011000",
"11110000001111",
"11100000000111",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"00000000000011",
"00000000000011",
"00000000000011",
"00000000000011",
"00000000000011",
"00000000000011",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"01100000000000",
"00110000000000",
"00011000000000",
"00001100000000",
"00011000000000",
"00110000000000",
"01100000000000",
"11111111111111",
"11111111111111",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"00111100000000",
"00001111000000",
"00000011110000",
"00000000111100",
"11111111111111",
"11111111111111",
"00000000000000",9],
["00000000000000",
"00011111111000",
"00111111111100",
"01100000000110",
"11000000000011",
"11000000000011",
"11000000000011",
"01100000000110",
"00111111111100",
"00011111111000",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"11000011000000",
"11000011000000",
"11000011000000",
"01100110000000",
"00111100000000",
"00011000000000",
"00000000000000",9],
["00000000000000",
"00011111111000",
"00111111111100",
"01100000000110",
"11000000000011",
"11000000001011",
"11000000001111",
"01100000000110",
"00111111111111",
"00011111111001",
"00000000000000",9],
["00000000000000",
"11111111111111",
"11111111111111",
"11000011000000",
"11000011100000",
"11000011110000",
"01100110011100",
"00111100001111",
"00011000000011",
"00000000000000",9],
["00000000000000",
"00011000000100",
"00111100000110",
"01100110000011",
"11000011000011",
"11000011000011",
"11000011000011",
"11000001100110",
"01100000111100",
"00100000011000",
"00000000000000",9],
["00000000000000",
"11000000000000",
"11000000000000",
"11000000000000",
"11111111111111",
"11111111111111",
"11000000000000",
"11000000000000",
"11000000000000",
"00000000000000",9],
["00000000000000",
"11111111111000",
"11111111111100",
"00000000000110",
"00000000000011",
"00000000000011",
"00000000000011",
"00000000000110",
"11111111111100",
"11111111111000",
"00000000000000",9],
["00000000000000",
"11110000000000",
"11111110000000",
"00001111110000",
"00000000001111",
"00001111110000",
"11111110000000",
"11110000000000",
"00000000000000",9],
["00000000000000",
"11110000000000",
"11111111000000",
"00001111111100",
"00000000111111",
"00000000000011",
"00000000001110",
"00000000111100",
"00000011110000",
"00000011110000",
"00000000111100",
"00000000001110",
"00000000000011",
"00000000111111",
"00001111111100",
"11111111000000",
"11110000000000",
"00000000000000",9],
["00000000000000",
"11000000000011",
"11110000001111",
"00111100111100",
"00001111110000",
"00001111110000",
"00111100111100",
"11110000001111",
"11000000000011",
"00000000000000",9],
["00000000000000",
"11000000000011",
"11110000001111",
"00111100111100",
"00001111110000",
"00001111000000",
"00111100000000",
"11110000000000",
"11000000000000",
"00000000000000",9],
["00000000000000",
"11000000000011",
"11000000001111",
"11000000111111",
"11000011110011",
"11001111000011",
"11111100000011",
"11110000000011",
"11000000000011",
"00000000000000",9],
["00000000000000",
"00000000000000",
"00000000000000",
"00000000000000",
"00000000000000",
"00000000000000",
"00000000000000",9]]
Alles anzeigen
Sicherlich etwas umständlich geschrieben, aber auf die schnelle ging es so für mich am einfachsten.
Ich hatte noch etwas Probleme mit Pygame, da ich das vorher noch nie benutzt habe und mich nur auf die einfachsten Sachen beschränkt habe.
Zur Anwendung:
Das Programm muss für den Headless-Betrieb natürlich automatisch gestartet werden.
Dafür gibt es mehrere Methoden. Ich habe mich für einen Eintrag im ".bashrc" entschieden.
Ein Autologin ist natürlich auch wichtig für den Außeneinsatz.
Jetzt den Pi mit dem LED-Stick verbinden, das Joypad anschließen und die Stromversorgung einschalten.
Zum starten von dem Text die entsprechende Taste für 1-2 Sekunden gedrückt halten.
Sobald die Taste losgelassen wird, startet auch sofort der Text.
Man sollte also vorher schon etwas in Bewegung sein, damit sich der erste Buchstabe nicht überlagert.
Ein wenig Experimentierfreude beim Fotografieren ist unumgänglich, damit man den Text auch komplett auf das Bild bringt.
Das sollte aber für jeden, der mit seiner Kamera umgehen kann kein weiteres Problem darstellen und muss eigentlich hier nicht weiter beschrieben werden.
Sollte ich noch offene Fragen hinterlassen haben, bitte einfach fragen.
Für Verbesserungsvorschläge bin ich jederzeit zu haben, doch der Stick wird jetzt erstmal in die Schublade wandern.
Wenn ich nach meinem Aktuellem Projekt wieder Zeit habe, werde ich mich wohl mal HIERDRAUF stürzen. (sabber, lechz)
/edit:
Hier im Forum hat sich mcgyver100 ebenfalls ein Lightpaint Projekt gebaut. Allerdings etwas größer :thumbs1:
Bis dann und viel spass beim selberbasteln :thumbs1: