Innehållsförteckning:

64 Pixel RGB LED -skärm - En annan Arduino -klon: 12 steg (med bilder)
64 Pixel RGB LED -skärm - En annan Arduino -klon: 12 steg (med bilder)

Video: 64 Pixel RGB LED -skärm - En annan Arduino -klon: 12 steg (med bilder)

Video: 64 Pixel RGB LED -skärm - En annan Arduino -klon: 12 steg (med bilder)
Video: How To Control WS2812B Individually Addressable LEDs using Arduino 2024, November
Anonim
64 Pixel RGB LED -skärm - En annan Arduino -klon
64 Pixel RGB LED -skärm - En annan Arduino -klon
64 Pixel RGB LED -skärm - En annan Arduino -klon
64 Pixel RGB LED -skärm - En annan Arduino -klon
64 Pixel RGB LED -skärm - En annan Arduino -klon
64 Pixel RGB LED -skärm - En annan Arduino -klon

Denna skärm är baserad på en 8x8 RGB LED -matris. För teständamål var den ansluten till ett vanligt Arduino -kort (Diecimila) med 4 skiftregister. Efter att ha fått det att fungera permatiserade jag det på en fabbed PCB. Skiftregistren är 8-bitars breda och kan enkelt kopplas till SPI-protokollet. Pulsbreddsmodulering används för att blanda färgerna, mer om det senare. En del av MCU: s RAM -minne används som en rambuffert för att hålla bilden. Videoramet analyseras av en avbrottsrutin i bakgrunden, så att användaren kan göra andra användbara saker som att prata med en dator, läsa knappar och potentiometrar. Mer information om "Arduino": www.arduino.cc

Steg 1: Pulsbreddsmodulering för blandning av färger

Pulsbreddsmodulering för blandning av färger
Pulsbreddsmodulering för blandning av färger

Pulsbreddsmodul - VAD? Pulsbreddsmodulering är i huvudsak att slå på och stänga av strömmen till en elektrisk enhet ganska snabbt. Den användbara effekten härrör från det matematiska genomsnittet av kvadratvågsfunktionen som tagits över intervallet för en period. Ju längre funktionen stannar i ON -läget, desto mer effekt får du. PWM har samma effekt på lysdiodernas ljusstyrka som en dimmer på AC -lampor. Uppgiften framöver är att individuellt styra ljusstyrkan på 64 RGB -lysdioder (= 192 enstaka lysdioder!) På ett billigt och enkelt sätt, så att man kan få hela spektrum av färger. Helst bör det inte finnas några flimmer eller andra störande effekter. Den olinjära uppfattningen av ljusstyrka som uppvisas av det mänskliga ögat kommer inte att beaktas här (t.ex. skillnaden mellan 10% och 20% ljusstyrka verkar "större" än mellan 90% och 100%). Bild (1) illustrerar arbetsprincipen för PWM -algoritmen. Säg att koden ges ett värde på 7 för ljusstyrkan på LED (0, 0). Dessutom vet den att det finns maximalt N steg i ljusstyrka. Koden kör N -slingor för alla möjliga nivåer av ljusstyrka och alla nödvändiga slingor för att serva varje enskild lysdiod i alla rader. Om slingräknaren x i ljusstyrkekretsen är mindre än 7 tänds lysdioden. Om den är större än 7 stängs lysdioden av. Genom att göra detta mycket snabbt för alla lysdioder, ljusstyrkanivåer och basfärger (RGB) kan varje lysdiod justeras individuellt för att visa önskad färg. Mätningar med ett oscilloskop har visat att skärmens uppdateringskod tar cirka 50% CPU -tid. Resten kan användas för att göra seriell kommunikation med en PC, läsa knappar, prata med en RFID -läsare, skicka I2C -data till andra moduler …

Steg 2: Prata med skiftregister och lysdioder

Pratar med skiftregister och lysdioder
Pratar med skiftregister och lysdioder
Pratar med skiftregister och lysdioder
Pratar med skiftregister och lysdioder

Ett skiftregister är en enhet som möjliggör laddning av data i serie och en parallell utgång. Den motsatta operationen är också möjlig med lämpligt chip. Det finns en bra handledning om skiftregister på arduino-webbplatsen. Lysdioderna drivs av 8-bitars skiftregister av typen 74HC595. Varje port kan källa eller sjunka cirka 25mA ström. Den totala strömmen per chip sjunkit eller hämtat ska inte överstiga 70mA. Dessa marker är extremt billiga, så betala inte mer än cirka 40 cent per bit. Eftersom lysdioder har en exponentiell ström / spänningskaraktäristik måste det finnas strömbegränsande motstånd. Med Ohms lag: R = (V - Vf) / IR = begränsningsmotstånd, V = 5V, Vf = LED: s framspänning, I = önskad ström Röda lysdioder har en framspänning på cirka 1,8V, blått och grönt från 2,5V till 3,5V. Använd en enkel multimeter för att avgöra det. För korrekt färgåtergivning bör man ta hänsyn till några saker: spektral känslighet för det mänskliga ögat (rött/blått: dåligt, grönt: bra), effektiviteten hos lysdioden vid en viss våglängd och ström. I praktiken tar man bara 3 potentiometrar och justerar dem tills lysdioden visar korrekt vitt ljus. Naturligtvis får den maximala LED -strömmen inte överskridas. Vad som också är viktigt här är att skiftregistret som driver raderna måste ge ström till 3x8 lysdioder, så det är bättre att inte trycka upp strömmen för högt. Jag lyckades med att begränsa motstånd på 270Ohm för alla lysdioder, men det beror naturligtvis på LED -matrisens fabrik. Skiftregistren är kopplade till SPI -seriell. SPI = Seriellt perifert gränssnitt (bild (1)). I motsats till seriella portar på datorer (asynkron, ingen klocksignal) behöver SPI en klocklinje (SRCLK). Sedan finns det en signalledning som talar om för enheten när data är giltiga (chip select / spärr / RCLK). Slutligen finns det två datarader, en kallas MOSI (master out slave in), den andra kallas MISO (master in slave out). SPI används för att koppla in integrerade kretsar, precis som jag2C. Detta projekt behöver MOSI, SRCLK och RCLK. Dessutom används aktiveringslinjen (G) också. En SPI -cykel startas genom att dra RCLK -linjen till LÅG (Bild (2)). MCU skickar sin data på MOSI -linjen. Det logiska tillståndet för det samplas av skiftregistret vid den stigande kanten av SRCLK -linjen. Cykeln avslutas genom att dra tillbaka RCLK -linjen till HIGH. Nu är data tillgängliga vid utgångarna.

Steg 3: Schematisk

Schematisk
Schematisk
Schematisk
Schematisk

Bild (1) visar hur skiftregistren är anslutna. De är tusenskakade, så data kan flyttas in i denna kedja och även genom den. Därför är det enkelt att lägga till fler skiftregister.

Bild (2) visar resten av schemat med MCU, kontakter, kvarts … Den bifogade PDF -filen innehåller hela verken, bäst för utskrift.

Steg 4: C ++ källkod

C ++ källkod
C ++ källkod
C ++ källkod
C ++ källkod
C ++ källkod
C ++ källkod

I C/C ++ måste man vanligtvis prototypera funktioner innan man kodar dem.#Include int main (void); void do_something (void); int main (void) {do_something ();} void do_something (void) {/ * comment */ } Arduino IDE kräver inte detta steg, eftersom funktioner prototyper genereras automatiskt. Därför dyker inte funktionsprototyper upp i koden som visas här. Bild (1): setup () functionImage (2): spi_transfer () -funktion med hårdvarusPI för ATmega168 -chipet (körs snabbare) Bild (3): framebufferkod med ett timer1 överflödsavbrott. Koddelar som har ett lite kryptiskt utseende för nybörjare t.ex. medan (! (SPSR & (1 << SPIF))) {} använder MCU: s register direkt. Detta exempel med ord: "medan SPIF-biten i registret SPSR inte är inställd gör ingenting". Jag vill bara betona att det för standardprojekt verkligen inte är nödvändigt att hantera dessa saker så nära besläktade med hårdvara. Nybörjare ska inte skrämmas av detta.

Steg 5: Färdig gadget

Färdig gadget
Färdig gadget
Färdig gadget
Färdig gadget
Färdig gadget
Färdig gadget

Efter att ha löst alla problem och fått koden igång, var jag bara tvungen att skapa en PCB -layout och skicka den till ett fantastiskt hus. Det ser så mycket renare ut:-) Bild (1): fullt befolkat styrkort Bild (2): framsidan av den bara PCBI-bilden (2): baksidan Det finns kontakter som bryter ut PORTC och PORTD på ATmega168/328-chipet och 5V/GND. Dessa portar innehåller de seriella RX-, TX -linjerna, I2C -linjer, digitala I/O -linjer och 7 ADC -linjer. Detta är avsett för stapling av sköldar på baksidan av brädet. Avståndet är lämpligt för att använda perfboard (0.1in). Bootloader kan blinkas med ICSP -rubriken (fungerar med adafruit's USBtinyISP). Så snart det är gjort använder du bara en standard FTDI USB/TTL -seriell adapter eller liknande. Jag har också lagt till en bygel som återställs automatiskt. Jag har också kokat upp ett litet Perl-skript (se min blogg), som möjliggör automatisk återställning med FTDI-kablar som vanligtvis inte fungerar ur rutan (RTS vs. DTR-linje). Detta fungerar på Linux, kanske på MAC. Tryckta kretskort och några DIY -KIT finns på min blogg. SMD -lödning krävs! Se PDF -filerna för bygginstruktioner och källor för LED -matriser.

Steg 6: Ansökan: CPU Load Monitor för Linux med Perl

Detta är en mycket grundläggande lastmonitor med en historikdiagram. Det är baserat på ett Perl -skript som samlar systemets "belastningsgenomsnitt" var 1: e med iostat. Data lagras i en array som skiftas vid varje uppdatering. Ny data läggs till överst på listan, den äldsta posten trycks ut. Mer detaljerad information och nedladdningar (kod …) finns på min blogg.

Steg 7: Tillämpning: Prata med andra moduler med I²C

Ansökan: Prata med andra moduler med I²C
Ansökan: Prata med andra moduler med I²C

Detta är bara ett principbevis och överlägset inte den enklaste lösningen för det här jobbet2C tillåter direkt adressering av upp till 127 "slav" -kort. Här är tavlan på höger sida i videon "mastern" (som initierar alla överföringar), den vänstra brädan är slaven (väntar på data). I2C behöver 2 signalledningar och de vanliga kraftledningarna (+, -, SDA, SCL). Eftersom det är en buss är alla enheter parallellt anslutna till den.

Steg 8: Ansökan: "Game Cube":-)

Ansökan
Ansökan

Bara en freak tanke. Den här passar också in i trähöljet som visas på introduktionssidan. Den har fem knappar på baksidan som kan användas för att spela ett enkelt spel. Slutet?

Steg 9: Visa bilder / animationer på Matrix - Quick Hack

Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack
Visa bilder / animationer på Matrix - Quick Hack

Så den har bara 8x8 pixlar och några färger tillgängliga. Använd först något som Gimp för att skala ner din favoritbild till exakt 8x8 pixlar och spara den som ".ppm" råformat (inte ASCII). PPM är lätt att läsa och bearbeta i ett Perl -skript. Användning av ImageMagick och kommandoradsverktyget "convert" fungerar inte korrekt. Ladda upp den nya arduino -koden och använd sedan Perl -skriptet för att ladda upp till kontrollen. Flimmern är bara en felaktig matchning av LED -uppdatering och min kameras bildhastighet. Efter att ha uppdaterat koden lite går den ganska zippy. Alla bilder överförs live över serie som du ser dem. Längre animationer kan lagras i en extern EEPROM som det görs i olika eker-pov-kort.

Steg 10: Interaktiv kontroll av lagrade animationer

Varför låta mikrokontrollen ha det roligt? Arduino -kulten handlar om fysisk beräkning och interaktion, så lägg bara till en potentiometer och ta kontrollen! Att använda en av de 8 analoga till digitala omvandlaringångarna gör det väldigt enkelt.

Steg 11: Visar livevideo

Att använda ett Perl -skript och några moduler gör det ganska enkelt att visa kvasi livevideo på X11 -system. Den är kodad på linux och kan fungera på MAC också. Det fungerar så här:- få muspekarens position- fånga en låda med NxN pixel centrerad vid markören- skala bilden till 8x8 pixlar- skicka den till LED-kortet- upprepa

Steg 12: Mer ljus nästan gratis

Mer ljus nästan gratis
Mer ljus nästan gratis

Med bara två steg kan ljusstyrkan höjas en hel del. Byt ut 270Ω motstånd mot 169Ω och piggyback ytterligare 74HC595 skiftregister på IC5.

Rekommenderad: