LED Etch-a-Sketch (Full Instructable) (6 / 10 steg)

Steg 6: Programvaran



Det är där allt kommer tillsammans. Jag ska försöka prata om alla viktiga delar av koden kort. Koden är kopplad och kommenterade så att du kan se det i sin helhet.

Som med alla C-program har vi först omfattar ut. Du behöver io.h och interrupt.h för detta projekt. Nästa, definierade jag några symboler så att det skulle vara lättare att arbeta med dem i programmet. Jag tycker det är lättare att veta vad jag gör när jag använder SPI_PORT istället för PORTB. Sedan har vi funktionen prototyper. inget alltför speciellt här. Slutligen i detta avsnitt har vi våra globala variabel definitioner. Det finns några jag vill få din uppmärksamhet till.

int currentRow = 0;
unsigned int kråka = 0, cCol = 0;
int rowRead, colRead, faktor.
int soft_prescaler = 0;
osignerade långa ritning [8] = {0}.

Variabeln currentRow, har som namnet antyder, värdet av den aktuella raden som vi visar upp. Du ser exakt vad det används till lite senare. Kråka och cCol håll markörens raden och kolumnen värden. rowRead och colRead hålla ADC läser värden från krukor. Dessa kommer att användas vid beräkningen av värdet på variablerna kråka och cCol. Soft_prescaler används för att ytterligare dela upp klockan med programvaran; Vi ska diskutera det senare. Slutligen, den viktigaste variabeln är en vektor av osignerade långa ints kallas ritning. Du kommer att märka denna matris innehåller åtta element-ett för varje rad. Detta gäller 32-bitar som styr lysdioderna för varje kolumn.

Nu ska vi gå till vissa funktioner. Vi börjar med huvudfunktionen. Efter att ha utfört uppsättningen upp timern, SPI, ingångar och utgångar in vi huvudprogrammet ögla. Den första tror inuti denna slinga är en om uttalande.

om (räknare < cykler)
{
rowReadings [counter] = Analog_Read(PC4);
colReadings [counter] = Analog_Read(PC5);
räknaren ++;
}

Detta helt enkelt ta en provtagning av ADC mätvärden över så många cykler. Detta används för att beräkna ett genomsnitt på ADC läsning och förhindrar problem med ritningen. Att ange en annan kommer att visa hur detta görs.

annat
{

Genomsnitt alla rad- och Col ADC avläsningar
colRead = CycAvg(colReadings);
rowRead = CycAvg(rowReadings);
räknare = 0;

Efter har vi ett urval av ADC värden för rad- och kolumner kan vi i genomsnitt dem med hjälp av funktionen CycAvg. Detta är bara en generisk genomsnitt funktion som summerar värdena och dividerar sedan med det totala antalet värden. Jag kommer inte prata om det här som du kan hitta det i koden. Tja, nu när vi har ADC avläsningarna vill vi från krukor, måste vi omvandla detta till en rad och en kolumn nummer så vi kan placera markören där. Hanteras detta nästa.

om (colRead / DIVISOR ! = cCol & & colRead / DIVISOR < DIMENSION)
{
cCol = colRead / DIVISOR;
}

Markören kolumnvärdet är rättframt att beräkna. Vi kontrollerar att det nya värdet är inte samma som det gamla värdet (eftersom det skulle vara nödvändigt att räkna om det) och vi se till att markören inte går utöver våra 16 x 16 ritning yta. Sedan tilldela vi värdet på ADC behandlingen dividerat med värdet av DIVISOR. NÄMNAREN är bara det maximala värdet av ADC dividerat med måtten på displayen (1024/16 = 64, så varje 64 vi är på en annan rad eller kolumn). Markören radens värde är lite mer komplicerat.

om (rowRead / DIVISOR ! = kråka & & rowRead / DIVISOR < DIMENSION)
{
om (rowRead / DIVISOR > = 8)
{
Kråka = rowRead / DIVISOR - 8.
faktor = 0;
}
annat
{
Kråka = rowRead / DIVISOR;
faktor = 16.
}
}

Så vad är med detta extra om uttalande? Detta går tillbaka till hur vi trådbunden upp displayerna som om det vore faktiskt en 8 x 32 skärm istället för en 16 x 16. De första 16 bitarna i vår ritning variabel motsvarar de första 16 kolumnerna på 8 x 32 displayen. De resterande 16 bitarna motsvarar de andra 16 kolumnerna. När vi gör displayen 16 x 16 vi flyttar de senast 16 kolumnerna och placera dem under granar 16 kolumner på konstgjord väg skapa 8 fler rader. Om vi vill beräkna raden markören på samma sätt som vi gjorde kolumnen markören kan vi sluta med ett värde mer än 8. Kom ihåg att vi bara har åtta rader eftersom våra displayen är tekniskt 8 x 32 så detta skapar ett problem. Så om resultatet av uppdelningen av ADC med DIVISOR är större än 8 måste vi dra ifrån 8 och använda den som raden, kan annars vi bara ta resultatet är. Vi måste också hålla reda på om ritningen som sker i de första 16 kolumnerna (rader 9-16) eller de senast 16 kolumnerna (rader 1-8). Det är där variabeln faktor kommer in. Detta borde göra mer känsla när vi faktiskt tilldelar ett värde till variabeln ritning nästa.

ritning [cRow] | = (0x80000000 >> (cCol + faktor));

Ganska lite är gjort här. Först ger vi matrisen våra markören kolumn som index och sedan ska vi bitvisa eller detta med nästa del. Vi använder bitvisa eller här eftersom vi vill hålla alla bitar som redan angetts, där de är och endast ange en motsvarande till den markörplaceringen. På höger sida av operatören, vi skifta en enda bit till sin rätta plats. Till exempel, anta att värdet på cCol är 4 och kråkan är 5. I det här scenariot ritning [5] | = (0x80000000 >> (4 + 16)) = 0b0000000000000000|0001000000000000. För att bättre klargöra vad bitar motsvarar vad, de 16 mest signifikanta bitarna motsvarar kolumnerna i rader 1-8, motsvarar de 16 minst signifikanta bitarna rader 9-16.

Den sista delen av denna loop kontrollerar om båda luta växlar är stängda på samma gång. Det är mycket enkel och bygger på att det finns en hög sannolikhet att två växlar stängs samtidigt när enheten skakas.

Rensa skärmen om tilt sensorer är utlöst.
om (bit_is_clear(PINC,0) & & bit_is_clear (PINC, 1))
{
clrscr();
}

Nu när ritningen är klar måste vi få det till displayen. Detta tas om hand av avbryta tjänsten rutin (ISR) som utlöses på varje timer overflow. Låt oss titta på.

ISR (TIMER0_OVF_vect)
{
soft_prescaler ++;

om (soft_prescaler == SFT_PRESCAL_MAX)
{
currentRow = (currentRow + 1) % 8.

Överföra Data på SPI
SPI_Transmit(Drawing[currentRow]);

PORTD = (1 << currentRow);

soft_prescaler = 0;
}
}

Det första vi gör i ISR är öka den mjuka prescaler. Den mjuka prescaler i grunden kan vi göra varje rad är visas något annat än vad vi kan med den ATmega hårdvara prescaler. Om man ser till funktionen Timer_Init() ser du vi prescale klockan 8 med hårdvara. Så blir vår 16 MHz klocka 2MHz. Med en mjuk prescaler med ett högsta värde på 15 kan vi få till tiden visas varje rad ner till ca 133 kHz. Detta skulle inte vara möjligt med en hårdvara prescaler. Hur som helst, låt oss gå vidare.

När vi når den mjuka prescaler max vi först bestämma vilken rad vill vi Visa. Varje gång avbryta bränderna visas bara en enda rad. Detta händer så snabbt att ögonen inte kan se ändringarna och så bilden ser solid. Denna teknik kallas multiplexing och det används för massor av applikationer. Så här anger du den aktuella raden lägger vi först till en till att öka på rad och sedan mod det med 8 så att värdet alltid kommer någonstans mellan 0-7. Sedan skickar vi ritningen för den aktuella raden till funktionen SPI_transmitt för att överföra uppgifterna till 595s. Efter att vi satt en av Port D stift hög motsvarande till den aktuella raden. Minns dessa stift är anslutna till ULN2803s. Slutligen, vi återställa den mjuka prescaler för att noll och gör det igen.

Det är ganska mycket det. Alla andra funktioner stöder bara dessa två. Definitivt kolla upp dem i den bifogade uppförandekoden.

Se Steg
Relaterade Ämnen

LED Etch-a-Sketch

min LED Etch-a-Sketch är min första helt färdiga elektronik projekt. Jag använder fyra 8 x 8 ledde matriser för att göra en 16 x 16 ledde matrisen ritning yta. Två potentiometrar tillåter indata från användaren för kolumn- och rörelse, medan två tilt...

Arduino Etch-A-Sketch Clock

jag har sett olika Arduino drivs Etch-A-Sketch klockor på nätet, men ingen med instruktioner (är det någon slags hemlig? Någon planerar på att göra det rika på den globala marknaden för Etch-A-Sketch klockan?). Jag har använt Arduino, men aldrig anvä...

Virtuella Etch A Sketch

Etch A Sketch: berömda, kreativ och unik. Tyvärr har jag ingen aning Vart är en från min barndom, så jag bestämde mig att göra min egen virtuella! Kontrollera ut (och min hemska ritning färdigheter) nedan.Denna Etch A Sketch är ganska likt originalet...

Electroluminescent Etch A Sketch

Hi, aftergetting några electroluminescent grejer för en övning för http://hci.rwth-aachen.de/mcp1314 att leka, det är mitt (första) försöka bygga en elektroluminiscent EAS (och göra en Instructable:-):Jag använde:-en Etch A Sketch (ganska självklart...

Etch A Sketch laserskärare baserade Arduino.

i detta projekt tar jag en Arduino Mini Pro ansluta den till en anpassad gjort Etch A Sketch panel och använda den för att styra en Blacknose laser cutter. Resultatet är timmar galen laser skärning roligt, som vi kommer att ta runt de flesta av UK Ma...

Fyrfärg LED cyber passar! (ytterligare instructables för NES Powerglove kontroll, Live Audio EQ, osv. att följa!)

** Kredit till LVL1 Hackerspace för att starta mig i riktning mot LED besatthet och med förbindelser till vissa personer som har varit fantastiska resurser under år www.lvl1.org **Jag kunde bara inte motstå att skapa en instructable för en "Göra det...

Avsnitt 15: Hacka en Etch-A-Sketch att rita cirklar

vi på dumma uppfinningar älskar Etch-A-Sketch, men vi saknar konstnärlig talang för att rita något bra på klassiska leksaken.Så kom vi fram till ett enkelt och billigt sätt att hacka Etch-A-Sketch så att inte bara kan du rita det gamla sättet, men du...

Etch-a-Sketch LOGO - EASiLOGO

Vad får du om du korsar en sköldpadda med en Etch-a-Sketch?Etch-A-Sketch interaktiva LOGO - "EASiLOGO"!Detta är den första programmeringsspråk som utformats speciellt för världen berömda leksaken från Ohio Arts - Etch-a-Sketch. Om du aldrig sett...

IPad Etch-A-Sketch ringer upp

Få tillbaka den gamla goda tiden med en DIY Etch-A-Sketch ratten som fungerar på en Tablet PC eller smarta telefon! Detta instructable kommer att lära dig hur man gör en fysisk ratten för din enhet. Det är särskilt utformade för att se och agera som...

SK3TCH - balans ombord kontrollerade Etch-A-Sketch

SK3TCHHur man använder en Wii Balance Board för att styra en Etch-A-SketchEndast WindowsInnehåll:1. intro och reservdelar2. växlar3. bygga ramen4. montage5. ansluta WiiMote och Balance Board6. GlovePIE7. Arduino + motorstyrning8. bearbetning9. kör de...

Hur man ställa in A Permanent Etch A Sketch (som proffsen)

som an Etch A Sketchist mig själv, jag känner att det värsta någon EAS artist kan göra för sig själva är att alltför få knutna till en av deras "skiss Works". Jag har sett detta hända innan och konstnärer har blivit galen försöker skydda sina ko...

VHDL Etch-a-Sketch

För våra CPE 133 slutliga projektet på Cal Poly, San Luis Obispo, vi byggde ett Etch-a-Sketch med VHDL på Diligant nexys 3 styrelsen. En nexys 3 styrelse som kan bygga logiska kretsar utan att oroa om komplicerade externa gränssnitt, och mer avancera...

Etch-i-Sketch

"Vi inte kan konkurrera med det!"--Steve Jobs('s doppleganger)"Zune? Vad tänkte vi? Detta är vad vi behöver. "--Bill Gates('s likely thoughts)"Men behöver en strömkälla ruiner poängen..."--Ohio Art('s worthless opinion)Trött...

$100 väggmålning ritning robot (fungerar även som en gigantisk etch-a-sketch)

på hacka-en-dag!Vad jag gillar med robotar är att du kan göra en sak som gör andra saker. Så meta! Den använder gcode Rita någon bild du, eller du kan köra runt som en etch-a-sketch. Du kan skala denna robot upp till nästan alla storlekar. Versionen...

NES kontrollerade Etch-A-Sketch

Ritning på en etch-a-sketch med en original Nintendo controller. Jag ansluten etch-a-sketch vreden till stegmotorer, som sedan kontrolleras av en Arduino mikrokontroller. Arduino programmet skrev jag tar signaler från NES controller och skickar dem s...

Arduino kontrollerade Pocket Etch A Sketch slumpmässig promenad simulering

detta projekt är resultatet av Wal-Mart utcheckning lane impulsköp av fickformat Etch A Sketch för $3,99.Två stegmotorer Etch A Sketch knopp drivaxlar och en servomotor vänder Etch A Sketch om du vill radera skärmen. Med hjälp av Arduino IDE Serial M...

Etch-a-sketch skapelser

jag nyligen hittade en etch-a-sketch i min garderob och blev intresserad i ritningen med det. Jag drar mestadels bilder från böcker medan jag sitter i engelska klass eller bilder från affischer i andra klasser. Det är ett bra sätt att använda din tid...

50.000 volt etch-a-sketch!

Hej, detta instructable är avsedd för människor bara lära sig hur man får in bygga enheter som har en x / y rörelse förmåga, men detta är inte, och är inte avsedd att vara en CNC eller stepper enheten.VARNING ***Först och främst, om du väljer att gå...

Etch-a-Sketch - w/Arduino & bearbetning

jag gjorde detta en för att lära sig om bearbetning och hur det integreras med Arduino.I grund och botten är vad jag har denna:En Arduino Duemilenova som är inrymt i en gammal bandet Säkerhetsfack. Arduinoen har 2 potentiometrar fäst vid den. En repr...