Raspberry Pi spektrumanalysator med RGB LED Strip och Python (1 / 3 steg)
Steg 1: Anslut LED strip och setup RGB LED programvara
Ett bra diagram för att ansluta den RGB LED strip till RasPi finns på adafruit's webbplats.
Löda 5V, marken, Clock och Data linjer till Input slutet LED Strip och Anslut till Pi som visas på länk eller i mina bilder. Var noga med att ansluta marken i 5V leverans till marken av Pi!
Ta programvaran och följ instruktionerna för att få Pi kunna utdata till SPI. Det är viktigt att du använder hårdvaran SPI eftersom varje bit-banka strategi inte är tillräckligt snabb.
sudo raspi-configför att aktivera hårdvara SPI (följa instruktionerna på git sida).
Jag la installationskatalogen till min PYTHONPATH i bashrc så jag kunde ringa funktioner från var som helst.
inuti .bashrc:
exportera PYTHONPATH = $PYTHONPATH: / home/pi/RPi-LPD8806-master
testa att remsan fungerar genom att köra exempelkod:
python example.py
Xmas ljus koden vi kommer för att hämta senare vill köra som root, och när du kör saker med en sudo framför, miljövariabler, specifikt, PYTHONPATH är inte överförs.
Jag var tvungen att redigera /etc/sudoers genom att skriva
sudo visudo
och sedan läggas på botten
Som standard env_keep = SYNCHRONIZED_LIGHTS_HOME
Env_keep += PYTHONPATH som standard
den första raden är något vi behöver för xmas ljus paketet installeras senare. Dessa kontrollera dessa miljövariabler stanna kvar när du kör saker som sudo.
För att testa att du har det setup rätt, nära terminal och åter öppna, skriv
sudo python
från bootstrap import *
led.Fill(Color(50,50,50),0,10)
led.Update()
som aktiverar de första 10 lysdioderna.
Ett sista steg är att göra några ändringar att påskynda skriva till band.
Inuti ledstrip.py, göra säker use_py_spi = True i def __init__ linje
def __init__ (själv, lysdioder, use_py_spi = sanna, dev="/dev/spidev0.0", driver = "LPD8806"):
Inuti LPD8806.py ska vi nu ändra SPI hastigheten till 16MHz
om self.use_py_spi:
import spidevSelf.SPI = spidev. SpiDev() self.spi.open(0,0)
self.spi.max_speed_hz = 16000000
skriva ut "py-spidev MHz: %d ' % (self.spi.max_speed_hz / 1000000.0)
Att utskrift förklaring är det bara att se till att allt blir korrekt inställd.
En sista ändring LPD8806.py filen är i funktionen update(). Av någon anledning märkte jag led.update() tog lång tid, upwords av 25ms. För att få en god visuell effekt, jag ville ha min hela analys och display slinga för att köra på 20Hz, eller 50 ms per slinga, och bränna hälften som tid väntar LED strip inte skulle fungera. Och konstigt nog på 16MHz, det bör ha tagit mindre än en ms. 3 byte per led, 152 lysdioder, (3 * 152 * 8 bitar / 16M) =.2ms! (inte 25ms) När jag satte ett scope till SPI porten, varje byte var på väg på 16 MHz, men det fanns en 160uS paus efter varje anrop till self.spi.xfer2(). Min lösning var att samla hela strängen byte i en buffert och bara ringa self.spi.xfer2() en gång:
def uppdatering (själv, buffert):
temp_buffer =]om self.use_py_spi:
x i range(self.leds):
temp_buffer = temp_buffer + [i för jag i buffert [x]]
#self.spi.xfer2 ([i för jag i buffer[x]])
Self.SPI.xfer2 (temp_buffer)
Self.SPI.xfer2([0x00,0x00,0x00]) #zero fylla sist att förhindra herrelösa färger i slutet
Self.SPI.xfer2([0x00]) #once mer med känsla - det hjälper :) time2 = time.time()
Skriva till 152 lysdioder på 16 MHz bör ta ingen tid--bör du se den sista LED förändringen samtidigt den första som gör
Några andra människor har kämpat med detta och fick runt det, kolla in den fantastiska POV video effekten med en enda vertikala LED strip (skicka data på 8 MHz thru 20 ft av katt 5!):