Pairing your Raspberry Pi with an SPI OLED

OLEDs are interesting because they produce very crisp and brighter displays than is possible with the regular Liquid Crystal Displays. Being made of thin films of organic molecules, OLEDs use less power than conventional Light Emitting Diodes and LCDs. Driving OLEDs from your Raspberry Pi (RBPi) can be a great project to learn about these nifty solid-state displays and the processes that drive them.

Adafruit offers a lovely little monochrome SPI OLED module with a resolution of 128×32, driven by a SSD1306 driver chip. You can refer to excellent tutorials, libraries and guides on the website if you are driving this display from an Arduino. Although other OLED modules support I2C interface, this module supports only SPI, has pixel and text drawing functions, without any geometric drawing functions.

Although very small, only about 1-inch diagonal, the display is very readable because of the very high contrast of the OLED display. It has 128×32 individual white pixels, and the controller chip can turn each one of them on or off individually. No backlights are needed, as the OLED display produces its own light. This feature enhances the contrast and reduces the power consumption as well. The SSD1306 driver chip of the display communicates over the SPI bus, and requires four to five pins from the RBPi.

The OLED and its driver require a power supply voltage of 3.3V and logic levels of 3.3V for communication. If you are using this with the 5V supply of the RBPi, a 3.3V regulator should be used to power the display. On average, the display consumes about 20mA from the 3.3V supply, but this actually depends on how much of the display is lit. OLEDs usually require a high-voltage drive for the good contrast, but since this switched capacitor charge pump is already built-in into the display, this is one of the easiest OLED modules to interface.

Apart from the SPI specifications of the module, there is also a D/C pin, which controls the Data/Command going into the module. When you pull the D/C pin HIGH (connect it to VDD), the signals present at the pin are treated as data. When you pull it LOW (connect it to VSS), the signals present at the D/C pin are treated as command and are transferred to the command register.

What this essentially means is the opcode and the argument bytes that follow it are treated as a single command, even though this is a multi-byte command. For example, the command for setting the contrast control consists of a one-byte opcode followed by a one-byte contrast value. Therefore, the D/C pin has to be pulled LOW for the entire sequence when sending this command. Similarly, when sending image data, the D/C pin has to be pulled HIGH, which will enable the data to be moved into the image memory buffer.

The project is simplified when you use the following software – Occidentalis 0.2 for boot image, WiringPi-Python for accessing the GPIO pins and Py-Spidev for accessing the python bindings to the spidev Linux kernel driver. For further details, refer here.