Stap 6: LED Matrix Multiplexing
Nu kabellengte tot de grond alle pennen van de LED-matrix te pinnen 6-13 van de Arduino. Hier zijn de pin aansluitingen:
rij 1 - Arduino D6 (digitale pin 6)
rij 2 - Arduino D7
rij 3 - Arduino D8
rij 4 - Arduino D9
rij 5 - Arduino D10
rij 6 - Arduino D11
rij 7 - Arduino D12
rij 8 - Arduino D13
En voer de volgende code:
void setup(){ //set pins 6-13 as outputs and initialize HIGH (so all LEDs are off to start) for (int pinNum=6;pinNum<14;pinNum++){ pinMode(pinNum, OUTPUT); digitalWrite(pinNum, HIGH); } //set pins A0-A6 as outputs for (int pinNum=A0;pinNum<A6;pinNum++){ pinMode(pinNum, OUTPUT); } //set pins 2 and 3 as outputs for (int pinNum=2;pinNum<4;pinNum++){ pinMode(pinNum, OUTPUT); } } void loop(){ for (int pinNum=6;pinNum<14;pinNum++){ //set columns digitalWrite(A0, LOW); digitalWrite(A1, HIGH); digitalWrite(A2, LOW); digitalWrite(A3, HIGH); digitalWrite(A4, LOW); digitalWrite(A5, HIGH); digitalWrite(2, LOW); digitalWrite(3, HIGH); //pulse row low to light LEDs digitalWrite(pinNum, LOW); delay(500); digitalWrite(pinNum, HIGH); } }
Je ziet hetzelfde patroon van LEDs oplichten één rij tegelijk (tweede afbeelding) zoals elke rij geaard één voor één is. Probeer nu de vertraging te verkleinen het patroon zal bewegen langs de rijen sneller en sneller. Nu de vertraging volledig te verwijderen, moet u alle rijen ontstoken bij (wat lijkt te zijn) en tegelijkertijd (derde afbeelding). Hier is een video demonstratie (deze keer, met behulp van verschillende patronen aan het licht van elke rij, ik zal uitleggen meer over dat binnenkort):
Dit heet multiplexing. Ook al lijkt het alsof we bent verlichting van vele rijen voor LEDs op hetzelfde moment, weten we dat we eigenlijk bent verlichting elke rij één voor één, maar we het zo snel dat we onze ogen hebt bedrogen in het denken doen, die het gebeurt allemaal tegelijk. Multiplex is handig elk moment wilt controleren van een heleboel dingen met relatief weinig pinnen. In plaats van bedrading individueel op elke LED, kunnen we hen multiplex, bezuinigen op de kosten en gedoe aanzienlijk.
Nu proberen verschillende patronen te sturen naar verschillende rijen:
void setup(){ //set pins 6-13 as outputs and initialize HIGH for (int pinNum=6;pinNum<14;pinNum++){ pinMode(pinNum, OUTPUT); digitalWrite(pinNum, HIGH); } //set pins A0-A6 as outputs for (int pinNum=A0;pinNum<A6;pinNum++){ pinMode(pinNum, OUTPUT); } //set pins 2 and 3 as outputs for (int pinNum=2;pinNum<4;pinNum++){ pinMode(pinNum, OUTPUT); } } void loop(){ for (int pinNum=6;pinNum<14;pinNum++){ if (pinNum%2==1){//is pinNum is odd //some arbitrary set of states digitalWrite(A0, HIGH); digitalWrite(A1, LOW); digitalWrite(A2, HIGH); digitalWrite(A3, LOW); digitalWrite(A4, HIGH); digitalWrite(A5, LOW); digitalWrite(2, HIGH); digitalWrite(3, LOW); } else { //some arbitrary set of different states digitalWrite(A0, LOW); digitalWrite(A1, HIGH); digitalWrite(A2, LOW); digitalWrite(A3, HIGH); digitalWrite(A4, LOW); digitalWrite(A5, HIGH); digitalWrite(2, LOW); digitalWrite(3, HIGH); } digitalWrite(pinNum, LOW); delay(500); digitalWrite(pinNum, HIGH); } }
U kunt deze code langzaam uitvoert op het eerste, zien we dat één rij wordt een patroon, verzonden en de volgende rij wordt verzonden een ander patroon, dit wisselt over alle rijen in de matrix. Hier is hoe doe ik dit:
Als (pinNum%2==1){//is pinNum oneven is
% heet "modulo", it's like divisie, maar in plaats van retourneren pinNum/2, wordt de rest van deze operatie. Dus als pinNum = 6, pinNum %2 = 0, omdat 2 in 6 gelijkmatig gaat. Als pinNum = 7, dan is pinNum %2 = 1. Dit geeft mij een gemakkelijke manier van het uitzoeken welke rijen zijn even getallen en welke oneven. Met behulp van deze informatie, kan ik verschillende patronen aan rijen afwisselend sturen.
Nu probeer het verwijderen van de vertraging van de code. U ziet een dambordpatroon ontstaan op de LED-matrix (vierde beeld). Door een ander patroon sturen naar elke rij en de rijen individueel doorlopen, kunt u precies die LEDs in- en uitschakelen. Probeer het volgende:
void setup(){ //set pins 6-13 as outputs and initialize HIGH for (int pinNum=6;pinNum<14;pinNum++){ pinMode(pinNum, OUTPUT); digitalWrite(pinNum, HIGH); } //set pins A0-A6 as outputs for (int pinNum=A0;pinNum<A6;pinNum++){ pinMode(pinNum, OUTPUT); } //set pins 2 and 3 as outputs for (int pinNum=2;pinNum<4;pinNum++){ pinMode(pinNum, OUTPUT); } } void loop(){ for (int pinNum=6;pinNum<14;pinNum++){ if (pinNum==8){ digitalWrite(A5, HIGH); } else { digitalWrite(A5, LOW); } digitalWrite(pinNum, LOW); digitalWrite(pinNum, HIGH); } }
Deze code zal alleen voor de rij aangesloten op pin 8 A5 hoog ingesteld. Dit brandt maar één LED in de matrix (vijfde afbeelding).