RGB LED ekran od 64 piksela - još jedan Arduino klon: 12 koraka (sa slikama)
RGB LED ekran od 64 piksela - još jedan Arduino klon: 12 koraka (sa slikama)
Anonim

Ovaj ekran je zasnovan na 8x8 RGB LED matrici. Za potrebe testiranja, bio je spojen na standardnu Arduino ploču (Diecimila) koristeći 4 registra pomaka. Nakon što sam ga pokrenuo, izradio sam ga na lakiranoj PCB -u. Registri pomaka su široki 8 bita i lako se povezuju sa SPI protokolom. Modulacija širine impulsa koristi se za miješanje boja, o tome kasnije. Dio RAM -a MCU -a koristi se kao framebuffer za držanje slike. Video RAM se raščlanjuje rutinom prekida u pozadini, tako da korisnik može raditi i druge korisne stvari, poput razgovora s računalom, čitanja tipki i potenciometara. Više informacija o "Arduinu": www.arduino.cc

Korak 1: Modulacija širine impulsa za miješanje boja

Modul širine impulsa - ŠTA? Modulacija širine impulsa u osnovi uključuje UKLJUČIVANJE i ISKLJUČIVANJE napajanja električnog uređaja. Korisna snaga proizlazi iz matematičkog prosjeka funkcije kvadratnog vala uzetog u intervalu jednog perioda. Što duže funkcija ostaje u položaju ON, dobivate veću snagu. PWM ima isti učinak na svjetlinu LED dioda kao prigušivač na naizmjeničnim svjetlima. Zadatak pred nama je pojedinačna kontrola svjetline 64 RGB LED diode (= 192 pojedinačne LED diode!) Na jeftin i jednostavan način, tako da se može dobiti cijela spektar boja. Po mogućnosti ne bi trebalo biti treperenja ili drugih uznemirujućih učinaka. Nelinearna percepcija svjetline koju pokazuje ljudsko oko ovdje se neće uzeti u obzir (npr. Razlika između 10% i 20% svjetline izgleda "veća" nego između 90% i 100%). Slika (1) ilustrira princip rada PWM algoritam. Recimo da je kodu dodijeljena vrijednost 7 za svjetlinu LED diode (0, 0). Nadalje, zna da postoji maksimalno N koraka u svjetlini. Kod pokreće N petlji za sve moguće nivoe svjetline i sve potrebne petlje za opsluživanje svake LED u svim redovima. U slučaju da je brojač petlje x u petlji svjetline manji od 7, LED se uključuje. Ako je veći od 7, LED se isključuje. Radeći to vrlo brzo za sve LED diode, nivoe svjetline i osnovne boje (RGB), svaka LED se može individualno prilagoditi kako bi prikazala željenu boju. Mjerenja osciloskopom pokazuju da kod za osvježavanje ekrana traje oko 50% CPU -a. Ostatak se može koristiti za obavljanje serijske komunikacije sa računarom, čitanje dugmadi, razgovor sa RFID čitačem, slanje I2C podaci u druge module …

Korak 2: Razgovor sa Shift registrima i LED diodama

Registar pomaka je uređaj koji omogućuje serijsko učitavanje podataka i paralelni izlaz. Suprotna operacija je moguća i sa odgovarajućim čipom. Postoji dobar vodič o registrima pomaka na arduino web stranici. LED diode pokreću 8-bitni registri pomaka tipa 74HC595. Svaki port može izvoriti ili potopiti oko 25mA struje. Ukupna struja po potonulom čipu ili izvoru ne smije prelaziti 70 mA. Ovi čipovi su izuzetno jeftini, pa ne plaćajte više od 40 centi po komadu. Kako LED diode imaju eksponencijalnu karakteristiku struje / napona, moraju postojati otpornici za ograničavanje struje. Koristeći Ohmov zakon: R = (V - Vf) / IR = granični otpornik, V = 5V, Vf = prednji napon LED, I = željena struja Crvene LED diode imaju prednji napon od oko 1,8 V, plavo i zeleno u rasponu od 2,5 V do 3,5 V. Upotrijebite jednostavan multimetar da to utvrdite. Za pravilnu reprodukciju boja treba uzeti u obzir nekoliko stvari: spektralnu osjetljivost ljudskog oka (crveno/plavo: loše, zeleno: dobro), efikasnost LED diode na određenoj valnoj duljini i struji. U praksi se jednostavno uzmu 3 potenciometra i namjeste ih dok LED ne pokaže pravilno bijelo svjetlo. Naravno, maksimalna LED struja se ne smije prekoračiti. Ono što je također važno ovdje je da registar pomaka koji pokreće redove mora napajati struju do 3x8 LED dioda, pa je bolje da ne gurate struju previše visoko. Bio sam uspješan s ograničavanjem otpornika od 270Ohm za sve LED diode, ali to naravno ovisi o izradi LED matrice. Registri pomaka su povezani sa SPI serijom. SPI = Serijski periferni interfejs (slika (1)). Nasuprot serijskim portovima na računarima (asinhroni, nema signala takta), SPI -u je potrebna taktna linija (SRCLK). Zatim postoji signalna linija koja govori uređaju kada su podaci valjani (chip select / latch / RCLK). Konačno, postoje dvije linije podataka, jedna se zove MOSI (master out slave in), druga se zove MISO (master in slave out). SPI se koristi za povezivanje integriranih kola, baš kao i ja2C. Za ovaj projekat su potrebni MOSI, SRCLK i RCLK. Dodatno se koristi i linija za omogućavanje (G). SPI ciklus započinje povlačenjem linije RCLK na LOW (Slika (2)). MCU šalje svoje podatke na MOSI liniju. Njegovo logičko stanje uzorkuje registar pomaka na rastućoj ivici linije SRCLK. Ciklus se prekida povlačenjem RCLK linije natrag na HIGH. Sada su podaci dostupni na izlazima.

Korak 3: Shema

Slika (1) prikazuje način povezivanja registara pomaka. Oni su lancem povezani, pa se podaci mogu premjestiti u ovaj lanac, ali i kroz njega. Stoga je dodavanje više registara pomaka jednostavno.

Slika (2) prikazuje ostatak sheme sa MCU -om, konektorima, kvarcom … Priložena PDF datoteka sadrži cijela djela, najbolja za štampanje.

Korak 4: Izvorni kod C ++

U C/C ++ obično morate prototipirati funkcije prije njihovog kodiranja.#Include int main (void); void do_something (void); int main (void) {do_something ();} void do_something (void) {/ * komentar */ } Arduino IDE ne zahtijeva ovaj korak jer se prototipi funkcija automatski generiraju. Zbog toga se prototipi funkcija neće pojaviti u kodu prikazanom ovdje. Slika (1): setup () functionImage (2): funkcija spi_transfer () pomoću hardverskog SPI čipa ATmega168 (radi brže) Slika (3): kod framebufera pomoću prekid prekoračenja timera1. Komadi koda koji imaju pomalo kriptičan izgled za početnike, npr dok (! (SPSR & (1 << SPIF))) {} direktno koristite registre MCU -a. Ovaj primjer riječima: "dok SPIF-bit u registru SPSR nije postavljen, ne radite ništa". Samo želim naglasiti da za standardne projekte zaista nije potrebno baviti se tako blisko povezanim stvarima s hardverom. Ovo se početnika ne bi trebalo plašiti.

Korak 5: Gotov spravica

Nakon što sam riješio sve probleme i pokrenuo kôd, samo sam morao napraviti raspored PCB -a i poslati ga u fab house. Izgleda mnogo čišće:-) Slika (1): potpuno popunjena kontrolna pločaSlika (2): prednja strana gole PCB slike (2): stražnja stranaIma konektora koji izbijaju PORTC i PORTD čipa ATmega168/328 i 5V/GND. Ovi portovi sadrže serijske RX, TX linije, I2C linije, digitalne I/O linije i 7 ADC linija. Ovo je namjenjeno za slaganje štitova na stražnju stranu ploče. Razmak je pogodan za upotrebu perfboard -a (0,1 inča). Bootloader se može prebrisati pomoću ICSP zaglavlja (radi sa adafruit USBtinyISP). Čim se to učini, samo upotrijebite standardni FTDI USB/TTL serijski adapter ili slično. Dodao sam i kratkospojnik za automatsko resetiranje i onemogućavanje. Pripremio sam i mali Perl skript (pogledajte moj blog), koji omogućava automatsko resetiranje pomoću FTDI kabela koji obično ne radi odmah (RTS vs DTR linija). Ovo radi na Linuxu, možda na MAC -u. Štampane ploče i nekoliko DIY KIT -ova su dostupni na mom blogu. Potrebno SMD lemljenje! Pogledajte PDF datoteke za upute za izgradnju i izvore LED matrica.

Korak 6: Aplikacija: CPU Load Monitor za Linux koristeći Perl

Ovo je vrlo osnovni monitor učitavanja s povijesnim prikazom. Zasnovan je na Perl skripti koja prikuplja "prosjek opterećenja" sistema svakih 1 s pomoću iostata. Podaci se pohranjuju u niz koji se pomiče pri svakom ažuriranju. Novi podaci se dodaju na vrh liste, najstariji unos se gura. Detaljnije informacije i preuzimanja (kod…) dostupni su na mom blogu.

Korak 7: Primjena: Razgovor s drugim modulima pomoću I²C

Ovo je samo dokaz principa i daleko nije najjednostavnije rješenje za ovaj posao. Koristeći I2C omogućava direktno adresiranje do 127 "slave" ploča. Ovdje je ploča s desne strane u videu "master" (koja pokreće sve prijenose), lijeva ploča je slave (čeka podatke). I2C treba 2 signalne linije i uobičajene vodove (+, -, SDA, SCL). Kako se radi o sabirnici, svi uređaji su na nju spojeni paralelno.

Korak 8: Primjena: "Game Cube":-)

Samo nakaza. Ova se također uklapa u drveno kućište prikazano na uvodnoj stranici. Na stražnjoj strani ima 5 tipki koje se mogu koristiti za igranje jednostavne igre. KRAJ?

Korak 9: Prikaz slika / animacija na Matrixu - Brzi hack

Dakle, na raspolaganju je samo 8x8 piksela i nekoliko boja. Prvo upotrijebite nešto poput Gimpa da smanjite svoju omiljenu sliku na tačno 8x8 piksela i sačuvate je kao ".ppm" sirovi format (ne ASCII). PPM se lako čita i obrađuje u Perl skripti. Korištenje ImageMagicka i alata za naredbu "convert" neće raditi ispravno. Učitajte novi arduino kod, a zatim upotrijebite Perl skriptu za postavljanje na kontroler. Treperenje je samo neslaganje osvježavanja LED -a i brzine kadrova moje kamere. Nakon što je malo ažurirao kôd, on radi prilično živahno. Sve slike se prenose uživo putem serijskog prikaza onako kako ih vidite. Dulje animacije mogu se pohraniti u vanjski EEPROM, kao što se radi na različitim pločama s govornim pločama.

Korak 10: Interaktivna kontrola pohranjenih animacija

Zašto dopustiti mikrokontroleru da se zabavi? Arduino kult se svodi na fizičko računanje i interakciju, pa samo dodajte potenciometar i preuzmite kontrolu! Korištenje jednog od 8 ulaza analogno -digitalnog pretvarača čini to vrlo jednostavnim.

Korak 11: Prikazivanje video zapisa uživo

Korištenje Perl skripte i nekoliko modula čini prilično lakim prikazivanje kvazi videa uživo na X11 sistemima. Kodiran je na linux-u i može raditi i na MAC-ovima. Radi ovako:- postavite poziciju kursora miša- snimite okvir od NxN piksela centriran na kurzoru- skalirajte sliku na 8x8 piksela- pošaljite je na LED ploču- ponoviti

Korak 12: Više svjetla gotovo besplatno

Sa samo dva koraka svjetlina se može prilično povećati. Zamijenite otpornike od 270 Ω sa onima od 169 Ω i vratite novi registar pomaka 74HC595 na IC5.