Charlieplexing with 12 LEDs
We hebben al een project gezien om met 3 pins 6 LEDs aan te sturen. Nu gaan we een stapje verder en het met 12 LEDs proberen.
Aantal LEDs = n^2 - n
We vullen voor n nu een 4 in. 4-kwadraat - 4 = 16 - 4 = 12. Op de kabeltjes uit de Arduino kaan een HOOG spanning zitten, een LAAG spanning of GEEN spanning. In het schema zijn alle mogelijke waarden hiervoor gegeven. Hiervoor is eerst HOOG op 2 gezet (vertikaal) De laag kan dan op 3, 4 of 5 staan. Dan de HOOG op pin3 gezet. De LAAG kan dan op 2, 4 of 5. Enzo verder. Er zijn 4 plaatsen waar HOOG kan staan (2, 3, 4 em 5) Per positie van HOOG zijn er 3 plaatsen waar LAAG kan staan. Zo komen we op 12 mogelijkheden.
Aansluiten
Het aansluiten lijkt op het eerste gezicht een kleine ramp. Maar eigenlijk is het best wel eenvoudig als je de volgende volgorde aanhoud. Er zijn 4 verbindingen naar het breadboard vanuit de Arduino, hang hier meteen een weerstand aan, dan hoef je enkel door te lussen.
Voor het verdere aansluiten begin je met de Pin2 kabel. Deze gaat naar de + van led1. Daarna door (!) naar de - van led2, door naar de + van led7 en dan verder naar de - van led8, tot slot naar de + van led11 om te eindigen bij de - van led12. Je zit om deze aan te sluiten heb ik maar 6 kabels met pin nodig (plus de ene kabel voor de connectie met de Arduino). Ook voor de andere pins gaat dit zo.
Breadboard
Links staan hier de kabels die van de Arduino komen. Daar aangesloten op poort 2, 3, 4 en 5.
De gebruikte kleuren, die we gebruiken bij het doorlussen heb ik in het schema aangehouden. Begin met de rode draad vande de weerstand, naar de plus (HOOG) van LED1. Daarna door naar plus van LED2 en verder. Ik heb tussen iedere LED een lege rij gehouden. Hierdoor oogt het overzichtelijker.
Source code
/*
   Charlieplexing with 6 LEDs
   (C) copyright www.punthooft.nl 2019-2025
*/
// Constant
int values[][2] = { 
  { 2, 3 }, { 2, 4 }, { 2, 5 },
  { 3, 2 }, { 3, 4 }, { 3, 5 },
  { 4, 2 }, { 4, 3 }, { 4, 5 },
  { 5, 2 }, { 5, 3 }, { 5, 4 }
};
// Variables
int current = 0;      // Current active LED
// Setup function runs once when powerup the board and on reset
void setup() {
   // Nothing for now
}
// The loop function runs over and over again forever
void loop() {
   current++;
   if (current>12) {
      current = 1;
   }
  for(int i=1;i<=12;i++) {
    setNone(i);
  }
  
  setHigh(values[current-1][0]);
  setLow(values[current-1][1]);
  delay(100);
}
void setHigh(int pin) {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH);
}
void setLow(int pin) {
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
}
void setNone(int pin) {
  pinMode(pin, INPUT);
}
Opmerkingen
Bij de werking van deze routine, gaf ik al aan dat eigenlijk alleen de HOOG en LAAG interessant zijn. Deze waarden nemen we dan ook op in een array. In de loop kijken we per
current
op welke pin er HOOG of LAAG moet staan en zetten die aan. De andere pins staan dan al uit. Omdat de LED begint te tellen bij 0, moeten we 1 van de current afhalen. In de array staat de pin voor HOOG op positie [0] en de LAAG waarde op [1].
En ook hier, om de LED's te beschermen tegen teveel spanning zijn voorschakelweerstanden nodig. Een weerstand per LED. Ik gebruik er hier van 220 Ohm. De te gebruiken weerstandswaarde is echter afhankelijk van het type/soort/kleur van de LED. Uitrekenen is eenvoudig, zie de theorie in componenten of gebruik meteen de rekenhulp