Stap 4: programmeren
Zoals in stap 3 gezegd, we HIGHLY recommend kijken naar deze video: http://www.youtube.com/watch?v=FehBLNHMlfo. Het laat zien hoe eigenlijk verbinden met de Arduino de TLCs in de eerste plaats, dus het is een geweldige plek om te beginnen. Zoveel programmering, wij verdelen het werk onder twee Arduinos en kreeg van hen te communiceren. De volgende programma's zijn eenvoudig kader voor een eindproduct. De LED Driver Arduino is voltooid, terwijl de Controller gewoon een shell is voor wat u wenst te programmeren van het bord te doen:LED Driver-Arduino:
Texas Instruments TLC 5940 met Arduino
Met de hulp van www.kevindarrah.com
#include < SPI.h > //Serial Peripheral Interface Library
Omvatten de gemakkelijk Tranfer-Lib
#include < EasyTransfer.h >
EasyTransfer ET;
Dit moet precies hetzelfde zijn op de andere Arduino
struct RECEIVE_DATA_STRUCTURE {}
int LEDGrid [18];
};
int LEDData [18];
RECEIVE_DATA_STRUCTURE matrix;
byte ch = 0, chbit = 0, spibit = 0, spibyte = 0; / / variabelen gebruikt door tlc sub routine
int SINData; //variable gebruikt voor het verplaatsen van gegevens naar de TLC
byte transferbyte [48] ;// bytes die worden uitgezonden om de tlc5940 via SPI
48 want 16 @ 12bits kanalen geeft 384bits, 384/8 = 48 bytes, 12 bits naar 8 bits conversie
byte DCvalue [32]; / / 0-63, 6 bits DOT correctie Bytes
int i, j, k, l, m, n; misc variabelen
int count = 0;
//*******************************************************************************************
//*******************************************************************************************
void setup {/ / MAIN SETUP MAIN SETUP MAIN SETUP MAIN SETUP MAIN SETUP
ET.begin(details(matrix), & Serial);
pinMode (7, OUTPUT); //XLAT
pinMode (3, OUTPUT); //OSC2B GSCLK
pinMode (4, OUTPUT); //VPRG
pinMode (11, OUTPUT); //MOSI gegevens
pinMode (13, OUTPUT); //SPI klok
Pin 5 is de blanco
Instellen van de SPI
SPI.setBitOrder (MSBFIRST), //Most significante Bit eerste
SPI.setDataMode(SPI_MODE0); / / Mode 0 Rising rand van gegevens, houd clock laag
SPI.setClockDivider (SPI_CLOCK_DIV4), //Run de gegevens in van 16MHz/4-4MHz
voor (ik = 0; ik < 48; i ++) //clear grijs schaal gegevens
transferbyte [i] = 0;
voor (ik = 0; ik < 32; i ++) //set Dot correctie gegevens aan max (63 voor 6 bits decimaal)
DCvalue [i] = 63;
Serial.begin (9600); //debugging?
DOT correctie instellen
DotCorrection(); / / sub routine helpt
noInterrupts(); / / instellen van de items, dus niet ingaan op interrupts
TCCR2A = B00010010; //Timer 2 ingesteld op de vergelijk modus schakelen pin 5 @ 8MHz, Arduino Digital 3
TIMER 2 IS GSCLCK
Timer 2 prescaler ingesteld op 1, 16/1 = 16 MHz, maar Knevels pin 5 elke andere cyclus, 8MHz
TCCR2B = B00000001;
TCCR1A = B00000000; //Timer 1 niet om het even wat, gebruikt voor het tellen van in-/ uitschakelen
Timer 1 prescaler ingesteld op Fclk/256
Waarom? We moeten rekenen 4096 pulsen uit Timer 2 - pin 5
8 MHz = 1 pulse elke 125ns--4096 pulsen zou moeten 512us
Timer 1 prestatiestatus 16MHz/256 = 62,5 kHz, moeten we een match op elke 512us
Kortom, ik kan krijgen een interrupt te krijgen genoemd elke 512us, dus...
Ik moet lopen Timer 2 @ 8MHz voor 512us te krijgen van 4096 pulsen
Ik kan niet tellen die pulsen rechtstreeks (te snel), dus
Ik zal rekenen met behulp van Timer 1, waardoor een telling elke 16us
De teller begint bij 0, dus we zullen het ingesteld op 31 om een interrupt na 512us
TCCR1B = B00001100; //Mode=CTC met OSCR1A = TOP en 256 als de prescaler
Masker van set up, noem ISR (Inerrupt Service Routine) voor vergelijk wedstrijd op A
TIMSK1 = B00000010;
Dit zijn de waarden van de wedstrijd voor de items
0 hier betekent, wordt deze aangepast aan op een cyclus van de klok/prescaler
OCR1A = 31; //to krijgen onze Interrupt 512us
interrupts(); / / kick off van de timers!
attachInterrupt (0, update, stijgt);
48
voor (ik = 0; ik < 48; i ++) //wipe uit de gegevens in tlc
TLC (i, 0); / / Dit is hoe u het bijwerken van de LED's, tlc is een subroutine met twee ingangen
TLC(Channel, value) kanaal is in dit geval 0-32 en waarde is 0-4095 taakcyclus
4095 is 100% op
pinMode (5, OUTPUT); //BLANK wij opgericht deze pin hier, dus het blijft in een hoge impedantie
staat in het Configuratiemenu, anders de LEDs gek! zelfs als je dit hoge schrijven
for (int i = 0; ik < 22; i ++) {}
TLC((i*3),4095);
}
delay(100);
for (int i = 0; ik < 22; i ++) {}
TLC((i*3),0);
}
for (int i = 0; ik < 22; i ++) {}
TLC((i*3)+1,4095);
}
delay(100);
for (int i = 0; ik < 22; i ++) {}
TLC((i*3)+1,0);
}
for (int i = 0; ik < 22; i ++) {}
TLC((i*3)+2,4095);
}
delay(100);
for (int i = 0; ik < 22; i ++) {}
TLC((i*3)+2,0);
}
}
void loop {/ / MAIN LOOP MAIN LOOP MAIN LOOP MAIN MAIN LOOP MAIN LOOP LOOP
updateLED();
Dit zou een goede plek om animaties zetten wijten aan het feit dat u gebruik van alle maken kunt
van de kleur combo's, niet enkel 10 of zo.
}
ISR(TIMER1_OVF_vect) {}
} / / Over limiet vlag onderbreken je hoeft dit zelfs als u deze niet gebruikt
ISR(TIMER1_COMPB_vect) {}
} / / Vergelijk B - niet gebruikt
ISR(TIMER1_COMPA_vect) {/ / onderbreken om te tellen van 4096 pulsen op GSLCK
PORTD | = 1 << 5; / / Schrijf leeg HIGH om te herstellen van de 4096-balie in de TLC
PORTD | = 1 << 7; / / Schrijf hoge XLAT om te haken in de gegevens van de laatste gegevensstroom
PORTD & = ~ (1 << 7); //XLAT kan nu laag gaan
PORTD & = ~ (1 << 5); //Blank gaat laag om te beginnen de volgende cyclus
SPI.end (); //end de SPI zodat we naar de pin klok schrijven kunnen
PORTB | = 1 << 5; / / SPI klok pin te geven het extra aantal
PORTB & = ~ (1 << 5); / / de data sheet zegt je dit om wat voor reden nodig?
SPI.begin(); / / de SPI start back-up
voor (SINData = 95; SINData > = 0; SINData--) {/ / de gegevens afgeven!
SPI.transfer(transferbyte[SINData]); / / de SPI-poort alleen begrijpt bytes-8 bits breed
De TLC moet 12 bits voor elk kanaal, dus 12 bits keer 64 kanalen geeft 768 bits
768/8 = 96 bytes, 0-95
}
Graaf ++;
}
ongeldig updateLED() {}
ET.receiveData();
for (int i = 0; ik < 18; i ++) {}
Afdrukken wat er gaande
Serial.Print (matrix. LEDGrid[i]);
Serial.Print(",");
Schakelaar die de 0-10 gegevens ontvangt en dat wordt omgezet in kleuren.
schakelaar (matrix. LEDGrid[i]) {}
geval van 0: / / OFF
TLC(((3*i)),0);
TLC(((3*i)+1),0);
TLC(((3*i)+2),0);
breken;
geval 1: / / rood
TLC(((3*i)),4095);
TLC(((3*i)+1),0);
TLC(((3*i)+2),0);
breken;
geval 2: / / groen
TLC(((3*i)),0);
TLC(((3*i)+1),0);
TLC(((3*i)+2),4095);
breken;
Case 3: / / blauw
TLC(((3*i)),0);
TLC(((3*i)+1),4095);
TLC(((3*i)+2),0);
breken;
geval 4: / / paars
TLC(((3*i)),2000);
TLC(((3*i)+1),4095);
TLC(((3*i)+2),0);
breken;
geval 5: / / TEAL
TLC(((3*i)),0);
TLC(((3*i)+1),4095);
TLC(((3*i)+2),4095);
breken;
kast 6: / / geel
TLC(((3*i)),3000);
TLC(((3*i)+1),0);
TLC(((3*i)+2),4095);
breken;
geval 7: / / roze
TLC(((3*i)),4095);
TLC(((3*i)+1),3500);
TLC(((3*i)+2),3500);
breken;
geval 8: / / oranje
TLC(((3*i)),2232);
TLC(((3*i)+1),0);
TLC(((3*i)+2),1108);
breken;
zaak 9: / / LIGHT BLUE
TLC(((3*i)),1000);
TLC(((3*i)+1),4095);
TLC(((3*i)+2),2000);
breken;
zaak 10: / / wit
TLC(((3*i)),1500);
TLC(((3*i)+1),4095);
TLC(((3*i)+2),4095);
breken;
standaard:
TLC(((3*i)),100);
TLC(((3*i)+1),200);
TLC(((3*i)+2),200);
}
}
Serial.println("");
}
VOID tlc (int kanaal, int value) {/ / TLC aan UPDATE TLC aan UPDATE TLC aan UPDATE TLC naar UPDATE
Deze routine moet zo snel mogelijk gebeuren!!!
if(Value>4095)
waarde = 4095;
if(value<0)
waarde = 0;
We moeten de 12 bits waarde omzetten in een 8-bits BYTE, niet kan de SPI schrijven 12bits
We erachter te komen waar in alle van de bytes naar te schrijven, zodat we niet hoeft te afval tijd
Alles bijwerken
12 bits in de bytes, een begin van 12 bits zal bij 0 of 4 in een byte
spibit = 0;
Als (bitRead (kanaal, 0)) //if het lezen van de waarde oneven is, is het begin een 4
spibit = 4;
Dit is een vereenvoudiging van kanaal * 12 bits/8 bits
spibyte = int (kanaal * 3/2); //this assignes welke byte de 12 bit waarde begint in
voor (chbit = 0; chbit < 12, chbit ++ spibit ++) {/ / start rechtsaf waar de update zal gaan
if(spibit==8) {//during de 12 bit-cyclus, de limiet van byte zal worden bereikt
spibyte ++; //roll in de volgende byte
spibit = 0; //reset de bit tellen in de byte
}
Als (bitRead (waarde, chbit)) //check de waarde van 1's en 0's
bitSet (transferbyte [spibyte], spibit); //transferbyte is wat wordt geschreven naar de TLC
anders
bitClear (transferbyte [spibyte], spibit);
} //0-12 bits lus
}
VOID DotCorrection() {}
PORTD | = 1 << 4; //VPRG naar DC modus HIGH
spibyte = 0; //reset onze variabelen
spibit = 0;
voor (ch = 0; ch < 32; ch ++) {/ / 6 bit een stuk x 32-uitgangen
voor (chbit = 0; chbit < 6; chbit ++) {}
if(spibit==8) {}
spibyte ++;
spibit = 0;
}
Als (bitRead (DCvalue [ch], chbit)) //all 6 beetjes
bitSet (transferbyte [spibyte], spibit); //setting bit 7 van overdracht byte
anders
bitClear (transferbyte [spibyte], spibit);
spibit ++;
}
}
SPI.begin();
voor (j = spibyte; j > = 0; j--) {}
SPI.transfer(transferbyte[j]);
}
PORTD | = 1 << 7;
PORTD & = ~ (1 << 7);
PORTD & = ~ (1 << 4); //VPRG is goed om te gaan in de normale modus laag
}
Arduino controller:
/*
Gegevens lezen:
0: ECHT OFF NU
1: RODE IDK
2: GROENE SPELEN
3: BLUE NOTE
4: PURPLE BAR
5: TEAL -
6: GELE -
7: ROZE -
8: ORANGE -
9: L-BLUE -
10: WIT -
DEF:TEST-
*/
De bovenstaande gegevensverzameling komt overeen met de kleurgegevens gedefinieerd in de LED Driver Arduino
Omvatten de gemakkelijk Tranfer-Lib
#include < EasyTransfer.h >
EasyTransfer ET;
Dit moet precies hetzelfde zijn op de andere Arduino
struct SEND_DATA_STRUCTURE {}
int LEDGrid [18];
};
SEND_DATA_STRUCTURE matrix;
//----------------------------Variables-------------------------
int buttonRaw [6] [3];
int LEDData [6] [3];
//--------------------------------------------------------------
VOID Setup {}
Seriële beginnen op 9600 - foutopsporing
Serial.begin(9600);
EasyTransfer begint
ET.begin(details(matrix), & Serial);
Pennen 7-9 worden gebruikt voor de knop draden
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
Define spreker poort - niet daadwerkelijk gebruikt in dit shellprogramma
pinMode (2, OUTPUT);
buttonCheck();
}
//------------------------------Setup---------------------------
void loop {}
buttonCheck();
Update();
Eigenlijk programma toevoegen in deze ruimte. Lees de knop waarden, stelt de
lichten en geluiden afspelen. Haar alles aan jou. Dit is het kader
voor wat je wilt.
}
//-----------------------------Programs--------------------------
Updater: toevoegen werkelijke licht verzenden van mechanica. Gewoon instellen LEDData [x] [y]
matrix-coördinaat die met het juiste licht naar een getal overeenkomt
van 0 tot en met 10 als omschreven op de top van dit programma.
VOID update() {}
voor (int y = 0; y < 3; y ++) {}
voor (int x = 0 x < 6; x ++) {}
matrix. LEDGrid [gridCount] = LEDData [x] [y];
gridCount ++;
}
delay(5);
}
gridCount = 0;
ET.sendData();
}
//-------------------
Check-knop: knop waarden controleert en slaat dat ONBEWERKTE gegevens naar een matrix.
De volgorde gaat van (0,0)-(6,0), vervolgens (0,1)-(6,1), enz. Deze gegevens kunnen
worden gebruikt om te schakelen van waarden, enz.
ongeldig buttonCheck() {}
voor (int y = 0; y < 3; y ++) {}
digitalWrite(7+y,HIGH);
voor (int x = 0; x < 6; x ++) {}
buttonRaw [x] [y] = analogRead (x);
}
digitalWrite(7+y,LOW);
}
}