LED-Stripe: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Astro (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Astro (Diskussion | Beiträge) (Mehr bunt) |
||
(34 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[ | == Installation der Hardware == | ||
Zwei LED-Streifen à 3 m (206 LEDs) an den Kabeltrassen im Großen Raum [[GCHQ]]. Zusätzlich sind nun auch 20 LEDs rundum im Hardware-Kasten, der die Steuer- und Powertechnik enthält. Der Kasten ist via Steckdosenverteiler an den Lichtschalter gekoppelt, der auch die blaue Röhre und die Lichterkette um die Tür de-/aktiviert. | |||
== Steuerung == | |||
Controller sind Geräte mit '''SPI'''-Schnittstelle. | |||
== | === [[ledbeere]] (Raspbian) === | ||
: <source lang=bash>ssh pi@172.22.99.206</source> | |||
=== [[ledball1]] (OpenWRT) === | |||
: <source lang=bash>ssh pi@172.22.99.207</source> | |||
== | === [[ruststripe1]] === | ||
[https://github.com/astro/pile/tree/master/rstripee Bare-Metal Rust] | |||
== Layout == | |||
< | [[Bild:LED-Stripe-Gehaeuse.medium.jpg|thumb|Gehäusebeleuchtung]] | ||
; 0 <= x < 20 | |||
: Gehäusebeleuchtung (TODO: Details?) | |||
; 20 <= x < 120 | |||
: Östlicher LED-Stripe | |||
; 121 <= x < 226 | |||
: Westlicher LED-Stripe | |||
== Code == | == Code == | ||
[https://github.com/astro/pile github:astro/pile] | |||
Bislang gibt es folgende Komponenten: | |||
; [https://github.com/astro/pile/blob/master/ustriped/main.c ustriped] | |||
: Kleiner C-Server der Pixeldaten über UDP entgegennimmt und auf GPIO schreibt; kann Prioritäten | |||
; [https://github.com/astro/pile/blob/master/ustripe-simplex/main.js ustripe-simplex] | |||
: Das gute alte Simplex-Plasma auf Priorität 255 | |||
; [https://github.com/astro/pile/tree/master/ustripe-pulse/src ustripe-pulse] | |||
: Musikvisualisierung von cider, läuft auf flatbert im Container ustriper, auf Priorität 253 | |||
; piletop | |||
: Sollte das Serversystem in node.js werden, soll mal Konfiguration oder gar Code entgegennehmen und mehrere Ziele bespielen können. | |||
; [https://github.com/DjangoOne/led-stripe-py led-stripe-py] | |||
: Python-Bibliothek von [[user:elias]] | |||
; [https://github.com/indietyp/LEDStripe-c3d2-ruby LEDStripe-ruby] | |||
: Ruby-Bibliothek von [[user:indietyp]] | |||
; [https://github.com/PaulPetring/esp8266-ws2812b-open-pixel-control esp8266-ws2812b-open-pixel-control] | |||
: kompatible esp8266 Version des Stripes von [[user:Honky]] | |||
; [https://github.com/PaulPetring/led-stripe-py-esp8266.git led-stripe-py-esp8266] | |||
: für den esp8266 angepasste Python-Bibliothek von [[user:elias]] | |||
; [https://github.com/c3d2/ambiente/blob/2b1177f84c75c47da1c54d77901d02b599f71e57/leds.js Ambiente] UDP-Client in Node.js | |||
== Protokoll == | |||
Per UDP an ledbeere:2342 für 226 LEDs: | |||
* Byte 0: Priorität (255 für etwas was andauernd läuft, niedriger für kurzzeitigere Sachen) | |||
* Byte 1: Kommando (0: CMD_SET_PIXEL_COLORS) | |||
* Bytes 2 & 3: Länge der folgenden Daten in Network Byte Order; für 226 LEDs mit je 3 Byte: 678 = [0x02, 0xA6] | |||
* Dann: 8 bit blau, 8 bit grün, 8 bit rot für 226 LEDs | |||
== Implementationen == | |||
=== shell === | |||
Weißes Rauschen anzeigen, also Farbdaten aus <tt>/dev/urandom</tt>: | |||
; | : <source lang=bash>while true; do ( echo -en '\x00\x00\x02\xA6'; dd if=/dev/urandom bs=678 count=1 status=none ) | ncat --send-only --udp ledbeere 2342; sleep 0.1; done</source> | ||
: | : <source lang=bash>while true; do ( echo -en '\x00\x00\x07\x80'; dd if=/dev/urandom bs=1920 count=1 status=none ) | ncat --send-only --udp ledball1 2342; sleep 0.1; done</source> | ||
; | |||
: | |||
Alle LEDs auf grün stellen: | |||
: <source lang=bash>( echo -en '\x00\x00\x02\xA6'; for i in {1..226}; do echo -en '\x00\xFF\x00'; done ) | ncat --send-only --udp ledbeere 2342</source> | |||
=== python === | |||
Ein einfaches Beispiel in Python: | |||
<source lang=python> | |||
import socket | |||
import time | |||
from struct import * | |||
HOST = 'ledball1' | |||
PORT = 2342 | |||
LEDS = 640 | |||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |||
def send_rgb(r,g,b): | |||
# header | |||
data = [pack('b',0),pack('b',0), pack('!h',3 * LEDS)] | |||
# Farben fuer 640 leds | |||
for i in range(0,LEDS): | |||
data.append(pack('BBB',b,g,r)) | |||
s.sendto("".join(data),(HOST,PORT)) | |||
send_rgb(0,255,0) | |||
time.sleep(0.5) | |||
send_rgb(255,0,0) | |||
time.sleep(0.5) | |||
send_rgb(0,0,255) | |||
time.sleep(0.5) | |||
send_rgb(0,0,0) | |||
s.close() | |||
</source> | |||
Das sollte alle LEDs nacheinander auf Grün, Rot, Blau stellen. | |||
[[Kategorie:Projekt]] |
Aktuelle Version vom 9. Oktober 2018, 16:49 Uhr
Installation der Hardware
Zwei LED-Streifen à 3 m (206 LEDs) an den Kabeltrassen im Großen Raum GCHQ. Zusätzlich sind nun auch 20 LEDs rundum im Hardware-Kasten, der die Steuer- und Powertechnik enthält. Der Kasten ist via Steckdosenverteiler an den Lichtschalter gekoppelt, der auch die blaue Röhre und die Lichterkette um die Tür de-/aktiviert.
Steuerung
Controller sind Geräte mit SPI-Schnittstelle.
ledbeere (Raspbian)
ssh pi@172.22.99.206
ledball1 (OpenWRT)
ssh pi@172.22.99.207
ruststripe1
Layout
- 0 <= x < 20
- Gehäusebeleuchtung (TODO: Details?)
- 20 <= x < 120
- Östlicher LED-Stripe
- 121 <= x < 226
- Westlicher LED-Stripe
Code
Bislang gibt es folgende Komponenten:
- ustriped
- Kleiner C-Server der Pixeldaten über UDP entgegennimmt und auf GPIO schreibt; kann Prioritäten
- ustripe-simplex
- Das gute alte Simplex-Plasma auf Priorität 255
- ustripe-pulse
- Musikvisualisierung von cider, läuft auf flatbert im Container ustriper, auf Priorität 253
- piletop
- Sollte das Serversystem in node.js werden, soll mal Konfiguration oder gar Code entgegennehmen und mehrere Ziele bespielen können.
- led-stripe-py
- Python-Bibliothek von user:elias
- LEDStripe-ruby
- Ruby-Bibliothek von user:indietyp
- esp8266-ws2812b-open-pixel-control
- kompatible esp8266 Version des Stripes von user:Honky
- led-stripe-py-esp8266
- für den esp8266 angepasste Python-Bibliothek von user:elias
- Ambiente UDP-Client in Node.js
Protokoll
Per UDP an ledbeere:2342 für 226 LEDs:
- Byte 0: Priorität (255 für etwas was andauernd läuft, niedriger für kurzzeitigere Sachen)
- Byte 1: Kommando (0: CMD_SET_PIXEL_COLORS)
- Bytes 2 & 3: Länge der folgenden Daten in Network Byte Order; für 226 LEDs mit je 3 Byte: 678 = [0x02, 0xA6]
- Dann: 8 bit blau, 8 bit grün, 8 bit rot für 226 LEDs
Implementationen
shell
Weißes Rauschen anzeigen, also Farbdaten aus /dev/urandom:
while true; do ( echo -en '\x00\x00\x02\xA6'; dd if=/dev/urandom bs=678 count=1 status=none ) | ncat --send-only --udp ledbeere 2342; sleep 0.1; done
while true; do ( echo -en '\x00\x00\x07\x80'; dd if=/dev/urandom bs=1920 count=1 status=none ) | ncat --send-only --udp ledball1 2342; sleep 0.1; done
Alle LEDs auf grün stellen:
( echo -en '\x00\x00\x02\xA6'; for i in {1..226}; do echo -en '\x00\xFF\x00'; done ) | ncat --send-only --udp ledbeere 2342
python
Ein einfaches Beispiel in Python:
import socket
import time
from struct import *
HOST = 'ledball1'
PORT = 2342
LEDS = 640
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def send_rgb(r,g,b):
# header
data = [pack('b',0),pack('b',0), pack('!h',3 * LEDS)]
# Farben fuer 640 leds
for i in range(0,LEDS):
data.append(pack('BBB',b,g,r))
s.sendto("".join(data),(HOST,PORT))
send_rgb(0,255,0)
time.sleep(0.5)
send_rgb(255,0,0)
time.sleep(0.5)
send_rgb(0,0,255)
time.sleep(0.5)
send_rgb(0,0,0)
s.close()
Das sollte alle LEDs nacheinander auf Grün, Rot, Blau stellen.