At Labman, we also spend time developing personal projects with the company’s support. One such project is a full RGB (Red-Green-Blue) laser show, capable of displaying vector-based text, static images, and ‘vector-frames’ animated displays, for example an analogue clock, a bird with flapping wings, or a rotating LABMAN logo. The laser show made its public appearance at our annual company summer party, Labfest, in August 2016, alongside an electronic test-your-strength machine and a robotic cocktail system.
First, the easiest bit - the ‘laser head’. We bought an off-the-shelf 900mW 25000 points-per-second RGB stage lighting laser projector. The 900mW is not split in equal proportions, and actually comprises of 400mW Red, 100mW Green, and 400mW Blue. This is to counter the fact that the ‘spectral response’ of the human eye is four times more sensitive to the green wavelength, compared to the red and blue.
The unit has an International Laser Display Association (ILDA) compliant 25-way D-connector interface on its rear. This connector ‘breaks out’ analogue signalling for controlling the projector’s X and Y high-speed galvanometer-mirrors (galvos). This moves the beam, the safety inputs, and also the signalling that ‘beam switches’ (turns on and off) the red, green and blue lasers. This means that the laser either ‘draws’ a visible line with the beam on, or an invisible ‘retrace line’ to move between vector points with the beam switched off.
Now, the harder bit! To keep the beam moving to form an image, the laser projector requires a continuous stream of X, Y & blanking analogue signals, updated in real time 25000 times a second. To do this, I built my own custom show-controller, which is connected to the ILDA port of the projector.
The show-card is based around two main parts: A Raspberry Pi 3B quad core Linux single-board-computer, with 7" touch screen (this is the brains behind it all - the ‘show controller’ board); and a propeller micro-controller-based output board (spits the signals out to the real world - the ILDA output card).
This Raspberry Pi board runs a multi-threaded Python/Tk application that handles the higher level Graphical User Interface to manage the laser show. It also handles the lower level playlist scheduling, reading of vector files, packing of the data for transmission, and streaming the packed data over a high-speed USB serial port. The final project is about 4300 lines of code, and imports roughly 20 inbuilt Python libraries.
The application is fully featured, and allows the user to ‘drag-and-drop’, create, edit, re-order playlists, load & save playlists to file, tool-tips for user guidance, and a host of other features that help to give the feel of standard media player software. Additionally, the software has a graphical window, which can be used for effect pre-preview before adding to a playlist, or for real-time mimicking of the projector output.
The Propeller is a more traditional stand-alone micro-controller which is programmed in ‘SPIN’ and Assembler. Unlike the Raspberry Pi, it doesn’t have an operating system, which makes it more suited to real-time, time-critical tasks.
This board handles communications flow and arbitration via the 2Mbps USB serial port, receiving and unpacking vector data packets sent from the Raspberry Pi via USB. It also buffers the vector data points to generate the continuous X, Y & RGB blanking signals, at a constant rate, and without interruption, to the laser projector.
For the analogue output stages, I used SPI Analogue-to-Digital convertors, with a 5V to +/- 12 DC-DC convertor for op-amp power, and a handful of op-amps, to make ‘correction amp’ stages. These convert the 0 to 3.3V single-ended D-to-A analogue to balanced differential analogue, compliant with ILDA specifications.
Of course the ILDA output card wouldn’t be complete without safety features. The board provides relay contact poles for the interlock inputs on the ILDA header to shut the beam off it power fails to the board, or if communication is lost, stalls or arbitration is lost. This is a ‘fail-safe’ which prevents the beam from being left on at a single point, which could be potentially hazardous.