LED-Stripe: Unterschied zwischen den Versionen

Aus C3D2
Zur Navigation springen Zur Suche springen
(Mehr bunt)
 
(26 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Installation der Hardware ==
== Installation der Hardware ==


Zwei LED-Streifen à 3 m (206 LEDs) hängen an labilen Böcken in den Vorhangaufhängenischen über den Fenstern im [[HQ/Raum#Prokrastinationraum | großen Raum im]] [[GCHQ]]. Zusätzlich sind nun auch 20 LEDs rundum im Hardware-Kasten an der Wand.
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 ==
== Steuerung ==


Controller ist der [[Pi]] ''[[ledbeere]]''.
Controller sind Geräte mit '''SPI'''-Schnittstelle.


Auf [[ledbeere]] kann sich per ssh verbunden werden.
=== [[ledbeere]] (Raspbian) ===
: Ein Verbinden soll nur innerhalb des Netzes des [[HQ]] möglich sein.
: <source lang=bash>ssh pi@172.22.99.206</source>
: <source lang=bash>ssh pi@172.22.99.206</source>
: fe80::ba27:ebff:fe6d:b29b
 
=== [[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 ==
Zeile 21: Zeile 34:
; [https://github.com/astro/pile/blob/master/ustripe-simplex/main.js ustripe-simplex]
; [https://github.com/astro/pile/blob/master/ustripe-simplex/main.js ustripe-simplex]
: Das gute alte Simplex-Plasma auf Priorität 255
: 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
; piletop
: Sollte das Serversystem in node.js werden, soll mal Konfiguration oder gar Code entgegennehmen und mehrere Ziele bespielen können.
: 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 ==
== Protokoll ==
Zeile 31: Zeile 55:
* Bytes 2 & 3: Länge der folgenden Daten in Network Byte Order; für 226 LEDs mit je 3 Byte: 678 = [0x02, 0xA6]
* 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
* 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]]
[[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

Bare-Metal Rust

Layout

Gehäusebeleuchtung
0 <= x < 20
Gehäusebeleuchtung (TODO: Details?)
20 <= x < 120
Östlicher LED-Stripe
121 <= x < 226
Westlicher LED-Stripe

Code

github:astro/pile

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.