PARTS: 4×4 RGB button PAD CONTROLLER SPI

We covered SparkFun’s new RGB button pad controller a few weeks ago. This is a full-color clone of the monome interface; a 4×4 grid of buttons with tri-color LEDs underneath. Each LED has 24bits of color control, for more than 16million color combinations. up to 10 panels can be chained together to create substantial button grids, like SparkFun’s Tetris table. We previously used a smaller version in our RGB combination lock.

We asked SparkFun to send us the SPI version of the button controller to test. This is a new product developed in-house at SparkFun, with open source hardware and software. read about our experience interfacing this board below.

4×4 RGB button pad controller SPI (SparkFun #WIG-09022, $39.95)

The button pad controller is a bare PCB, we also received a button pad cover (SparkFun #COM-07835, $9.95), and two of each bezel (SparkFun #COM-08747, #COM-08746, $3.95).  The SPI version we’re working with can be driven directly by a microcontroller, or by a USB ‘master’. The USB controller version has an additional microcontroller and FTDI USB->serial converter for PC connectivity.

When the button pad arrived, we right away sat down with the datasheet and tried to interface the board with our Bus Pirate universal serial interface. The protocol described in version 1 of the datasheet didn’t work, at all.

SparkFun open sourced this project, so we determined the correct interface protocol from the source code for the button pad SPI (ZIP) and the button pad USB controller (ZIP). We figured out most of the protocol from the source, but it still took help from SparkFun’s engineers to uncover some of the undocumented, finer points of interfacing the board. version 2 of the datasheet (PDF) accurately depicts the interface protocol.

Connections

Pirata dell’autobus
Button pad

MISO
MISO

Mosi
Mosi

Orologio
Sck.

Cs.
Cs.

+5volts
VCC

Gnd.
Gnd.

The button pad’s SPI signals are described as they relate to the on-board microcontroller, which is opposite the usual notation. The MOSI (master out, slave in) signal is actually the board’s data output, and MISO (master in, slave out) is the data input.

We tested the button pad with the Bus Pirate, but the same basic principals apply to any custom microcontroller code. The board runs at 5volts, so we powered it from the Bus Pirate’s on-board 5volt power supply. The SPI interface operates at 5volt logic levels, so we connected the Bus Pirate’s pull-up resistors to the 5volt power supply and enabled them on all signal lines.

We interfaced the button board using the Bus Pirate’s raw3wire library. Raw3wire is a software SPI library with bit-wise operations. The hardware SPI library only allows full byte operations which aren’t granular enough to interface the board. We put the Bus Pirate in raw3wire mode (menu option M), and chose the HiZ pin option because the pull-up resistors will hold the bus at 5volts.

RAW3WIRE>l <–configure bit order 1. MSB first 2. LSB first MODE>2 <–least significant bit first LSB SET: least SIG bit FIRST RAW3WIRE>W <–enable power supply VOLTAGE supplies ON Raw3wire >.

The button pad communicates least significant bit first, so we also configured the library to communicate LSB first. Finally, we hit capital ‘W’ to enable the Bus Pirate’s power supplies. The button board will flash each color momentarily as part of its power-on self-test.

Single/multiple button board setup

Each board needs to be configured for single or multi-board use. Boards come pre-programmed for single-board operation, but it might be a good idea to set the configuration anyways. The board configuration is permanently stored in EEPROM, so it only has to be done once.

RAW3WIRE>[\_ <–take all signals low CS enabled <–CS enabled is 0volts CLOCK, 0 DATA OUTPUT, 0 Raw3wire >.

A special sequence places the board in configuration mode. begin with all signal lines low (]\_).

RAW3WIRE>-^ 1 1 <–set single board operation DATA OUTPUT, 1 <–data high 0x01 CLOCK TICKS <–one clock tick WRITE: 0x01 <–config option 1, number of boards WRITE: 0x01 <–set the number of boards RAW3WIRE>w <–small ‘w’, power off VOLTAGE supplies OFF RAW3WIRE>W <–capital ‘W’, power on VOLTAGE supplies ON Raw3wire >.

To enter configuration mode, take the data line high (-) and send one clock pulse (^), but leave chip select low. The board is now ready to accept configuration settings.

The first byte sent after entering configuration mode tells the board which setting to modify. Currently, only the number of boards can be configured (0x01). Next, send the number of connected boards, between 1 and 10. we sent 1 because we’re interfacing a single board. Reset the board and it will light a LED corresponding to the programmed number of boards.

Set colors and read button status

Now we’re ready to send color data to the board and read the button status. First, note that the CS (chip select) signal is opposite normal conventions. usually CS activates a chip when the signal is low (0volts), e inattivo quando il segnale è alto (5volts); Questo di solito è denotato da / cs, #cs o! cs. Invece, il controller del pulsante è attivo quando CS è alto.

Una transazione 64Byte imposta i colori LED e recupera lo stato del pulsante. I primi 16bytes programano il livello rosso per ciascun LED, seguito da 16bytes di verde e 16bytes di blu. Finitura leggendo 16Bytes dal tabellone per ottenere lo stato di ciascun pulsante. I dati dei pulsanti vengono inviati come 0x00 se premuto, e 0xFF se non premuto. La scheda tecnica raccomanda un ritardo di 400US tra la scrittura dei fotogrammi di colore e leggere i dati dei pulsanti, ma il pirata del bus è abbastanza lento che non ci preoccuperemo.

Il protocollo è abbastanza semplice, ma c’è una presa principale. La linea di clock deve essere alta prima di aumentare la CS, o il byTestream sarà spento da 1 bit. Per questo motivo, molti moduli SPI hardware non funzioneranno con la scheda. Questo non è un problema se il tuo microcontroller ti consente di sminuzzare i perni controllati da un modulo hardware, ma il microvulga che abbiamo lavorato con non consentire questo.

Raw3Wire> /] 255: 16 255: 16 255: 16 R: 16 [
Orologio, 1 <-Clock deve essere alto prima di sollevare CS Cs disabilitato <-cs a 5volts, uso normale opposto Bulk Scrivi 0xFF, 0x10 times <-red LEDs Bulk scrivere 0xFF, 0x10 volte <-Green LED Bulk Scrivi 0xFF, 0x10 volte <-Blue LED Bulk Leggi 0x10 Bytes: <-lead Button State 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff CS Abilitato <-CS a 0volts, opposto all'uso normale Raw3wire >.

Questo comando imposta ogni colore di ciascun LED per intero e legge i byte di stato dei 16 pulsanti.

PRIMO SETTATO PROMONORE ALTO OROLOGIO (/), E SOLO Quindi possiamo aumentare CS a 5Volts (]) e iniziare la transazione dei dati. 255: 16 è un comando ripetuto che invia il valore 255 sedici volte. Poiché ogni canale colore ha 8 bit di controllo dell’intensità, 255 è acceso al 100%. Inviamo 255 un totale di 48 volte, una volta per ogni colore di ciascun LED. Infine, recupereremo un frame 16Byte di dati del pulsante (R: 16) e inferiore CS per terminare la transazione ([). I valori dei pulsanti sono tutti 0xFF, indicando che non vengono premuti pulsanti.

Raw3Wire> /] 0:16 0:16 128: 16 R: 16 [
Orologio, 1.
CS Disabilitato
Bulk Scrivi 0x00, 0x10 volte
Bulk Scrivi 0x00, 0x10 volte
Bulk Scrivi 0x80, 0x10 volte <-All Blu al 50% Bulk Leggi 0x10 Bytes: 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff CS abilitato Raw3wire >.

Qui, abbiamo impostato il livello blu di ogni LED al 50% (128) e spegne tutti gli altri colori. L’uscita del pulsante ora mostra che il pulsante 0 è premuto.

Raw3Wire> /] 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0:16 0:16 R: 16 [
Orologio, 1.
CS Disabilitato
Scrivi: 0x00 <- Red LED 0, disattivato ... <-more dello stesso Scrivi: 0x00 <- Red LED 3, disattivato Scrivi: 0xFF <- Red LED 4, 100% su Scrivi: 0xFF <- Red LED 5, 100% su Scrivi: 0xFF <- rosso LED 6, 100% su Scrivi: 0xFF <- Red LED 7, 100% su Scrivi: 0x00 <- Red LED 8, disattivato ... <-more dello stesso Scrivi: 0x00 <- Red LED 15, disattivato Bulk Scrivi 0x00, 0x10 volte <- Tutti i LED verdi OFF Bulk Scrivi 0x00, 0x10 volte <-Tutti i LED blu Bulk Leggi 0x10 Bytes: <-lead Button Status 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff CS abilitato Raw3wire >.

Questo esempio mostra come affrontare i singoli LED. Questa volta scriviamo effettivamente tutti i 16 byte del telaio del colore rosso. Pulsanti 0-3 e 8-15 hanno un valore rosso di 0 (rosso spento), i pulsanti 4-7 sono impostati sul 100% rosso (255). Tutti i LED verdi e blu sono spenti (0, 0%).

Conclusione

È stato davvero frustrante ottenere questa tavola funzionante perché la prima versione del foglio di dati ha avuto così tanti errori. Gli ingegneri e il supporto di Sparkfun sono stati davvero utili e ha pubblicato un foglio di dati corretto in pochi giorni. Finché hai la scheda tecnica aggiornata, questa è una tavola facile da lavorare.

Vorremmo vedere un aggiornamento del firmware che elimina la necessità di mantenere alto il segnale dell’orologio prima di aumentare la CS. Questo quirk rende la scheda incompatibile con molti moduli SPI hardware, lasciando le routine lenti bit-bang come l’unica opzione di interfaccia. Fortunatamente, il codice sorgente è aperto e disponibile per chiunque voglia fare questo cambiamento.

Il controller Pad Button è un bordo davvero pulito e non vediamo l’ora di usarlo in un progetto futuro.

Hack A Day Review Divulgation: Abbiamo chiesto una pensione gratuita e una scintilla inviata a noi. Abbiamo avuto un tempo terribile che lo facevamo per lavorare con le istruzioni nella prima versione della scheda tecnica, abbiamo documentato quell’esperienza qui.

Leave a Reply

Your email address will not be published. Required fields are marked *