Mellanliggande Arduino: Ingångar och utgångar (6 / 9 steg)
Steg 6: Ledde matrisen Multiplexing
Nu tråd upp alla marken stiften LED matris till stift 6-13 på Arduino. Här är pin-anslutningar:
rad 1 - Arduino D6 (digital stift 6)
rad 2 - Arduino D7
rad 3 - Arduino D8
rad 4 - Arduino D9
rad 5 - Arduino D10
rad 6 - Arduino D11
rad 7 - Arduino D12
rad 8 - Arduino D13
Och köra följande kod:
void setup() {
stift 6-13 som utgångar och initiera högt (så alla lampor släckta att starta)
för (int pinNum = 6; pinNum < 14; pinNum ++) {
pinMode (pinNum, produktionen);
digitalWrite (pinNum, hög);
}
ställa in stift A0-A6 som utgångar
för (int pinNum = A0; pinNum < A6; pinNum ++) {
pinMode (pinNum, produktionen);
}
ställa in stift 2 och 3 som utgångar
för (int pinNum = 2; pinNum < 4; pinNum ++) {
pinMode (pinNum, produktionen);
}
}
void loop() {
för (int pinNum = 6; pinNum < 14; pinNum ++) {
Ställ in kolumner
digitalWrite (A0, låg);
digitalWrite (A1, hög);
digitalWrite (A2, låg);
digitalWrite (A3, hög);
digitalWrite (A4, låg);
digitalWrite (A5, hög);
digitalWrite (2, låg).
digitalWrite (3, hög).
puls rad låg till light lysdioder
digitalWrite (pinNum, låg);
Delay(500);
digitalWrite (pinNum, hög);
}
}
Du bör se samma mönster av lysdioder lyser upp en rad i taget (andra bilden) som varje rad är jordad en efter en. Nu försöker du minska förseningen, mönstret kommer att flytta över raderna snabbare och snabbare. Ta nu bort fördröjningen helt, bör du se alla rader tände på (något som verkar vara) samma tid (tredje bilden). Här är en video demonstration (denna gång, med olika mönster för att lysa upp varje rad, jag ska förklara mer om att snart):
Detta kallas multiplexing. Även om det ser ut som vi tända upp många rader av lysdioder på samma gång, vet vi att vi faktiskt belysning varje rad en efter en, men vi gör det så snabbt som vi har våra ögon luras tänkande det allt händer samtidigt. Multiplexing är användbart helst vill styra en hel del saker med relativt få stift. Istället för kabeldragning upp varje LED individuellt, kan vi multiplex dem och skära ner på kostnader och krångel betydligt.
Prova nu att skicka olika mönster till olika rader:
void setup() {
stift 6-13 som utgångar och initiera högt
för (int pinNum = 6; pinNum < 14; pinNum ++) {
pinMode (pinNum, produktionen);
digitalWrite (pinNum, hög);
}
ställa in stift A0-A6 som utgångar
för (int pinNum = A0; pinNum < A6; pinNum ++) {
pinMode (pinNum, produktionen);
}
ställa in stift 2 och 3 som utgångar
för (int pinNum = 2; pinNum < 4; pinNum ++) {
pinMode (pinNum, produktionen);
}
}
void loop() {
för (int pinNum = 6; pinNum < 14; pinNum ++) {
om (pinNum%2==1){//is pinNum är udda
en godtycklig uppsättning stater
digitalWrite (A0, hög);
digitalWrite (A1, låg);
digitalWrite (A2, hög);
digitalWrite (A3, låg);
digitalWrite (A4, hög);
digitalWrite (A5, låg);
digitalWrite (2, hög).
digitalWrite (3, låg).
} annat {
en godtycklig uppsättning olika stater
digitalWrite (A0, låg);
digitalWrite (A1, hög);
digitalWrite (A2, låg);
digitalWrite (A3, hög);
digitalWrite (A4, låg);
digitalWrite (A5, hög);
digitalWrite (2, låg).
digitalWrite (3, hög).
}
digitalWrite (pinNum, låg);
Delay(500);
digitalWrite (pinNum, hög);
}
}
Kör denna kod långsamt först, ser vi att en rad skickas ett mönster, och nästa rad skickas olika mönster, detta växlar över alla rader i matrisen. Här är hur jag gör detta:
om (pinNum%2==1){//is pinNum är udda
% kallas "modulo", det är som division, men istället för att återvända pinNum/2, den returnerar resten av insatsen. Så om pinNum = 6, pinNum %2 = 0, eftersom 2 går in i 6 jämnt. Om pinNum = 7, då pinNum %2 = 1. Detta ger mig ett enkelt sätt att räkna ut vilka rader som är jämna nummer och som är udda. Med denna information kan skicka jag olika mönster för alternerande rader.
Nu tar du bort förseningen från koden. Du bör se ett schackbrädesmönster dyka upp på LED matrix (fjärde bilden). Genom att skicka ett annat mönster till varje rad och cykling genom raderna individuellt, kan du styra exakt vilka lysdioder är på och av. Försök med följande:
void setup() {
stift 6-13 som utgångar och initiera högt
för (int pinNum = 6; pinNum < 14; pinNum ++) {
pinMode (pinNum, produktionen);
digitalWrite (pinNum, hög);
}
ställa in stift A0-A6 som utgångar
för (int pinNum = A0; pinNum < A6; pinNum ++) {
pinMode (pinNum, produktionen);
}
ställa in stift 2 och 3 som utgångar
för (int pinNum = 2; pinNum < 4; pinNum ++) {
pinMode (pinNum, produktionen);
}
}
void loop() {
för (int pinNum = 6; pinNum < 14; pinNum ++) {
om (pinNum == 8) {
digitalWrite (A5, hög);
} annat {
digitalWrite (A5, låg);
}
digitalWrite (pinNum, låg);
digitalWrite (pinNum, hög);
}
}
Denna kod kommer bara in A5 hög för raden ansluten till stift 8. Detta lyser upp endast ett LED i matrisen (femte bild).