Tuesday, December 14, 2010

Brmlab & Lasers!

I just got back to my home in Brazil yesterday. Travelling in Europe was great and I'd like to share here the details of some cool things I've done in my last week there.

My last stop in Europe was Prague and there was a special reason for that. Three months ago I received an email from Cestmir Houska, one of the members of Brmlab - the Prague hackerspace. Cestmir was contacting me because he got inspired by my photos and blogposts about the Party Land Remake project. He told me that building a pinball machine was one of his dreams from childhood (which happens to be my case also) and that he wanted to keep in contact so that we can help each other in making it become a reality.

Since we are both members of recently inaugurated hackerspaces we figured out that our pinball projects could be understood as a healthy collaboration between them, mutually. So we are planning to design, document and simultaneously build two pinball machines: one in Garoa Hacker Clube, in São Paulo, Brazil; and the other one in Brmlab, in Prague, Czech Republic.

In one of the days that I was there at Brmlab, one guy showed me his personal project: a homebrew laser projector. It is composed of 3 lasers (Red, Green and Blue) and a pair of mirrors that are rotated by motors so that the laser beam aims at the wall in different possible angles. By properly controlling those lasers and mirrors, one can draw colorful shapes on the wall. The effect is even more interesting if you add some fog to the room :-)

So I promptly asked him what software he was using to run the laser projector and the answer was: iShow, a proprietary software. I still inquired about free software implementations of drivers or controlling software but he was not aware of any existent efforts. So we decided to start doing that right away. We installed an USB sniffer on his Windows machine and started reverse engineering the protocol used by the device. In half an hour we had our first line drawn by sending URBs through a python script running on my GNU/Linux. Then we spent more 3 or 4 days improving the python module (all source code is in my personal svn repository at Google Code) and implementing some demos:

GML, SVG and ILDA

We wanted to display the Brmlab logo, so I decided to do that by implementing a simple SVG loader. It parses the SVG file and reads the d attribute of all tags. Then each path command from the SVG path description results in the respective drawing routines for our laser device.

The result can be seen in this photo:

Then I remembered GML! Grafitti Markup Language is an XML specification for storing grafitti data. That basically means x,y,z and time coordinates. I have used a python module called PyGML to render some GML files with our laser.

Another relevant data format is called ILDA. It is a file format for storing laser-show animations. It was developed by the International Laser Display Association (which explains the acronym ILDA). Using this python module we got some ILDA animations running on our projector :-)

A clock!

This is a simple analog clock displaying the current local time.

A pong game

Cestmir has implemented a pong game using the pygame library and rendering on the laser display.

When we decided to display scores in the game, we faced the challenge of creating a font for our laser display and font rendering routines. The first 3 charachteres (0, 1 and 2) were designed by imagining the shapes and manually inputing the values of the coordinates of the bezier control points for the glyphs. At that point we decided we should implement a tool... (more on that topic in a future blogpost)

A server for sharing the display

While we were working on this project it became clear that the laser was a scarce resource. We had 4 people hacking on it and it was starting to become common to hear the sentence "Can I use the laser now?" (same sentence I've heard a lot in Vienna a week earlier, but refering to a significantly different machine...).

It reminded me of stories about the early days in computing when people disputed CPU time in universities and research institutes computers. And then multi-user time-sharing systems were developed. So I decided to develop something analogous for our laser display: a server that collects rendering requests from clients and manages to merge them on the real device.

The server receives commands through telnet and manages individual double buffering for each connected user. When a user disconnects, only his/her portion of the drawing disappears from the screen. I also adapted our python module so that it would delegate rendering to a remote server when you pass an IP address to its contructor; otherwise it would render in a local device connected to the USB bus.

That way we could have several users rendering content to the display simultaneously. One possible use of that would be running a script that draws a clock all the time on a corner of the display screen. Here is an example of that (the clock script and another scipt drawing some bezier curves been run remotely by two different users simultaneously):