|
|
(30 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
− | {{warning|Under Construction: Die Informationen in diesem Artikel sind mit Sicherheit unvollständig und eventuell auch falsch.}}
| |
− |
| |
− |
| |
| = Flipdot = | | = Flipdot = |
− |
| |
| Wir haben ein Flip Dot Modul mit 20x16 schwarz/weissen Pixeln aus den [https://twitter.com/muccc/status/346045931906535424/photo/1 Beständen] des CCC München.<br> | | Wir haben ein Flip Dot Modul mit 20x16 schwarz/weissen Pixeln aus den [https://twitter.com/muccc/status/346045931906535424/photo/1 Beständen] des CCC München.<br> |
| Die Displays stammen von der Parkplatzanzeige der Allianzarena auf der A9 bei München, in der 198 dieser Module zu einer großen Anzeigefläche verbunden waren. | | Die Displays stammen von der Parkplatzanzeige der Allianzarena auf der A9 bei München, in der 198 dieser Module zu einer großen Anzeigefläche verbunden waren. |
− | Auf [http://goo.gl/maps/fwFs3 Google Streetview] ist die Anzeige noch zu sehen. | + | Auf [http://goo.gl/maps/vSf0d Google Streetview] ist die Anzeige noch zu sehen. |
| | | |
| + | * [http://www.youtube.com/watch?v=RxWxNWCN0fE Video: Flipdot Spectrum Analyzer] |
| + | * [http://www.youtube.com/watch?v=X2mXpYzDers Video: Raspberry Pi, USB-Kamera, Flipdot-Display] |
| * [http://www.youtube.com/watch?v=Hcmmq02P28c Video von einem Test unseres Displays] | | * [http://www.youtube.com/watch?v=Hcmmq02P28c Video von einem Test unseres Displays] |
| * [http://de.wikipedia.org/wiki/Bistabiles_Anzeigeelement Deutsche Wikipedia zum Thema "Bistabiles Anzeigeelement"] | | * [http://de.wikipedia.org/wiki/Bistabiles_Anzeigeelement Deutsche Wikipedia zum Thema "Bistabiles Anzeigeelement"] |
Zeile 49: |
Zeile 47: |
| | | |
| An unserem Display ist Pixel X<sub>15</sub>/Y<sub>15</sub> defekt. Wir haben den Fehler noch nicht näher analysiert. Eventuell lässt es sich wiederbeleben. An Pixel X<sub>19</sub>/Y<sub>5</sub> ist ein Teil des Plastiklagers abgebrochen und das Plättchen fehlt.<br clear="all"> | | An unserem Display ist Pixel X<sub>15</sub>/Y<sub>15</sub> defekt. Wir haben den Fehler noch nicht näher analysiert. Eventuell lässt es sich wiederbeleben. An Pixel X<sub>19</sub>/Y<sub>5</sub> ist ein Teil des Plastiklagers abgebrochen und das Plättchen fehlt.<br clear="all"> |
| + | |
| | | |
| == Treiberplatine == | | == Treiberplatine == |
Zeile 92: |
Zeile 91: |
| = Anschluss = | | = Anschluss = |
| == Stromversorgung == | | == Stromversorgung == |
− | Das Display wird mit 24V DC betrieben. Wir haben ein [http://www.reichelt.de/?ARTICLE=115750 passendes 3A-Netzteil] bei Reichelt besorgt. Ans Display angeschlossen wird es über [http://www.reichelt.de/?ARTICLE=127464 diese praktische Buchse]. Parallel dazu wird noch ein 2200µF/50V Elko geklemmt, damit die Spannung beim Schalten nicht zu sehr einbricht. Getestet mit zwei horizontal geschalteten Modulen. | + | Das Display wird mit 24V DC betrieben. Wir haben ein [http://www.reichelt.de/?ARTICLE=115750 passendes 3A-Netzteil] bei Reichelt besorgt. Ans Display angeschlossen wird es über [http://www.reichelt.de/?ARTICLE=127464 diese praktische Buchse]. Parallel dazu wird noch ein 2200µF Elko geklemmt. Getestet mit zwei horizontal geschalteten Modulen. |
| | | |
| Für größere Installationen eignet sich vermutlich [http://www.amazon.de/dp/B00DQEGBHI dieses 10A-Netzteil]. Anschluss und sicherer Einbau sind dabei aber etwas komplizierter. | | Für größere Installationen eignet sich vermutlich [http://www.amazon.de/dp/B00DQEGBHI dieses 10A-Netzteil]. Anschluss und sicherer Einbau sind dabei aber etwas komplizierter. |
| + | |
| + | Aus dem Netzteil kann man dann gleich noch einen Raspberry Pi betreiben. Spannungswandler von 24V auf 5V gibts [http://www.ebay.de/itm/New-LM2596-Low-Ripple-DC-Converter-Step-Down-Power-Supply-In-4-40V-Out-1-5-35V-/160912296597 günstig] in China. Auf der Ausgangsseite ein halbes [http://www.amazon.de/dp/B003XOZQAY?m=A2MUPZSZIQER8Q USB-Verlängerungskabel] (mit A-Buchse) oder gleich einen Micro-USB-Stecker anlöten. |
| | | |
| | | |
Zeile 140: |
Zeile 141: |
| | | |
| = Ansteuerung = | | = Ansteuerung = |
− |
| |
| == Logisch == | | == Logisch == |
− | | + | [[File:Flipdotlogic5.png|thumb|400px|right|Flip Dot Ansteuerung - Pixel X9,Y6 wird weiss, X14,Y6 schwarz]] |
− | [[File:Flipdotlogic5.png|thumb|400px|right|Flip Dot Ansteuerung]] | + | |
| {| class="wikitable" style="text-align: center;" align="right" | | {| class="wikitable" style="text-align: center;" align="right" |
| |+ IN -> OUT | | |+ IN -> OUT |
Zeile 159: |
Zeile 158: |
| | 1 || 0 || 0 || 1 || style="text-align: left;" | Keine Änderung | | | 1 || 0 || 0 || 1 || style="text-align: left;" | Keine Änderung |
| |} | | |} |
| + | [[File:Flipdotlogic8.png|thumb|400px|right|Flip Dot Ansteuerung optimiert mit bis zu 8MHz Registertakt]] |
| # Zeilen im ROW Register auswählen | | # Zeilen im ROW Register auswählen |
| #* pro vertikalem Modul 16 Daten-Bits schieben | | #* pro vertikalem Modul 16 Daten-Bits schieben |
| + | #* es können mehrere Zeilen gleichzeitig mit den gleichen Pixeldaten beschaltet werden. Dabei den Strom pro Modul und Stromversorgung beachten! |
| # COL Register mit Daten füllen | | # COL Register mit Daten füllen |
| #* pro horizontalem Modul zuerst 4 Dummy-Bits, dann 20 Daten-Bits schieben | | #* pro horizontalem Modul zuerst 4 Dummy-Bits, dann 20 Daten-Bits schieben |
Zeile 167: |
Zeile 168: |
| #* OE0 flippt die 0-Bits in COL zur weissen Seite | | #* OE0 flippt die 0-Bits in COL zur weissen Seite |
| #* OE1 flippt die 1-Bits zur schwarzen Seite | | #* OE1 flippt die 1-Bits zur schwarzen Seite |
| + | # OEx wieder abschalten! Ggf. OE-Puls gegen Abbruch durch SIGTERM/SIGKILL u.ä. sichern |
| | | |
| Jedes gleichzeitig geschaltete Pixel erhöht die Stromspitze. Bei geringerer Framerate kann man evtl. Pixel nacheinander ändern. | | Jedes gleichzeitig geschaltete Pixel erhöht die Stromspitze. Bei geringerer Framerate kann man evtl. Pixel nacheinander ändern. |
| + | |
| | | |
| == Software == | | == Software == |
− |
| |
| === libFlipdot === | | === libFlipdot === |
− |
| |
| Der Hardware-Layer für Raspberry Pi funktioniert:<br> | | Der Hardware-Layer für Raspberry Pi funktioniert:<br> |
− | https://github.com/lampeh/rpi-misc/tree/master/flipdot | + | https://github.com/lampeh/libflipdot |
| | | |
− | * Display-Größe und GPIO-Belegung hartkodiert in flipdot.h
| + | Mit der Library lassen sich Bitmaps auf dem Display wiedergeben. Dabei werden nur die wirklich veränderten Pixel angesteuert. Eine Beschreibung der Funktionen findet sich im README. |
− | * sollte für beliebige NxM Modulanordnung funktionieren | + | |
| + | Mit dem Beispiel "flip_pipe" können auch einfache ASCII-Bitmaps verwendet werden, wie z.B. die Ausgabe von figlet: |
| + | while :; do date "+%s" |toilet -f [http://www.figlet.org/fontdb_example.cgi?font=3x5.flf ./3x5.flf] -w $DISP_COLS; echo; sleep 1; done |sudo ./examples/flip_pipe |
| + | |
| + | * beliebige H * V Modulanordnung |
| + | * sollte durch Austauschen der _hw_*() Funktionen auch für andere Hardware mit GPIOs verwendbar sein |
| * Bitmap: Pixel-Array ohne Gap zwischen horizontalen Modulen | | * Bitmap: Pixel-Array ohne Gap zwischen horizontalen Modulen |
| * Frame: Pixel-Array mit Gap | | * Frame: Pixel-Array mit Gap |
− | * die bcm-GPIO-Library braucht root für mmap() auf /dev/mem | + | * die bcm2835-Library braucht root für mmap() der GPIO-Register in /dev/mem |
| + | * Codequalität verbesserungswürdig: globale #defines, langsame Bit-Copies, ... |
| + | * TODO: Display-Größe besser konfigurierbar machen. Z.Zt hartkodiert in flipdot.h |
| + | * TODO: GPIO-Zuordnung besser konfigurierbar machen. Z.Zt hartkodiert in flipdot.h |
| | | |
| | | |
− | ;void flipdot_init(void);
| + | ====Uhr==== |
− | : Initialisierung der Hardware und interner Buffer
| + | <pre> |
| + | #!/bin/bash |
| | | |
− | ;void flipdot_shutdown(void);
| + | trap "sudo flipoff" EXIT |
− | : Schaltet die verwendeten GPIOs ab, insbesondere OEx
| + | |
| | | |
− | ;void flipdot_clear_to_0(void); | + | { |
− | : Flippt einmal alles auf Weiss | + | export TZ=Europe/Berlin |
| + | new="" |
| + | old="" |
| + | while :; do |
| + | new=`date "+%M"` |
| + | if [ "$new" != "$old" ]; then |
| + | echo |
| + | date "+%d.%m.%Y %H:%M"|toilet -f 3x5 -w 40 |
| + | echo |
| + | old=$new |
| + | date >&2 |
| + | fi |
| + | sleep 1 |
| + | done |
| + | } |sudo flip_pipe |
| + | </pre> |
| | | |
− | ;void flipdot_clear_to_1(void);
| |
− | : Flippt einmal alles auf Schwarz
| |
| | | |
− | ;void flipdot_clear(void);<br>
| + | === vlc-plugin === |
− | : Alias für flipdot_clear_to_0() | + | Das Video-Output-Plugin für vlc funktioniert:<br> |
| + | https://github.com/lampeh/libflipdot/tree/master/vlc |
| | | |
− | ;void flipdot_bitmap_to_frame(uint8_t *bitmap, uint8_t *frame);
| + | * vlc -V flipdot |
− | : Fügt Gaps im Pixel-Array ein | + | * funktioniert auch für Visualizer-Windows u.ä. |
| + | ** für FFT ist der Pi leider zu langsam :( |
| + | * skaliert automatisch auf die Display-Größe |
| + | * schwarz/weiss Schwellwert einstellbar mit "[https://wiki.videolan.org/Documentation:Modules/adjust/ adjust]" Modul |
| + | ** --video-filter "adjust{brightness=1.3,brightness-threshold}" |
| + | * TODO: Hardware-Konfiguration hartkodiert in libFlipdot. siehe dort |
| + | ** Plugin-Konfiguration für Displaygröße, Schwellwert-Default |
| + | * TODO: "vlc läuft nicht als root" vs "root-Rechte für bcm2835" |
| + | ** Mögliche Lösung: bcm2835_init() in vlc-wrapper |
| + | ** Workaround für Testzwecke: vlc configure --enable-run-as-root |
| + | ** Hackaround für Ganz Eilige: Den String "geteuid" im Binary durch "getppid" ersetzen. ([http://www.linuxquestions.org/questions/linux-general-1/solved-vlc-running-under-root-without-compiling-748189/ "Solved: VLC running under root without compiling"]) |
| + | *TODO: Funktioniert flipdot output zusammen mit dem [https://github.com/videolan/vlc/tree/master/modules/codec/omxil HW-Decoder]? |
| | | |
− | ;void flipdot_frame_to_bitmap(uint8_t *frame, uint8_t *bitmap);
| |
− | : Entfernt Gaps
| |
| | | |
− | ;void flipdot_display_row(uint8_t *rows, uint8_t *cols);
| + | ====Flipdot Camera==== |
− | : Setzt alle Pixel einer Zeile neu | + | vlc -V flipdot --no-audio v4l2:///dev/video0:width=40:height=16:chroma=GREY:fps=25 --video-filter "adjust{brightness=1.25,brightness-threshold}" |
| | | |
− | ;void flipdot_display_row_diff(uint8_t *rows, uint8_t *cols_to_0, uint8_t *cols_to_1);
| |
− | : Setzt nur die Pixel mit 0-Bits in cols_to_0 oder 1-Bits in cols_to_1
| |
| | | |
− | ;void flipdot_display_frame(uint8_t *frame);
| + | ====Lava Lamp==== |
− | : Aktualisiert internen Buffer, setzt explizit alle Pixel neu
| + | vlc -V flipdot --no-audio --play-and-exit --video-filter "adjust{brightness=1.22,brightness-threshold}" "[http://www.youtube.com/watch?v=nv74T-BybTo HD Green_Yellow Lava Lamp - 10 Minutes-nv74T-BybTo.3gp]" |
| | | |
− | ;void flipdot_display_bitmap(uint8_t *bitmap);
| |
− | : Konvertiert Bitmap zu Frame, dann flipdot_display_frame()
| |
| | | |
− | ;void flipdot_update_frame(uint8_t *frame);
| + | ====FlipArray==== |
− | : Aktualisiert internen Buffer, setzt nur ggü. dem vorherigen Buffer geänderte Pixel
| + | Ein Raspberry Pi sollte ein 3x3 Feld noch mit 25fps ansteuern können. Zusammenschalten mehrerer Pis durch --netsync.<br> |
| + | Beispiel für 4 Pis mit je 4x4 Modulen: |
| | | |
− | ;void flipdot_update_bitmap(uint8_t *bitmap);
| + | Ggf. auf schnellerem Gerät skalieren und auf schwarz/weiss transcoden: |
− | : Konvertiert Bitmap zu Frame, dann flipdot_update_frame() | + | rvlc -L $file --sout '#transcode{width=160,height=128,vfilter=adjust{brightness=1.23,brightness-threshold},deinterlace,\ |
| + | fps=25,vcodec=h264,venc=x264{preset=faster,profile=main}}:std{access=udp,dst=239.255.1.2,mux=ts}' |
| | | |
− | === vlc-plugin ===
| + | Pi 10.0.0.1 links oben als netsync-master: |
| + | rvlc -V flipdot --no-audio --control netsync --netsync-master --video-filter "croppadd{cropbottom=64,cropright=80}" udp://@239.255.1.2:1234 |
| | | |
− | Das Video-Output-Plugin für vlc funktioniert:<br>
| + | Pi 10.0.0.2 rechts oben: |
− | https://github.com/lampeh/rpi-misc/tree/master/flipdot/vlc
| + | rvlc -V flipdot --no-audio --control netsync --netsync-master-ip 10.0.0.1 --video-filter "croppadd{cropbottom=64,cropleft=80}" udp://@239.255.1.2:1234 |
| + | |
| + | Pi 10.0.0.3 links unten: |
| + | rvlc -V flipdot --no-audio --control netsync --netsync-master-ip 10.0.0.1 --video-filter "croppadd{croptop=64,cropright=80}" udp://@239.255.1.2:1234 |
| + | |
| + | Pi 10.0.0.4 rechts unten: |
| + | rvlc -V flipdot --no-audio --control netsync --netsync-master-ip 10.0.0.1 --video-filter "croppadd{croptop=64,cropleft=80}" udp://@239.255.1.2:1234 |
| | | |
− | * Hardware-Konfiguration hartkodiert in libFlipdot
| |
− | * vlc -V flipdot
| |
− | * funktioniert auch für Visualizer-Windows u.ä.
| |
− | ** für FFT ist der Pi leider zu langsam :(
| |
− | * skaliert automatisch auf die Display-Größe
| |
− | * intern hartkodierte Schwelle zwischen schwarz/weiss
| |
− | * Schwellwert einstellbar mit "adjust" Modul
| |
− | ** --video-filter "adjust{brightness=1.3,brightness-threshold}"
| |
− | ** https://wiki.videolan.org/Documentation:Modules/adjust/
| |
− | * Problem: root-Rechte für mmap() der GPIO-Register in /dev/mem
| |
− | ** Mögliche Lösung: bcm2835_init() in vlc-wrapper
| |
| | | |
| === Code === | | === Code === |
− | | + | * [https://github.com/lampeh/libflipdot Flipdot-Code für Raspberry Pi] |
− | * [https://github.com/lampeh/rpi-misc/tree/master/flipdot Flipdot-Code für Raspberry Pi] | + | |
| * [https://github.com/muccc/flipdots Flipdot-Code vom MUCCC für AVR] | | * [https://github.com/muccc/flipdots Flipdot-Code vom MUCCC für AVR] |
| * [https://github.com/muccc/netfbd netfbd - Framebuffer over IP] | | * [https://github.com/muccc/netfbd netfbd - Framebuffer over IP] |
Zeile 251: |
Zeile 276: |
| == Hardware == | | == Hardware == |
| * Was ist das unbekannte SOT23-3 Bauteil zwischen Shunt und Flip-Flop? PNP-Transistor würde Sinn machen. Bei Kurzschluss/Überstrom werden durch das Flip-Flop die OE-Signale gesperrt und können erst durch STROBE-Impuls wieder freigegeben werden | | * Was ist das unbekannte SOT23-3 Bauteil zwischen Shunt und Flip-Flop? PNP-Transistor würde Sinn machen. Bei Kurzschluss/Überstrom werden durch das Flip-Flop die OE-Signale gesperrt und können erst durch STROBE-Impuls wieder freigegeben werden |
− | * Wie funktioniert die Schaltung mit N<sub>*</sub>? Kann man damit die Module zählen? | + | * Wie funktioniert die Schaltung mit N<sub>*</sub>? |
| + | ** mit Pull-Ups an N<sub>1,2</sub> würde es evtl. Sinn machen, um eine gelockerte oder fehlende Matrix im Display zu erkennen |
| + | *** QS<sub>1</sub> == L, STROBE == L -> N<sub>0</sub> = H -> N<sub>3</sub> wird gegen Masse gezogen und zieht bei richtig angeschlossener Matrix N<sub>1,2</sub> mit |
| + | *** Wenn eine Matrix im Feld nicht richtig sitzt, bleibt mindestens ein N<sub>1,2</sub> auf H -> N<sub>A,B</sub> werden gegen Masse gezogen |
| + | *** Open-collector bus |
| + | *** [https://raw.github.com/lampeh/libflipdot/master/schematics/flipdot-driver.png Keine Pull-Ups auf der Platine gefunden] |
| + | ** Kann man damit die Module zählen? |
| * Wie hoch ist der Strom beim Umschalten einer Zeile wirklich? Die Analognadel am Labornetzteil ist zu träge | | * Wie hoch ist der Strom beim Umschalten einer Zeile wirklich? Die Analognadel am Labornetzteil ist zu träge |
| + | ** DC-Widerstand einer Spule messen |
| * Rauchmelder installieren ;) | | * Rauchmelder installieren ;) |
| + | ** Evtl. 1-Wire [http://www.mikrocontroller.net/part/DS18B20 DS18B20] an jede Treiberplatine kleben, über Pin 1 verbinden und mit dem Raspberry Pi abfragen |
| | | |
| == Software == | | == Software == |
Zeile 261: |
Zeile 294: |
| * Flipdot-Library-Wrapper für Python et. al. bauen. GUI Galore! | | * Flipdot-Library-Wrapper für Python et. al. bauen. GUI Galore! |
| * netfbd angucken. Linux-Konsole auf Flipdot! | | * netfbd angucken. Linux-Konsole auf Flipdot! |
| + | |
| + | [[Category:Projekt]] |
Die Flip Dot Matrix besteht aus jeweils einer Spule pro Pixel, die über einen gemeinsamen Eingang pro Zeile und zwei Eingänge pro Spalte geschaltet werden. Je nach Polung dreht sich das mit einem Dauermagneten versehene Plättchen zur einen oder anderen Seite. Wenn Xn auf High und Cn gleichzeitig auf Low geschaltet werden, gibt es einen Kurzschluss in der Spalte. Das Display nimmt nur zum Umschalten der Pixel Strom auf, nicht aber im Ruhezustand.
Die linke obere Ecke eines Moduls ist auf der Rückseite mit "X0 / Y0" markiert.
In unserem Display wird die 20x16 Matrix über zwei Schieberegister und eine Reihe von Transistoren auf der Treiberplatine gesteuert.
Das eine Schieberegister (ROW) ist je Modul 16 Bit lang und selektiert die Zeilen, in denen geschaltet werden soll. Das zweite Register (COL) enthält 24 Bit pro Modul und gibt den X-Zustand in den ausgewählten Zeilen vor. Die Strobe-Eingänge beider Register sind verbunden. Die Daten werden in einem zweiten Registersatz gespiegelt und steuern die H-Brücken für die Pixel an.
Bei einem Zusammenschluss mehrerer Module werden die Spaltenregister horizontal hintereinander geschaltet und die Zeilenregister vertikal.
Aufgrund der Zahl von 20 Pixeln pro Modulzeile endet bei einer ungeraden Anzahl an horizontalen Modulen eine Zeile nicht auf vollen Bytes. Das Spaltenregister enthält pro Modul 4 ungenutzte Bits, die beim Durchschieben berücksichtigt werden müssen.
Aus dem Netzteil kann man dann gleich noch einen Raspberry Pi betreiben. Spannungswandler von 24V auf 5V gibts günstig in China. Auf der Ausgangsseite ein halbes USB-Verlängerungskabel (mit A-Buchse) oder gleich einen Micro-USB-Stecker anlöten.
Jedes gleichzeitig geschaltete Pixel erhöht die Stromspitze. Bei geringerer Framerate kann man evtl. Pixel nacheinander ändern.
Mit der Library lassen sich Bitmaps auf dem Display wiedergeben. Dabei werden nur die wirklich veränderten Pixel angesteuert. Eine Beschreibung der Funktionen findet sich im README.
Mit dem Beispiel "flip_pipe" können auch einfache ASCII-Bitmaps verwendet werden, wie z.B. die Ausgabe von figlet:
Ein Raspberry Pi sollte ein 3x3 Feld noch mit 25fps ansteuern können. Zusammenschalten mehrerer Pis durch --netsync.
Beispiel für 4 Pis mit je 4x4 Modulen:
Ggf. auf schnellerem Gerät skalieren und auf schwarz/weiss transcoden: