Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
flipdot:start [2013/02/23 14:47] – datenkleptomane | flipdot:start [2024/03/07 22:07] (current) – linuxhackerman | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | = Flipdot | ||
+ | |||
---- dataentry Projekt ---- | ---- dataentry Projekt ---- | ||
- | Projekt_url | + | Projekt_url |
- | Name : Flipdot | + | Name : Flipdot |
- | Beschreibung_wiki | + | Beschreibung_wiki : Flipdotmatrixen |
+ | Links_urls | ||
+ | Bilder_imgs | ||
+ | Source_url | ||
+ | Lizenz | ||
+ | Beteiligt | ||
+ | Termine_page | ||
+ | Status_ | ||
+ | Kategorie_tags | ||
+ | Verwandtes_tags | ||
+ | ---- | ||
- | Links_urls | + | Uns ist irgendwann mal ein Rudel Flipdot-Panels zugelaufen, die wir sowohl im Münchner Club als auch in andere Hackerspaces verteilt haben. Die Panels |
- | Bilder_imgs | + | |
- | | + | |
- | - Eine Spalte besteht aus 11 Zeilen, also 11 Panels | + | |
+ | Es gibt verschiedenste Treiberplatinen und Ansteuerungshardware, | ||
- | Source_url | + | Der Quellcode sammelt sich im [[https:// |
- | Lizenz | + | |
- | Beteiligt | ||
- | Termine_page | ||
- | Status_ | + | Ein Panel hat die Abmessungen 30x24x6cm und wiegt mit vier Haltern ca. 1,2 kg. Zwei Panels mit Rücken aneinander haben zusammen ca. 9 anstatt 6 cm Tiefe. |
- | Kategorie_tags | + | |
- | Verwandtes_tags | + | |
- | ---- | + | |
- | ====== Nomenklatur | + | == Nomenklatur |
- | Um dem Chaos ausnahmsweiße entgegen- und nicht zu-zuwirken legen wir hier feste Worte für die einfachere Kommunikation fest! | + | |
- | * Modul (Panel) == 1 Object voll mit Dots; besteht aus: Dot-Matrix mit 16 Spalten | + | Um dem Chaos ausnahmsweise entgegen- und nicht zu-zuwirken legen wir hier feste Worte für die einfachere Kommunikation fest! |
- | * Treiberplatine == nimmt seriell Daten entgegen und gibt dieses Parallel auf die Dot-Matrix eines Moduls. | + | |
- | * Zeile == horizontal aggregierte Ansammlung von Dots, typischer Weiße 16 Dots | + | |
- | * Spalte == vertikal aggregierte Ansammlung von Dots, typischer Weiße 20 Dots | + | |
+ | * **Panel** == 1 Object voll mit Dots; besteht aus: Dot-Matrix mit 16 Zeilen und 20 Spalten. Hat hinten noch die Treiberplatine dran. | ||
+ | * FIXME: Sollte man nicht lieber 16 Spalten × 20 Zeilen verwenden? Dann entspräche eine Modulzeile einem 16 Bit Wort, was auch die interne Aufteilung von üblichen Framebuffern entspricht. | ||
+ | * Treiberplatine == nimmt seriell Daten entgegen und gibt dieses Parallel auf die Dot-Matrix eines Moduls. | ||
+ | * Panelzeile == horizontal aggregierte Ansammlung von Dots, typischerweise 20 Dots | ||
+ | * Panelspalte == vertikal aggregierte Ansammlung von Dots, typischerweise 16 Dots | ||
+ | * Der Ursprung ist oben links (wenn man von vorne draufschaut) und mit X0Y0 beschriftet | ||
+ | * **Assembly** == Ein bis mehrere Panel sind zu einem größeren Aggregat zusammengebaut worden und haben eine gemeinsame Steuerungseinheit. Im Club stehen drei Assemblys im Schaufenster rum. | ||
+ | * **Display** == Ein Display besteht aus einer bis mehreren Assemblies und ist für den Betrachter eine zusammenhängende Installation. Z.B. die drei Assemblies im Clubschaufenster, | ||
+ | * **Window** == Ein rechteckiger Bereich in einem Display. Diese Bereiche können als Resource an verschiedene Teilnehmer vergeben werden die darauf schreiben dürfen. | ||
- | Wir haben eine Flipdotmatrix. | + | **ACHTUNG**: |
- | * 198 schwarze und 4 blaue Module | ||
- | * 2 der schwarzen Module sind noch den Ingolstädtern designated! | ||
- | ====== | + | == Displays |
+ | |||
+ | Wir haben aktuell folgende Flipdot-Displays: | ||
+ | |||
+ | ^ ^ Anzahl | ||
+ | | Mini | 2 | Zeigt den Clubstatus an, kann (offiziell? | ||
+ | | Zeile | ||
+ | | [[wand|Schaufenster / Wand]] | ||
+ | | [[mobil|Mobil / Demo]] | ||
+ | |||
+ | === Zeile | ||
+ | |||
+ | 176x20 Pixel. | ||
+ | |||
+ | Es gibt mehrere Möglichkeiten die Zeile anzusprechen: | ||
+ | - UDP: Wie alle Displays beherrscht auch die Zeile ein triviales UDP-Protokoll: | ||
+ | - In #ccc auf darkfasel: Alle Posts, die " | ||
+ | - < | ||
+ | |||
+ | === Bildformat | ||
+ | Es muss ein animiertes 144x120 gif sein mit einem delay auf dem frame. am besten sowas wie 600 sekunden oder so | ||
+ | |||
+ | Schwarz-weiss: | ||
+ | |||
+ | Bug: Aktuell scheinen die linkesten 16 pixel am rechten Rand angezeigt zu werden. | ||
+ | |||
+ | Workaround: '' | ||
+ | |||
+ | einfach per ssh das gif in ~/ | ||
+ | |||
+ | === Schaufenster / Wand | ||
+ | |||
+ | Das Fenster ist ca. 210x215cm – damit braucht es dann 7x9, also 63 Panele. | ||
+ | |||
+ | Web-UI: http:// | ||
+ | == Change Log | ||
+ | |||
+ | * **2013-10-20**: | ||
+ | {{gallery>? | ||
+ | IPs: | ||
+ | links 2001: | ||
+ | mitte 2001: | ||
+ | rechts 2001: | ||
+ | |||
+ | * **2013-10-19**: | ||
+ | * **2013-10-14**: | ||
+ | |||
+ | {{gallery>? | ||
+ | |||
+ | * **2013-09-30**: | ||
+ | * **2013-09-2x**: | ||
+ | * **2013-09-07**: | ||
+ | * Kernel-Anpassungen nötig, daher erstmal Aufsetzen eines Cross-Build-Environments für RPi Kernel: [[http:// | ||
+ | * Wir nehmen als Basis [[https:// | ||
+ | * Fnord! Fork: [[https:// | ||
+ | * Um den gpio-max7301 GPIO Device Treiber zu benutzen, muss man entweder Platform Code ändern/ | ||
+ | * Wir machen Platform Code, weil DT neuen Bootloader und damit mehr Fnord erfordert hätte [[https:// | ||
+ | * Der RPi GPIO Treiber bcm2708_gpio ist kaputt, man kann nicht mehrere GPIO Devices haben... | ||
+ | * Fix: [[https:// | ||
+ | * **TODO**: Der RPi SPI Treiber spi-bcm2708 ist, diplomatisch ausgedrückt, | ||
+ | * Der MAX7301 kann eigentlich nur 16 Bit pro Word, testweise auf 8 Bit runter (wegen Schieberegister), | ||
+ | * Der BCM2708 kann erstmal nur 8 Bit pro Word, oder mehr wenn man DMA benutzt, der Treiber kann weder DMA noch mit anderen Wordsizes umgehen | ||
+ | * **TODO**: Evaluation [[https:// | ||
+ | * Wir brauchen einen Logic Analyzer (es sollen diverse im Club sein, aber keinen gefunden), da total unklar ist was auf dem SPI Bus wirklich passiert | ||
+ | |||
+ | * **2013-09-0x**: | ||
+ | |||
+ | * **2013-06-14**: | ||
+ | * Ziel: Streaming eines (virtuellen) Framebuffers | ||
+ | |||
+ | |||
+ | |||
+ | == Steuerplatine | ||
* 10 8-Stufe Schieberegister (80 bit) [[http:// | * 10 8-Stufe Schieberegister (80 bit) [[http:// | ||
* Aufgeteilt in row + column register | * Aufgeteilt in row + column register | ||
Line 42: | Line 121: | ||
* FIXME: Wo kommt die Zahl her, gilt das für ein Modul, also eine Steuerplatine? | * FIXME: Wo kommt die Zahl her, gilt das für ein Modul, also eine Steuerplatine? | ||
- | ===== Pinbelegung | + | == Pinbelegung |
Thx an x5444 von den Ingolstädern für das PIN-Layout! | Thx an x5444 von den Ingolstädern für das PIN-Layout! | ||
- | row == 20px (effektiv werden beim chainen noch 4px fnord mitgeschickt) | + | Das row register ist 24px lang. (effektiv werden beim chainen noch 4px fnord mitgeschickt) |
- | col == 16px | + | Das col register is 16px lang. |
+ | |||
+ | ^ 1 | ?1 ^ 2 | GND | | ||
+ | ^ 3 | ROW_DATA | ||
+ | ^ 5 | STROBE | ||
+ | ^ 7 | WHITE_OE | ||
+ | ^ 9 | BLACK_OE | ||
+ | ^ 11 | COL_CLOCK ^ 12 | GND | | ||
+ | ^ 13 | ROW_CLOCK ^ 14 | GND | | ||
+ | ^ 15 | COL_DATA | ||
+ | ^ 17 | DO ^ 18 | GND | | ||
+ | ^ 19 | ?1 ^ 20 | ?2 | | ||
+ | |||
+ | * ?1 == durchverbunden, | ||
+ | * DO == Ausgang des zweiten nichtinvertierten Schieberegisters für die Spalten auf der input Seite bei Kaskadierung von Modulen | ||
+ | * ?2 == ind ein wenig komisch, die sind jeweils ein bestimmter pegel (hab ich grad nicht im kopf) sobald an einer der steuerplatinen in der kette die matrix die tatsächliche display-einheit verbunden ist | ||
+ | |||
+ | |||
+ | == Historie | ||
+ | |||
+ | Ursprünglicher Standort über der A9 bei Fröttmaning: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Wir haben 198 schwarze und 4 blaue Panels mit je 20x16 Pixeln | ||
+ | |||
+ | Bisher wurden nur die schwarzen verbaut. | ||
- | ^ 1 | ?1 ^ 11 | ?2 | | + | Davon stecken insgesamt |
- | ^ 2 | ROW_DATA | + | |
- | ^ 3 | STROBE | + | |
- | ^ 4 | OE1 ^ 14 | GND | | + | |
- | ^ 5 | OE2 ^ 15 | GND | | + | |
- | ^ 6 | COL_CLOCK ^ 16 | GND | | + | |
- | ^ 7 | ROW_CLOCK ^ 17 | GND | | + | |
- | ^ 8 | COL_DATA | + | |
- | ^ 9 | DO ^ 19 | GND | | + | |
- | ^ 10 | ?2 ^ 20 | GND | | + | |
- | ?1 == durchverbunden, | + | === Verteilung |
- | DO == Ausgang des zweiten nichtinvertierten Schieberegisters für die Spalten auf der input Seite bei Kaskadierung von Modulen | + | |
- | ?2 == ind ein wenig komisch, die sind jeweils ein bestimmter pegel (hab ich grad nicht im kopf) sobald an einer der steuerplatinen in der kette die matrix die tatsächliche display-einheit verbunden ist | + | |
+ | 70 Vergeben: | ||
+ | * 4 x bei den Ingolstädtern; | ||
+ | * 1 x bei Karsten (Student-Robotics-Student von lila) | ||
+ | * 6 x Hannover, Mcfly (gewannen eine Wild Demo Compo: http:// | ||
+ | * 2 x Hamburg, Mcfly, Attraktor | ||
+ | * 1 × datenwolf | ||
+ | * 6 x Metalab Wien, overflo https:// | ||
+ | * 8 x Dortmund, Eimann | ||
+ | * 3 x Karlsruhe | ||
+ | * 3 x Darmstadt, bios | ||
+ | * 6 x ccc Köln | ||
+ | * 4 x AFRA - Abteilung-für-Redundanz-Abteilung (Martin weis mehr) | ||
+ | * 2 x Tausch gegen neuen Münzer Matemat (Bekommt noch 2, Martin weis mehr) | ||
+ | * 4 x + 1 Steuerplatine normal für OpenLab Hackspace/ | ||
+ | * im Tausch gegen Datenhandschuh und Geekend | ||
+ | * 2014-01-14: Haben über krobin ein Ersatzteilmodul bekommen. Pixel waren kaum noch drauf, aber Spulen und Transistoren. | ||
+ | * 6 x Southampton(UK) + fuer SoMakeIt/ | ||
+ | * 3 x Chaostreff Salzburg via ahuemer. Geplante Projekte: Julia Mengen Betrachter, Mate Counter für das baldig kommende Geekend bei uns. | ||
+ | * 2? x foobar Essen via gammlaa | ||
+ | * 3 x [[http:// | ||
+ | * 2 x Hackerspace Budapest | ||
- | ====== Alles neu, unsere | + | am 31c3 rausgegeben von Gigo an ccczh |
+ | * 2 x [[https:// | ||
+ | * 2 x [[http:// | ||
+ | * 2 x [[http:// | ||
+ | * 2 x [[http:// | ||
- | ===== Vorschlag von luja ====== | + | === Requests |
- | Man nimmt ein kleines FPGA, und etwas RAM(z.B. im FPGA enthalten) und hat einen Prozess, | + | |
- | der die Daten zu den Schieberegistern schreibt. Der Pin9 sollte zum Prueflesen benutzt werden. | + | |
- | Nun teilen wir den RAM in 2 Bildschirmspeicher ein: | + | |
- | Einer der Speicher wird angezeigt, und der andere kann geladen werden. | + | |
- | Ein Toggle-Bit im config-Register des FPGA schaltet zwischen Bildschirmspeicher und Vorbereitungs- | + | |
- | Speicher um. Bei Flankenwechsel des Speicherschalt-Bits wird der Update-Prozess ausgeloest. | + | |
+ | Wir haben noch ca. 11 Panels zu vergeben, Hackerspaces werden bevorzugt. Die Plan-Spalte wird nur von Mitgliedern des Fliptdot-Vergabe-Kommitees geändert. | ||
- | Insgesamt kann man das Verhalten wie bei den grafikfaehigen Industrie-Displays LCD gestalten, sodass | + | ^ Angefragt |
- | man vorhandene Linux-Treiber | + | | 1 defektes | - | com ]aet[ flipdot.org |
+ | | 2 | 1 | Attraktor Hamburg via mc.fly | ||
+ | | 4 | 2 | [[https:// | ||
+ | | 1 oder 2 | 0 | Philip Dusl | Abholen @ muCCC | ||
+ | | 4 | 2 | [[http:// | ||
+ | | | 2 | www.hackerspace-bielefeld.de | ||
+ | | 2 | | [[http:// | ||
+ | | 2-4 | | daniel domscheit-berg / havel: | ||
+ | | 4 | | FabLab Nürnberg: charlie ]ät[ fabfolk ]dod[ com | Abholung, Uebergabe auf Veranstaltung, | ||
+ | ^ ^ ~~=sum(range(1, | ||
- | Von der Ansteuerungsseite aus wird man z.B. 2 Addressen sehen, mit 8bit breiten Daten. | ||
- | Addresse0 ist das Daten-Transferregister. | ||
- | Adresse 1 ist config register: | ||
- | Beschreibung: | + | Sonstige |
+ | * 1 x Marian Kleineberg -> Jan kümmert sich | ||
- | Wenn error-flag gesetzt, bringt ein read vom | ||
- | dataport den errorcode | ||
- | wenn error-flag nicht gesetzt, bringt read vom | ||
- | data port, den zuletzt mit addresse selektierten | ||
- | ram_inhalt. | ||
- | Man kann im Config-Register 2 Register unterbringen, | + | == Archiv |
- | wenn Register nur lesbar oder nur schreibbar sind, wird | + | |
- | je nach richtung das Register selektiert. | + | |
+ | * [[https:// | ||
- | Also haben wir eine Address-Select-Leitung | ||
- | und eine 8-bit-Datenleitung fuer den hackerport | ||
- | Bedeutung der Kommandos: | ||
- | Config-Register: | ||
- | Bit0 invert: invertiert den bildschirmspeicher. Zusammen mit Redraw zum Blinken und Oelverteilen :-) /W 1=Invert | ||
- | BIT1 redraw: Schiebt den Bildschirmspeicher raus bei jedem uebergang 0->1 | ||
- | BIT2 speed: 0=slow, 1=fast, Speed fuer schieberegister /W | ||
- | BIT3 error_flag (irgend ein error ist da) /R error_clear /W | ||
- | BIT4 ADDRESS_STROBE fuer Addresse_Highbyte wird aus Inhalt, der im Register an Addresse 0 liegt, gesetzt | ||
- | BIT5 ADDRESS_STROBE fuer Communikations-Register an Addresse0 -> Addresse_Lowbyte wird aus Inhalt, der im Register an Addresse 0 liegt, gesetzt | ||
- | BIT6 DATA_STROBE fuer Communikations-Register an Addresse0 -> Daten werden in zuvor selektierte Addresse | ||
- | BIT7 TOGGLE_FRAMEBUFFER -> | ||
- | |||
- | Redraw: entweder 3xToggeln Bit 7 oder Bit1 toggeln, | ||
- | je nach Erfahrungen mit dem Schieberegisterkram. | ||
- | Wir koennen auch den Redraw unabhaengig vom Buffer-Select BIT7 | ||
- | machen, sodass man mit Bufferselect ein Redraw befehlen muss, wenn man rausschreiben will. | ||
- | So koennte man evtl. auch den Aktuellen Puffer manipulieren, | ||
- | Intelligente Ansteuerung nach "Was hat sich geaendert" | ||
- | Wenn ja koennte man die Elemente einzeln an das FPGA machen und so z.B. auch nur das sich geaenderte | ||
- | Element updaten. I/Os haben FPGAs genug :-) | ||
+ | == Live interaction at rc3 | ||
- | Rambedarf ist Pixelzahl zweimal | + | See the flipdot in our rc3.world assembly in the couch area or at [[https://webex.muc.ccc.de/rc3lounge|RC3 lounge]] via Jitsi. |
- | Mein Vorschlag waere ein kleines automotive-fpga von actel. | + | |
- | Als Bildspeicher: | + | |
- | Wenn ichs richtig hab: | + | |
- | 20*16*11*18 | + | |
- | 63360BIT*2 | + | |
- | rund 128Kbit, also 16KBYTE RAM, ein paar Addressleitungen und 8 bit datenleitung zum | + | |
- | FPGA und fertig. Wird auf nen 1-Lager passen. | + | |
- | Als RAM ein altes CAcHE-SRAM vom 586er oder 486er Mainboard, denn SRAM ist zahm in der Ansteuerung, | + | |
- | kein Refresh und so zeugs. Address/ | + | |
- | Asynchrones Reset und Clock versteht sich fuer das ganze Design von selbst. | + | You can send own pixel data to the flipdot using IPv6 (only! Still using legacy IP? Time to upgrade) UDP packets to the Host flip.y.nu port 2424. |
- | + | There are a few examples in our [[https:// | |
- | Takt mit beliebigem Quarz z.B. 14.xxx MHZ aus Bastelkiste/ISACLK aus altem Mainboard. | + | |
- | Wegen altem Mainboard, frueher TM war IDE nur ein per Puffer und Addressdekoder rausgefuehrter ISA-BUS! | + | For a quick start try out [[https:// |
- | Und das Zeugs ist aufwaertskompatibel. Man koennte das FPGA-Ding als " | + | |
- | denn IDE wird aehnlich addressiert:-) | + | |
- | + | ||
- | ich waere dafuer, dass man die beiden 8-bit Register (Config und Data) zusaetzlich ueber SPI zugreifbar macht, | + | |
- | einen SPI-Core von opencores.org nimmt, und so das Teil an irgendeinen OpenWRT-Router drandengeln kann, | + | |
- | und so ein web-interface hat, wo man SW-BMPs hochladen kann. | + | |
- | Ob man jetzt per Parallel-Port oder SPI drauf geht ist egal. SPI waere aber schon cool wegen Router-Recycling. | + | Unfortunately so far the animations won't stop when you send data (unlike our [[https:// |
- | Hab mal fuer ein MIL-Projekt SPI per LVDS angesteuert, | + | |
- | + | ||
- | Vorteil der FPGA-Loesung ist, dass das SW-Timing voellig egal ist, denn das FPGA kuemmert sich um das Geschiebe und das Timing | + | |
- | Theoretisch koennte man durch das Prueflesen des Schieberegisters bis zur Geschwindigkeitsgrenze der HW gehen. | + | |
- | Ich wuerde aber sagen, dass 2MHZ schiebe-Clock genug sind. Wir nehmen z.B. besagten 14MHZ-Quarz oder sonst was ab 10MHZ, | + | |
- | und teilen uns den Clock wie wir ihn brauchen. Evtl, im Configregister noch ein Flag fuer FAST/slow shift haben | + | |
- | (z.B. 2MHZ vs 500kHz) | + | |