Line 80: | Line 80: | ||
* <code>echo "PX 100 10 00ff00" > /dev/udp/10.208.42.159/5003</code> | * <code>echo "PX 100 10 00ff00" > /dev/udp/10.208.42.159/5003</code> | ||
* <code>#! /usr/bin/python | * text mbv python: | ||
<code>#! /usr/bin/python | |||
import socket | import socket | ||
Line 90: | Line 92: | ||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | ||
sock.sendto(sys.argv[1], (UDP_IP, UDP_PORT))</code> | sock.sendto(sys.argv[1], (UDP_IP, UDP_PORT))</code> | ||
* pixelflut mbv python: | |||
<code>#! /usr/bin/python | |||
import colorsys | |||
import random | |||
import socket | |||
import struct | |||
import sys | |||
#HOST = '10.208.42.159' | |||
HOST = '192.168.64.124' | |||
PORT = 5004 | |||
dimx = 64 | |||
dimy = 32 | |||
def rand(): | |||
return random.randint(0, 4000000000) | |||
def pixel(pixels): | |||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |||
# s = '' | |||
s = struct.pack("<B", 1) + struct.pack("<?", 0) | |||
for x, y, r, g, b in pixels: | |||
# s += 'PX %d %d %02x%02x%02x\n' % (x, y, r, g, b) | |||
s += struct.pack("<2H3B", x, y, r, g, b) | |||
# print len(s) | |||
sock.sendto(s, (HOST, PORT)) | |||
del sock | |||
while True: | |||
pixels = [] | |||
if len(sys.argv) == 1 or sys.argv[1] == 'random': | |||
for n in range(0, dimx * dimy): | |||
r, g, b = colorsys.hls_to_rgb(random.random(), 0.5, 1.0) | |||
pixels.append((rand() % dimx, rand() % dimy, int(r * 255), int(g * 255), int(b * 255))) | |||
elif sys.argv[1] == 'red': | |||
for n in range(0, dimx * dimy): | |||
pixels.append((rand() % dimx, rand() % dimy, 255, 0, 0)) | |||
elif sys.argv[1] == 'blue': | |||
for n in range(0, dimx * dimy): | |||
pixels.append((rand() % dimx, rand() % dimy, 0, 0, 255)) | |||
elif sys.argv[1] == 'green': | |||
for n in range(0, dimx * dimy): | |||
pixels.append((rand() % dimx, rand() % dimy, 0, 255, 0)) | |||
pixel(pixels) | |||
</code> | |||
=== links === | === links === |
Revision as of 22:36, 2 March 2019
Led ticker | |
---|---|
Participants | Folkert |
Skills | |
Status | Active |
Niche | |
Purpose | |
Tool | No |
Location | Space |
Cost | |
Tool category |
Ledtickerns.jpg {{#if:No | [[Tool Owner::{{{ProjectParticipants}}} | }} {{#if:No | [[Tool Cost::{{{Cost}}} | }}
algemeen
- ze ip is 10.208.42.159
- code is nurdspace.cc in /usr/src/rpi-rgb-led-matrix/examples-api-use
tekst
- luistert op port 5001 UDP voor teksten:
- stuur tekst om te tonen via een udp bericht
- escapes:
- $C...$ voorgrond kleur
- $B...$ achtergrond kleur
- $O...$ outline kleur
- formaat kleur: xxyyzz waarbij xx een hexadecimale waarden tussen 00 en ff is
- $o$ zet outline kleur uit
- $d...$ hoelang de tekst op 't scherm zetten
- $i$ deze tekst is de "idle tekst"; als er niks anders voorbij scrolled, dan wordt deze tekst (NIET-scrollend) getoond, goed een beetje dan
- $f$ knipper 'n bietje
- $a$ add to existing line. use $i$$a$ to add to idle line
Dus bijvoorbeeld:
- $f$$Cff0000$Hallo! Dit is een rode tekst.
- $i$Deze tekst wordt getoond als er verder niks te scrollen is.
pixelflut
- er zit ook een pixelflut server in
- port 5003: udp berichten met tekst(!)
- voor iedere pixel (meerdere pixels per udp bericht mogelijk:
- PX x y rrggbb\nPX x y rrggbb\n
- voor iedere pixel (meerdere pixels per udp bericht mogelijk:
- port 5004: udp berichten met het "echte" udp pixelflut protocol - dat is het binaire dingetje:
- 1 byte versie (0x01)
- 1 byte rgb of rgba (rgba is 0x01, rgb is 0x00) -> de ledticker negeerd vooralsnog het alpha kanaal
- en dan voor iedere pixel die je wil updaten (meerdere per udp bericht mogelijk):
- 16 bit x, lsb first
- 2 bytes y, lsb first
- 1 byte r
- 1 byte g
- 1 byte b
- [1 byte a]
cron
- de daily events enzo worden vanuit cron gestart, de cron van root
- wordt gestart vanuit /etc/rc.local
- root password is dat ene korte
koppelingen
- nurdbot:
/home/nurdbot/.jsb/releases/NURDbot/jsb/plugs/socket/udp.py (voor berichten van de deur)en myplugs/socket/wautemp.py (voor !ticker bla) - asterisk: /usr/local/bin/ticker-send.py en /usr/local/bin/push-it.sh (voor bellers)
- spacenanny: /usr/local/sbin/deurbel.py ("deurbel!!!")
- Space status: /opt/status/status.py (space status: open/closed)
- Scrollert: /usr/local/bin/door-to-ticker.sh (wie doet er de deur open)
- Scrollert: /usr/local/bin/send-ticker.py (used for periodic messages, see crontab of root user)
Linux CLI example
echo -n "test" > /dev/udp/10.208.42.159/5001
echo "PX 100 10 00ff00" > /dev/udp/10.208.42.159/5003
- text mbv python:
#! /usr/bin/python
import socket
import sys
UDP_IP = "10.208.42.159"
UDP_PORT = 5001
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(sys.argv[1], (UDP_IP, UDP_PORT))
- pixelflut mbv python:
#! /usr/bin/python
import colorsys
import random
import socket
import struct
import sys
- HOST = '10.208.42.159'
HOST = '192.168.64.124'
PORT = 5004
dimx = 64
dimy = 32
def rand():
return random.randint(0, 4000000000)
def pixel(pixels):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s =
s = struct.pack("<B", 1) + struct.pack("<?", 0)
for x, y, r, g, b in pixels:
- s += 'PX %d %d %02x%02x%02x\n' % (x, y, r, g, b)
s += struct.pack("<2H3B", x, y, r, g, b)
- print len(s)
sock.sendto(s, (HOST, PORT))
del sock
while True:
pixels = []
if len(sys.argv) == 1 or sys.argv[1] == 'random':
for n in range(0, dimx * dimy):
r, g, b = colorsys.hls_to_rgb(random.random(), 0.5, 1.0)
pixels.append((rand() % dimx, rand() % dimy, int(r * 255), int(g * 255), int(b * 255)))
elif sys.argv[1] == 'red':
for n in range(0, dimx * dimy):
pixels.append((rand() % dimx, rand() % dimy, 255, 0, 0))
elif sys.argv[1] == 'blue':
for n in range(0, dimx * dimy):
pixels.append((rand() % dimx, rand() % dimy, 0, 0, 255))
elif sys.argv[1] == 'green':
for n in range(0, dimx * dimy):
pixels.append((rand() % dimx, rand() % dimy, 0, 255, 0))
pixel(pixels)
links
- https://github.com/flok99/asciiflut-webcam <- video4linux webcam naar pixelflut. negeer het "ascii" want het gebruikt geen ascii
- https://github.com/NURDspace/rpi-rgb-led-matrix <- door flok aangepaste versie van de hzeller library tbv led matrixen. onder "examples" staat de "nurdspace" binary, die moet je hebben
- https://github.com/flok99/constatus <- heeft een pixelflut client ("target")