Arduino - matrisskrivare LED TV skriva
1. mål
Uppnå en penna som skriver om matris-skärm.
2. krets analys
Matrisskrivare skärmen handskrift består av tre huvuddelar: raden scanning krets, kolumn scanning krets visas, ljuspenna identifiering krets, blockdiagram nedan. Ljuspenna används häri installerade inuti en ljuskänslig sensor för att upptäcka tillståndet för punkterna som galler. Enligt följande:
(1) line scan i sin tur aktiverar dekoder Y0, Y1... effektiv, medan effektiva 74ls138 utgång är låg, men vi använder är gemensam anod matrisskrivare skärm, så det måste vara negeras, design använder PNP transistor förnekas. Varje åtta kolumn skanning skanna en gång.
(2) kolumn scanning i sin tur aktiverar dekoder Y0, Y1... effektiv och PWM styrsignalen på OE1, när OE1 är hög Y0 ~ Y7 är i hög nivå, när OE1 är låg, produktionen av dekodern ABC beslutas av tre stiften. Invald i rad kollade vi i sin tur Y0, Y1... och ljusstyrkan i varje LED lampa av OE1 förordning.
(3) ljus penna fick komparator Invertera input i referens spänning inställning och ljus penna ljus när den inverterade ingången av inspänningen är mindre än detta värde, när ljus penna inte tar emot ljuset när den inverterade ingången av inspänningen är större än detta värde när ett visst värde. När ljus penna inte tar emot är ljuset genom den nuvarande R3 mycket liten, så indata till den motsvarigheten Invertera inspänning nära matningsspänningen, då komparator produktionen är hög, när lampan ljus penna fick genom nuvarande kommer att öka i R3 stora, spänningen över R3 kommer att öka, så att indata till den motsvarigheten Invertera inspänning reduceras , då komparator produktionen är låg, då mikrokontroller kan fånga denna förändring och sedan göra lämplig behandling.
3. programmet analys
För att upptäcka väven punkt på vi måste belysa LED på gallret, och det är mikro-ljus skick, när stroke träffar en punkt av ljus, sätta denna fråga att lyfta fram. Så hur vet vi koordinaterna för denna punkt att tända det? Principen är denna: lampan är tänd ett, först den första raden i först, sedan den första raden i andra,..., första raden till den sista och sedan gå till den andra raden i först, cykeln LED upplysta sekventiellt och varje LED ange statusen, såsom värdet noll anger en mikro-ljus , 1 representant betonade. När den lätta hit med en punkt om det inte är vänden av detta LED lyser, ljuset inte upptäcka ljus penna ljuspenna så att produktionen hålls hög, de LED-lamporna vänder sig till när lit eftersom det ljus som utsänds från LED pennan ljus, utgång ljus penna från hög till låg , när enheten upptäcker denna nivå ändra tillträds den avbryta sekvensen, och få den aktuella raden, kolumnvärden, och genom raderna, kolumner, ändra värdet på denna punkt statusvärdet är 1, så att nästa gång det var när denna lilla bit av ljus på detta genom att döma statusvärdet är inställd att markera formen. tillstånd. När skanningshastigheten såg vi hela matris-skärmen är lyste upp, och i stället för ett lit.
Referensmetod är följande:
#include
#define COL 1
#define rad 2
int col = 0; Markera den aktuella skannade raden
int rad = 0; Markera kolumnen aktuella skannade
int ledState [8] [8]. Markera aktuell LED status
/ * haveUpdate används för att eliminera ljus penna jitter, när den förvärvade ljuspenna signal fallande kant när data uppdateras, * och flaggan är inställd på 1 anger att data har uppdaterats, och sedan öppna timern på nästa klimat jitter * eftersom data har uppdaterats till försummelsen av jitter, när den vanliga då och då att åter-ställa denna flagga är 0 * /
int haveUpdate = 0;
void setup()
{
MEMSET (ledState, 0, sizeof(ledState)); Alla statusvärden avmarkeras.
initPort(); Port initiering
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20); Odelade
OCR2A = 100;
OCR2B = 99. Månadskapacitet på 99%
attachInterrupt (0, externInterrupt, faller); //Set externa avbryta fallande kant avbrott
CLI(); Stäng alla avbrott
TCCR1A = 0; Register A konfigurerad PWM, vi använder bara timerfunktionen
TCCR1B = (1 < TCNT1 = 0xFE79; //Counter initialvärde, 25ms timer
TIMSK1 = 0; Nära Overflow
SEI(); Öppna globala avbrott
} ISR(TIMER1_OVF_vect) {//Timer avbrottstjänstens rutin
TIMSK1 = 0; Nära aktivera overflow avbrott
haveUpdate = 0; Återställa flagga
}
void loop()
{
Scan(); Cykliska scan
}
void externInterrupt() //External avbrottstjänstens rutin
{
IF(haveUpdate == 0)
{
ledState [rad] [col] = 1; Beroende på vilket av rad- och kolumnetiketter som upptäcks peka
haveUpdate = 1;
TCNT1 = 0XFE79; Räknaren initialvärde, 25ms timer
TIMSK1 =(1< 0)
OCR2B = 1;
annat
OCR2B = 98.
delayMicroseconds(300);
OCR2B = 98.
}
}
}
Skivor från PCBWay, och mer om elektronik på http://e-gather.ui3g.com/.