Lumenati Hookup Guide
Example Using a Raspberry Pi 3
For this example, we'll be using a Raspberry Pi 3, a PCA9306 Level Translator Breakout, a 5V power supply and the Lumenati boards that we put together in the last section. The hookup will look like this:
You'll notice from the diagram that the Lumenati boards are powered directly from an external 5V power supply and not from the header on the Raspberry Pi. While it is possible to drive the circuit as constructed with the supplied demo code from the Pi header, the 5V that's available there is fused. Since it is difficult to predict how much current the Pi itself is going to draw at any given moment, driving the LEDs through the Pi as well can become problematic with increased LED count and increased brightness, risking a brown-out condition with increased current consumption. Circumvent that condition entirely by tapping 5V and ground on the power supply before it reaches the Pi.
The connections of interest are in the following table.
RasPi Pin # | Description | Goes to PCA9306 Pin |
---|---|---|
1 | 3.3V (for low-side level shifting reference) | VREF1 |
4 | 5V (for high-side level shifting reference) | VREF2 |
6 | GND (ground for level shifting reference) | GND |
19 | Data | SCL1 |
23 | Clock | SDA1 |
Astute readers will notice that we've connected a clock signal to what looks like a data channel and a data signal to what looks like a clock channel on the PCA9306, if the labels are to be believed. But here's a little secret about those channels: they're virtually identical, electrically speaking. While the labels may be incongruent, it made the wiring just slightly more uniform.
The connections from the PCA9306 Breakout to the Lumenati boards are thus:
PCA9306 Pin | Description | Lumenati Pin |
---|---|---|
SDA2 | Clock | CI |
SCL2 | Data | DI |
GND | GND (ground for level shifting reference) | GND |
We've put together some really simple python code for you to get started with. The first is a really simple library to set up an array with the LED parameters and write them to the Lumenati boards.
#Set up the SPI port on the Pi import spidev spi = spidev.SpiDev() spi.open(0,0) #Create LED array by sending this function num_LEDs def set_LED_quantity(num_LEDs): global NUM_LEDs NUM_LEDs = num_LEDs global LED_array LED_array = [[0,0,0,0]] * NUM_LEDs #Puts LED(num) parameters into LED_array #Red, Green and Blue (r,g,b) values must be between #0-255. Brightness must be between 0 and 31. def set_LED(num, r, g, b, brightness): if (brightness > 31) | (brightness < 0): brightness = 15 if (r > 255) | (r < 0): r = 100 if (g > 255) | (g < 0): g = 100 if (b > 255) | (b < 0): b = 100 LED_array[num] = [r, g, b, brightness | 0xE0] #These 4 bytes have to be written at the start and #end of each data frame when writing to the LEDs def _start_end_frame(): for x in range (4): spi.xfer2([0x00]) #Write data to the LEDs def WriteLEDs(): _start_end_frame() for LED in LED_array: r, g, b, brightness = LED spi.xfer2([brightness]) spi.xfer2([b]) spi.xfer2([g]) spi.xfer2([r]) _start_end_frame()
The second demonstrates the use of those functions and makes some pretty lights.
#This is demonstration code for the Lumenati line of APA102c boards, #specifically using (4) 90L boards surrounding one 8-pack board. import time from SFE_Lumenati import set_LED_quantity, WriteLEDs, set_LED #Set up array, 20 LEDs set_LED_quantity(20) #Delay duration wait = 0.15 #Global brightness brightness = 15 #range is 0-31 try: while True: for y in range (5): #center, white set_LED(0,25,25,25,brightness) #inner ring, red for x in range (7): set_LED(x+1,25,0,0,brightness) #outer ring, white for x in range (12): set_LED(x+8,25,25,25,brightness) #Write to the LEDs and wait WriteLEDs() time.sleep(wait) #center, red set_LED(0,25,0,0,brightness) #inner ring, white for x in range (7): set_LED(x+1,25,25,25,brightness) #outer ring, red for x in range (12): set_LED(x+8,25,0,0,brightness) #Write to the LEDs and wait WriteLEDs() time.sleep(wait) for y in range (5): #center, yellow set_LED(0,25,25,0,brightness) #inner ring, blue for x in range (7): set_LED(x+1,0,0,25,brightness) #outer ring, yellow for x in range (12): set_LED(x+8,25,25,0,brightness) #Write to the LEDs and wait WriteLEDs() time.sleep(wait) #center, blue set_LED(0,0,0,25,brightness) #inner ring, yellow for x in range (7): set_LED(x+1,25,25,0,brightness) #outer ring, blue for x in range (12): set_LED(x+8,0,0,25,brightness) #Write to the LEDs and wait WriteLEDs() time.sleep(wait) except KeyboardInterrupt: pass
Click here to get the code. Just drop the two files from SparkFun_Lumenati_Code/Firmware/RasPi into the same folder, and run Lumenati_Demo.py. If the stars align (and you've done everything right), the result should look as below.