Parçalar: 4 × 4 RGB Düğme Pad Denetleyicisi SPI

Sparkfun’un yeni RGB düğme pedi kontrol cihazını birkaç hafta önce kapladık. Bu, monome arayüzünün tam renkli bir klonudır; Altında üç renkli LED’li bir 4 × 4 düğme ızgarası. Her LED, 16 milyondan fazla renk kombinasyonları için 24bit renk kontrolüne sahiptir. Sparkfun’un Tetris tablosu gibi önemli düğme ızgaraları oluşturmak için en fazla 10 panel zincirlenebilir. Daha önce RGB kombinasyon kilidimizde daha küçük bir sürüm kullandık.

Sparkfun’u bize test etmek için düğme denetleyicisinin SPI sürümünü göndermesini istedik. Bu, Sparkfun’da, açık kaynaklı donanım ve yazılımla birlikte geliştirilen yeni bir üründür. Bu tahtayı aşağıda arayüzleyen deneyimlerimizi okuyun.

4 × 4 RGB Düğme Pad Denetleyici SPI (Sparkfun # WIG-09022, $ 39.95)

Düğme ped denetleyicisi, çıplak bir PCB’dir, ayrıca bir düğme pedi kapağı (Sparkfun # COM-07835, 9.95 $) ve her bir çerçevenin ikisi de aldık (Sparkfun # COM-08747, # COM-08746, 3.95 $). Çalıştığımız SPI sürümü doğrudan bir mikrodenetleyici tarafından veya bir USB ‘usta’ tarafından sürülebilir. USB denetleyicisi sürümünde, PC bağlantısı için ek bir mikrodenetleyici ve FTDI USB-> Seri Converter’a sahiptir.

Düğme pedi geldiğinde, hemen uzağa veri sayfasıyla oturduk ve tahtayı otobüs korsanları evrensel seri arayüzümüzle arayüz sağlamaya çalıştık. Veri sayfasının 1. sürümünde açıklanan protokol, hiç çalışmadı.

SparkFun Açık Bu projeyi kaynaklı olarak, bu yüzden Düğme Pad SPI (ZIP) ve Düğme Pad USB Denetleyicisi (ZIP) için kaynak kodundan doğru arayüz protokolünü belirledik. Protokolün çoğunu kaynaktan bulduk, ancak Sparkfun’un mühendislerinden belgelenmemiş, ekin arayüzlenmesinin bir kısmını ortaya çıkarmak için hala yardım aldı. Veri Sayfasının (PDF) 2 sürümü, arayüz protokolünü doğru bir şekilde gösterir.

Bağlantılar

Otobüs korsanı
Düğme pedi

MİSO
MİSO

Musi
Musi

Saat
Skala

Cs
Cs

+ 5volts
Vcc

Gnd
Gnd

Düğme Ped’in SPI sinyalleri, her zamanki gösterimin karşısındaki yerleşik mikrodenetleyici ile ilgili olarak açıklanmaktadır. MOSI (Master Out, Slave In) sinyali aslında Kurulun veri çıkışıdır ve MISO (Master, In, Slave Out) veri girişidir.

Düğme pedini otobüs korsanıyla test ettik, ancak aynı temel müdürler herhangi bir özel mikrodenetleyici kodu için geçerlidir. Yönetim Kurulu 5volt’ta çalışıyor, bu yüzden buna otobüs Korsan’ın Board 5Volt güç kaynağından güçlendirdik. SPI arayüzü 5 volt mantık seviyesinde çalışır, bu yüzden otobüs korsanının çekme dirençlerini 5 volt güç kaynağına bağladık ve tüm sinyal hatlarında etkinleştirdik.

Otobüs Korsan’ın RAW3Wire Kütüphanesini kullanarak düğme kartını arayüztaş. RAW3Wire, Bit-Wise operasyonlarına sahip bir yazılım SPI kütüphanesidir. Donanım SPI kütüphanesi, tahtayı arayüz edecek kadar granül olmayan tam bayt işlemlerine izin verir. Otobüs korsanını RAW3Wire MODE (MENU seçeneği M) ‘de koyduk ve HIS PIN seçeneğini seçtiğimiz için, çekme dirençleri 5volt’ta veri yolu tutacak.

Raw3Wire> L <-Configure Bit Siparişi 1. Önce MSB 2. ilk lsb Mod> 2 <-Önce önemli bir bit LSB Set: Önce En Küçük Sig Bit Raw3Wire> W <-enable Güç Kaynağı Gerilim malzemeleri Raw3wire>

Düğme pedi ilk önce en az önemli bit iletişim kurar, bu yüzden ilk önce LSB’yi iletişim kurmak için kütüphaneyi de yapılandırdık. Son olarak, otobüs korsanının güç kaynaklarını etkinleştirmek için sermaye ‘W”u vurduk. Düğme kartı, her bir rengi anlık olarak açılış kendi kendini sınamasının bir parçası olarak yanıp sönecektir.

Tek / Çoklu Düğme Yönetim Kurulu Kurulumu

Her kartın tek veya çok pano kullanımı için yapılandırılması gerekir. Board’lar, tek kurulu operasyon için önceden programlanmıştır, ancak yapılandırmayı yine de ayarlamak iyi bir fikir olabilir. Kurul yapılandırması, EEPROM’da kalıcı olarak depolanır, bu yüzden sadece bir kez yapılmalıdır.

Raw3wire> [\ _ <-tüm sinyalleri düşük CS Etkin <-CS Enabled 0volts Saat 0 Veri çıkışı, 0 Raw3Wire>

Özel bir dizi, tahtayı yapılandırma moduna yerleştirir. Düşük (] \ _) tüm sinyal hatları ile başlayın.

RAW3WIRE> – ^ 1 1 <-TEK KURULU Operasyonu Veri çıkışı, 1 <-Data yüksek 0x01 saat keneler <-one saat kene Yaz: 0x01 <-config Seçenek 1, Tahta Sayısı Yaz: 0x01 w <-small 'w', kapatıldı Gerilim Malzemeleri Kapalı Raw3wire> w <-capital 'w', güç Gerilim malzemeleri Raw3Wire>

Yapılandırma moduna girmek için, veri hattını yüksek (-) kullanın ve bir saat darbesini (^) gönderin, ancak yonga bırakın. Kurul şimdi yapılandırma ayarlarını kabul etmeye hazır.

Yapılandırma moduna girdikten sonra gönderilen ilk bayt, yönetim kurulu değiştirilecek ayarları söyler. Şu anda, yalnızca panoların sayısı yapılandırılabilir (0x01). Sonra, bağlı panoların sayısını 1 ile 10 arasında gönderin. 1 gönderdik, çünkü tek bir tahtayı arayüz ediyoruz. Tahtayı sıfırlayın ve programlanmış panoların sayısına karşılık gelen bir LED’i aydınlatır.

Renkleri ayarlayın ve Düğme durumunu okuyun

Şimdi tahtaya renk verileri göndermeye ve düğme durumunu okumaya hazırız. Öncelikle, CS (Chip Select) sinyalinin normal sözleşmelerin karşısında olduğunu unutmayın. Genellikle CS, sinyal lo olduğunda bir çipi etkinleştirirw (0volts), and idles it when the signal is high (5volts); this is usually denoted by /CS, #CS, or !CS. Instead, the button controller is active when CS is high.

A 64byte transaction sets the LED colors and retrieves the button status. The first 16bytes program the red level for each LED, followed by 16bytes of green, and 16bytes of blue. finish by reading 16bytes from the board to get the status of each button. buttons data is sent as 0x00 if pressed, and 0xff if not pressed. The datasheet recommends a 400us delay between writing the color frames and reading the button data, but the Bus Pirate is slow enough that we won’t worry about that.

The protocol is simple enough, but there’s one major catch. The clock line must be high before raising CS, or the bytestream will be off by 1 bit. For this reason, many hardware SPI modules won’t work with the board.  This isn’t a problem if your microcontroller lets you twiddle pins that are controlled by a hardware module, but the micros we’ve worked with don’t allow this.

RAW3WIRE>/]255:16 255:16 255:16 r:16[
CLOCK, 1 <–clock must be high prior to raising CS CS DISABLED <–CS to 5volts, opposite normal use BULK write 0xFF , 0x10 TIMES <–red LEDs BULK write 0xFF , 0x10 TIMES <–green LEDs BULK write 0xFF , 0x10 TIMES <–blue LEDs BULK read 0x10 BYTES: <–read button state 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF CS enabled <–CS to 0volts, opposite normal use Raw3Wire>

This command sets every color of each LED to full, and reads back the 16 button status bytes.

We first set clock high (/), and only then can we raise CS to 5volts (]) and begin the data transaction. 255:16 is a repeated command that sends the value 255  sixteen times. As each color channel has 8bits of intensity control, 255 is 100% on. We send 255 a total of 48 times, once for each color of each LED. Finally, we retrieve one 16byte frame of button data (r:16) and lower CS to end the transaction ([). The button values are all 0xff, indicating that no buttons are pressed.

RAW3WIRE>/] 0:16 0:16 128:16 r:16[
CLOCK, 1
CS DISABLED
BULK write 0x00 , 0x10 TIMES
BULK write 0x00 , 0x10 TIMES
BULK write 0x80 , 0x10 TIMES <–all blue to 50% BULK read 0x10 BYTES: 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF CS ENABLED Raw3Wire>

Here, we set the blue level of every LED to 50% (128) and turn off all other colors. The button output now shows that button 0 is pressed.

RAW3WIRE>/] 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0:16 0:16 r:16[
CLOCK, 1
CS DISABLED
WRITE: 0x00 <– red LED 0, off … <–more of the same WRITE: 0x00 <– red LED 3, off WRITE: 0xFF <– red LED 4, 100% on WRITE: 0xFF <– red LED 5, 100% on WRITE: 0xFF <– red LED 6, 100% on WRITE: 0xFF <– red LED 7, 100% on WRITE: 0x00 <– red LED 8, off … <–more of the same WRITE: 0x00 <– red LED 15, off BULK write 0x00 , 0x10 TIMES <– all green LEDs off BULK write 0x00 , 0x10 TIMES <–all blue LEDs off BULK read 0x10 BYTES: <–read button status 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF CS ENABLED Raw3Wire>

This example shows how to address single LEDs. this time we actually write out all 16 bytes of the red color frame. buttons 0-3 and 8-15 have a red value of 0 (red off), buttons 4-7 are set to 100% red (255). All green and blue LEDs are off (0, 0%).

Çözüm

It was really frustrating to get this board working because the first version of the datasheet had so many errors. SparkFun’s engineers and support were really helpful, and posted a corrected datasheet within days. As long as you have the updated datasheet, this is an easy board to work with.

We’d like to see a firmware update that eliminates the need to keep the clock signal high before raising CS. This quirk makes the board incompatible with many hardware SPI modules, leaving slow bit-bang routines as the only interface option. Fortunately, the source code is open and available to anyone who wants to make this change.

The button pad controller is a really neat board, and we look forward to using it in a future project.

Hack a Day review disclosure: We asked for a free board and SparkFun sent it to us. We had a terrible time getting it to work with the instructions in the first version of the datasheet, we documented that experience here.

Leave a Reply

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