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
Bus Pirate
Button pad
MISO
MISO
MOSI
MOSI
Ceas
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 (0voluri) și itles IT atunci când semnalul este ridicat (5volți); Acesta este, de obicei, notat de / cs, #cs, sau! cs. În schimb, controlerul butonului este activ când CS este ridicat.
O tranzacție 64byte stabilește culorile LED și recuperează starea butonului. Primul program de 16byte Nivelul roșu pentru fiecare LED, urmat de 16bute de verde și 16byte de albastru. Finalizați prin citirea 16bytes de la bord pentru a obține starea fiecărui buton. Butoanele Datele sunt trimise ca 0x00 dacă sunt apăsate și 0xFF dacă nu sunt apăsate. Datasheetul recomandă o întârziere de 400 de ani între scrierea cadrelor de culoare și citirea datelor butonului, dar pirat de autobuz este suficient de lent încât nu ne vom îngriji de asta.
Protocolul este suficient de simplu, dar există o captură majoră. Linia de ceas trebuie să fie ridicată înainte de ridicarea CS, sau bytestreamul va fi oprit cu 1 bit. Din acest motiv, multe module Hardware SPI nu vor funcționa cu bordul. Aceasta nu este o problemă dacă microcontrolerul vă permite să vă controlați știfturii care sunt controlate de un modul hardware, dar microfonul pe care l-am colaborat nu permite acest lucru.
Raw3Wire> /] 255: 16 255: 16 255: 16 R: 16
Ceasul, 1 <-Clock trebuie să fie ridicat înainte de ridicarea CS
CS dezactivat <-CS la 5Volts, opusă utilizării normale
Bulk Scrie 0xFF, 0x10 ori <-Red LED-uri
Bulk scrie 0xff, 0x10 ori <-Green LED-uri
Bulk Scrie 0xff, 0x10 ori <-Blue LED-uri
Bulk Citește 0x10 Bytes:
Această comandă stabilește fiecare culoare a fiecărui LED la FULL și citește returnarea octeților de stare de 16 butoane.
Mai întâi am stabilit ceasul înalt (/), și numai atunci putem ridica CS la 5Volts (]) și începem tranzacția de date. 255: 16 este o comandă repetată care trimite valoarea de 255 de șase ori. Deoarece fiecare canal de culoare are 8 ani de control de intensitate, 255 este de 100%. Trimitem 255 un total de 48 de ori, o dată pentru fiecare culoare a fiecărui LED. În cele din urmă, preluăm un cadru 16byte de date de buton (R: 16) și scăderea CS pentru a termina tranzacția ([). Valorile butonului sunt toate 0xFF, indicând faptul că nu sunt apăsate butoane.
Brut3wire> /] 0:16 0:16 128: 16 R: 16 [
Ceas, 1.
CS dezactivat
Bulk scrie 0x00, 0x10 ori
Bulk scrie 0x00, 0x10 ori
Bulk scrie 0x80, 0x10 ori <-all albastru la 50%
Citirea în vrac 0x10 octeți:
0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
CS activat
Brut3wire>
Aici, am stabilit nivelul albastru al fiecărui LED la 50% (128) și dezactivează toate celelalte culori. Ieșirea butonului arată acum că butonul 0 este apăsat.
Brut3wire> /] 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0:16 0:16 R: 16 [
Ceas, 1.
CS dezactivat
Scrieți: 0x00 <- LED roșu 0, oprit
...
Acest exemplu arată modul de abordare a LED-urilor unice. De data aceasta scriem de fapt toți cei 16 octeți ai cadrului de culoare roșie. Butoanele 0-3 și 8-15 au o valoare roșie de 0 (roșu oprit), butoanele 4-7 sunt setate la 100% roșu (255). Toate LED-urile verzi și albastre sunt oprite (0, 0%).
Concluzie
A fost într-adevăr frustrant să obțineți acest bord care lucrează deoarece prima versiune a tehnicii a avut atât de multe erori. Inginerii și sprijinul lui Sparkfun au fost foarte utile și au postat o foaie de date corectată în câteva zile. Atâta timp cât aveți fișa tehnică actualizată, aceasta este o placă ușoară cu care să lucrați.
Am dori să vedem o actualizare a firmware-ului care elimină necesitatea de a menține semnalul de ceas înalt înainte de creșterea CS. Acest QUIRK face ca placa să fie incompatibilă cu multe module spi hardware, lăsând rutine lente de bit-bang ca singura opțiune de interfață. Din fericire, codul sursă este deschis și disponibil pentru oricine dorește să facă această schimbare.
Butonul Pad Controller este o bord cu adevărat îngrijită și așteptăm cu nerăbdare să o folosim într-un proiect viitor.
Hack o descriere a zilei de reexaminare: Am cerut o placă gratuită și Sparkfun ne-a trimis-o. Am avut un timp teribil să-l obții să lucreze cu instrucțiunile din prima versiune a tehnicii, am documentat acea experiență aici.