15 Etherled is remote controlled, programable stroboscopic image projector using
16 an 8051-family microcontroller.
18 The image is projected based in the eye delay to recognize the light. It
19 *draws* a *virtual* led matrix using a single led column, which shows each
20 column of the matrix at the time with a relative high frequency, fast enough to
21 make it look like a blinking column of leds when it's still. When the viewer
22 moves his sight away from the leds column, the image is suddenly projected.
24 It has a simple image editor that can send and receive images (pixel matrix)
25 from the device using a compact binary protocol (called ELP, Etherled Protocol)
26 over a small and simplified ethernet/IP/UDP stack.
28 There are some :doc:`photos` available. There is more detailed documentation
29 in the `doc repository directory`__, but it's all in spanish (unfortunately if
30 you don't speak the language).
32 __ https://git.llucax.com.ar/w/z.facultad/66.09/etherled.git/tree/HEAD:/doc
38 The main hardware components are an AT89S8252__ microcontroller, a column of
39 8 leds , a latch and an ISA NE2000__ compatible ethernet adapter.
41 __ http://www.atmel.com/dyn/products/Product_card.asp?part_id=1920
42 __ http://en.wikipedia.org/wiki/NE2000
49 The firmware is divided in 2 modules: networking and led projection.
51 The networking module runs in the *main thread*, while the led projection is
52 interrupt-driven (using a timer to trigger the interruption).
58 The led projection is simple: when the timer expires, the next column is
59 *printed* using the leds. The *next column* is calculated using modulo number
60 of columns so when the matrix it's fully printed, it starts again from the
63 This module is written in assembly.
69 This module is more complex and it runs as the *main thread* of the firmware,
70 in an infinite loop that polls the network adapter to see if a new frame
71 arrived (we had problems using interrupts for this too, which is the ideal).
72 When a new frame arrives, it's parsed to see if it's an ARP or IP packet. If
73 it's ARP, it's answered with the device IP. If it's IP, it's parsed to see if
74 it's UDP. If it is, it's parsed again to see if it's a valid ELP packet, and
75 if it is, the *get* or *set* action is performed. If any of the parsing fails
76 or other type of packet is detected, it's dropped silently.
78 A simple locking mechanism was used to prevent the matrix to advance to the
79 next column when the column is being set (to avoid the projection of an
80 inconsistent image). The lock was simple, stop the timer while writing the new
83 This module is written in C.
89 The NE2000 driver was based on uIP__ + `8051 integration project`__, but that
90 driver had a lot of bugs and was very poor so the driver was almost rewritten
91 to fix the bugs, make it modular, splitting the send, receive and buffer
92 management into different modules, and using the adapter buffers as external
93 memory to minimize the lack of RAM memory in the microcontroller. This
94 improvements were possible thanks to `similar project using a PIC`__ instead of
95 a microcontroller and the Linux__ DP8390 driver.
97 __ http://www.sics.se/~adam/uip/index.php/Main_Page
98 __ http://members.iinet.net.au/~vanluynm/#Downloads
99 __ http://elserver.forknet-ar.org/harpo/uch/seminario/
100 __ http://www.kernel.org/
107 There is a client application to create and edit images (as a led matrix) and
108 to store them in the device via network. Both CLI and GUI are provided. The CLI
109 can be used to set some other device parameters (like the refresh frequency) or
110 send commands to it (like turn of the leds).
112 This module is written in Python__ using PyGTK__ and SimpleGladeApp__.
114 __ http://www.python.org/
115 __ http://www.pygtk.org/
116 __ http://kefir.sourceforge.net/tepache/SimpleGladeApp.html
123 There are no releases for this project, but you can get the code from the Git_
124 repository__ (or a snapshot).
126 __ https://git.llucax.com.ar/w/facultad/66.09/etherled.git
130 .. _git: http://git.or.cz/
133 .. vim: set et sw=3 sts=3 tw=78 :