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.

사이

버스 해적
Button pad

장난
장난

모곡
모곡

시계
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), 신호가 높을 때 (5volts) 이것은 대개 / cs, #cs 또는! CS로 표시됩니다. 대신, 단추 컨트롤러는 CS가 높을 때 활성화됩니다.

64BB의 트랜잭션 LED 색상을 설정하고 버튼 상태를 검색합니다. 첫 번째 16bytes는 각 LED에 대한 적색 레벨을 프로그래밍 한 다음 16byte의 녹색이고 16byte의 파란색 이옵니다. 보드에서 16bytes를 읽으려면 각 버튼의 상태를 가져옵니다. 버튼 데이터가 눌렀을 경우 0x00으로 전송하고 0xFF를 누르지 않으면 버튼 데이터가 전송됩니다. 데이터 시트는 색상 프레임을 작성하고 버튼 데이터를 읽는 동안 400us 지연을 권장하지만 버스 해적은 우리가 걱정하지 않을 정도로 느리게만큼 느려집니다.

프로토콜은 충분히 간단하지만 하나의 주요 캐치가 있습니다. CS를 올리기 전에 시계 라인이 높아야하며, 바이트 스트림은 1 비트 씩 꺼집니다. 이러한 이유로 많은 하드웨어 SPI 모듈이 보드에서 작동하지 않습니다. 마이크로 컨트롤러가 하드웨어 모듈에 의해 제어되는 트위블 핀을 사용할 수 있지만 우리가 작업 한 microsm은 이것을 허용하지 않으면 문제가되지 않습니다.

255 : 16 255 : 16 255 : 16 R : 16 [
시계, 1 <-clock은 CS를 올리 기 전에 높아야합니다. CS가 <-cs에서 5Volts, 정규 사용 벌크는 0xFF, 0x10 배 <-red LED를 씁니다 벌크는 0xFF, 0x10 번 <-green LED를 씁니다 벌크는 0xFF, 0x10 배 <-blue LED를 씁니다 대량 0x10 바이트 읽기 : <--read 버튼 상태 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff CS는 <-cs에서 0Volts, 정규 정상 사용 raw3wire>

이 명령은 각 LED의 모든 색상을 전체적으로 설정하고 16 버튼 상태 바이트를 다시 읽습니다.

우리는 먼저 시계 높이 (/)를 설정하며, 그런 다음 5Volts (])로 CS를 올리고 데이터 트랜잭션을 시작할 수 있습니다. 255 : 16은 값 255를 165 번 보내는 반복되는 명령입니다. 각 색상 채널에는 8 비트의 강도 제어가 있으므로 255는 100 % ON입니다. 우리는 각 LED 각 LED의 각 색상에 대해 한 번 255 번을 전송합니다. 마지막으로, 우리는 버튼 데이터 (R : 16)의 1 개의 16 바이트 프레임을 검색하고 CS 트랜잭션 ([)을 종료합니다. 버튼 값은 모두 0xFF이며 버튼을 누르지 않음을 나타냅니다.

raw3wire> /] 0:16 0:16 128 : 16 R : 16 [
시계, 1.
CS 장애인
벌크는 0x00, 0x10 시간을 씁니다
벌크는 0x00, 0x10 시간을 씁니다
대량 쓰기 0x80, 0x10 배 <- 모두 50 % 대량 읽기 0x10 바이트 : 0x00 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff CS가 활성화되었습니다 raw3wire>

여기에서 우리는 모든 LED의 파란색 수준을 50 % (128)로 설정하고 다른 모든 색상을 끕니다. 버튼 출력은 이제 버튼 0을 눌렀습니다.

raw3wire> /] 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0:16 0:16 R : 16 [
시계, 1.
CS 장애인
쓰기 : 0x00 <- 빨간색 LED 0, OFF ... <- 같은 쓰기 : 0x00 <- 빨간색 LED 3, OFF 쓰기 : 0xFF <- 빨간색 LED 4, 100 % 쓰기 : 0xFF <- 빨간색 LED 5, 100 % 쓰기 : 0xFF <- 레드 LED 6, 100 % 쓰기 : 0xFF <- 빨간색 LED 7, 100 % 쓰기 : 0x00 <- 레드 LED 8, OFF ... <- 같은 쓰기 : 0x00 <- 빨간색 LED 15, OFF 벌크 쓰기 0x00, 0x10 배 <- 모든 녹색 LED가 꺼짐 대량 쓰기 0x00, 0x10 배 <- 모든 파란색 LED가 꺼집니다. 벌크는 0x10 바이트를 읽습니다. <-read 버튼 상태 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff CS가 활성화되었습니다 raw3wire>

이 예에서는 단일 LED를 해결하는 방법을 보여줍니다. 이번에는 실제로 붉은 색 프레임의 16 바이트를 모두 쓸 수 있습니다. 버튼 0-3 및 8-15는 0 (적색 꺼짐)의 적색 값이 있으며 버튼 4-7은 100 % 빨간색으로 설정됩니다 (255). 모든 녹색과 파란색 LED가 꺼져 있습니다 (0, 0 %).

결론

데이터 시트의 첫 번째 버전이 너무 많은 오류가 있었기 때문에이 보드를 작동시키는 것은 정말로 실망 스럽습니다. Sparkfun의 엔지니어와 지원은 정말로 도움이되었으며 일일 내에 수정 된 데이터 시트를 게시했습니다. 업데이트 된 데이터 시트가있는 한, 이것은 작업을위한 쉬운 보드입니다.

우리는 CS를 올리기 전에 시계 신호를 높게 유지할 필요가없는 펌웨어 업데이트를보고 싶습니다. 이 덕크로 인해 보드는 많은 하드웨어 SPI 모듈과 호환되지 않으므로 슬로우 비트 방 루틴을 유일한 인터페이스 옵션으로 남겨 둡니다. 다행히도 소스 코드가 열려 있으며이 변화를 원하는 사람이 사용할 수 있습니다.

버튼 패드 컨트롤러는 정말 깔끔한 보드이며 미래의 프로젝트에서 그것을 사용하기를 기대합니다.

하루 검토 공개 : 우리는 무료 보드를 요청했으며 Sparkfun이 그것을 우리에게 보냈습니다. 우리는 Datasheet의 첫 번째 버전의 지침에 따라 일하기 위해 끔찍한 시간을 보냈습니다. 여기에서 경험을 문서화했습니다.

Leave a Reply