Pilotare molti led con pochi pin di Arduino

Ciao!

oggi vi parlo di un trucchetto molto utile nel caso necessitiate di controllare molti led con pochi pin a disposizione.


Il metodo, che si chiama Charlieplexing, sfrutta la possibilità dei pin dei microcontrollori di assumere 3 stati logici: high, low e input.

Infatti solitamente per pilotare un led si imposta il pin come output (pinMode(pin,OUTPUT) e poi si porta a livello alto o basso per accendere o spegnere il led (digitalWrite (pin, HIGH).

Ma esiste una terza possibilità, settare il pin come input (pinMode(pin, INPUT). Questo porta il pin nella modalità ad alta impedenza, risultando come se fosse scollegato dal led (o quasi)

Questo è un circuito sul quale è applicato questo metodo:


Come potete vedere tra ogni coppia di pin sono stati montati 2 del in antiparallelo, quindi con anodo e catodo opposti.
con soli 4 pin è possibile pilotare 12 led, numero che può crescere esponenzialmente aumentando i pin utilizzati.

Il cicuito che ho realizzato sopra è realizzato con Tinkercad, a questo link è possibile testarne il funzionamento (è già caricato anche il firmware).
Per completezza allego il codice anche qui sotto:

  1. #define PIN_A 2
  2. #define PIN_B 3
  3. #define PIN_C 4
  4. #define PIN_D 5
  5.  
  6. void setup()
  7. {
  8. }
  9.  
  10. void loop()
  11. {
  12.   for (int i=0; i<13; i++)
  13.   {  
  14.     ledOn(i);
  15.     delay(10);
  16.   }
  17. }
  18.  
  19. void ledOn(int num)
  20. {
  21.   switch(num)
  22.   {
  23.     case 0:
  24.     pinMode (PIN_A, INPUT);
  25.     pinMode (PIN_B, INPUT);
  26.     pinMode (PIN_C, INPUT);
  27.     pinMode (PIN_D, INPUT);
  28.     digitalWrite (PIN_A, LOW);
  29.     digitalWrite (PIN_B, LOW);
  30.     digitalWrite (PIN_C, LOW);
  31.     digitalWrite (PIN_D, LOW);
  32.     break;
  33.     case 1:
  34.     pinMode (PIN_A, OUTPUT);
  35.     pinMode (PIN_B, OUTPUT);
  36.     pinMode (PIN_C, INPUT);
  37.     pinMode (PIN_D, INPUT);
  38.     digitalWrite (PIN_A, HIGH);
  39.     digitalWrite (PIN_B, LOW);
  40.     digitalWrite (PIN_C, LOW);
  41.     digitalWrite (PIN_D, LOW);
  42.     break;
  43.     case 2:
  44.     pinMode (PIN_A, OUTPUT);
  45.     pinMode (PIN_B, OUTPUT);
  46.     pinMode (PIN_C, INPUT);
  47.     pinMode (PIN_D, INPUT);
  48.     digitalWrite (PIN_A, LOW);
  49.     digitalWrite (PIN_B, HIGH);
  50.     digitalWrite (PIN_C, LOW);
  51.     digitalWrite (PIN_D, LOW);
  52.     break;  
  53.     case 3:
  54.     pinMode (PIN_A, INPUT);
  55.     pinMode (PIN_B, OUTPUT);
  56.     pinMode (PIN_C, OUTPUT);
  57.     pinMode (PIN_D, INPUT);
  58.     digitalWrite (PIN_A, LOW);
  59.     digitalWrite (PIN_B, HIGH);
  60.     digitalWrite (PIN_C, LOW);
  61.     digitalWrite (PIN_D, LOW);
  62.     break;  
  63.     case 4:
  64.     pinMode (PIN_A, INPUT);
  65.     pinMode (PIN_B, OUTPUT);
  66.     pinMode (PIN_C, OUTPUT);
  67.     pinMode (PIN_D, INPUT);
  68.     digitalWrite (PIN_A, LOW);
  69.     digitalWrite (PIN_B, LOW);
  70.     digitalWrite (PIN_C, HIGH);
  71.     digitalWrite (PIN_D, LOW);
  72.     break;  
  73.     case 5:
  74.     pinMode (PIN_A, INPUT);
  75.     pinMode (PIN_B, INPUT);
  76.     pinMode (PIN_C, OUTPUT);
  77.     pinMode (PIN_D, OUTPUT);
  78.     digitalWrite (PIN_A, LOW);
  79.     digitalWrite (PIN_B, LOW);
  80.     digitalWrite (PIN_C, HIGH);
  81.     digitalWrite (PIN_D, LOW);
  82.     break;  
  83.     case 6:
  84.     pinMode (PIN_A, INPUT);
  85.     pinMode (PIN_B, INPUT);
  86.     pinMode (PIN_C, OUTPUT);
  87.     pinMode (PIN_D, OUTPUT);
  88.     digitalWrite (PIN_A, LOW);
  89.     digitalWrite (PIN_B, LOW);
  90.     digitalWrite (PIN_C, LOW);
  91.     digitalWrite (PIN_D, HIGH);
  92.     break;  
  93.     case 7:
  94.     pinMode (PIN_A, OUTPUT);
  95.     pinMode (PIN_B, INPUT);
  96.     pinMode (PIN_C, OUTPUT);
  97.     pinMode (PIN_D, INPUT);
  98.     digitalWrite (PIN_A, HIGH);
  99.     digitalWrite (PIN_B, LOW);
  100.     digitalWrite (PIN_C, LOW);
  101.     digitalWrite (PIN_D, LOW);
  102.     break;  
  103.     case 8:
  104.     pinMode (PIN_A, OUTPUT);
  105.     pinMode (PIN_B, INPUT);
  106.     pinMode (PIN_C, OUTPUT);
  107.     pinMode (PIN_D, INPUT);
  108.     digitalWrite (PIN_A, LOW);
  109.     digitalWrite (PIN_B, LOW);
  110.     digitalWrite (PIN_C, HIGH);
  111.     digitalWrite (PIN_D, LOW);
  112.     break;  
  113.     case 9:
  114.     pinMode (PIN_A, INPUT);
  115.     pinMode (PIN_B, OUTPUT);
  116.     pinMode (PIN_C, INPUT);
  117.     pinMode (PIN_D, OUTPUT);
  118.     digitalWrite (PIN_A, LOW);
  119.     digitalWrite (PIN_B, HIGH);
  120.     digitalWrite (PIN_C, LOW);
  121.     digitalWrite (PIN_D, LOW);
  122.     break;  
  123.     case 10:
  124.     pinMode (PIN_A, INPUT);
  125.     pinMode (PIN_B, OUTPUT);
  126.     pinMode (PIN_C, INPUT);
  127.     pinMode (PIN_D, OUTPUT);
  128.     digitalWrite (PIN_A, LOW);
  129.     digitalWrite (PIN_B, LOW);
  130.     digitalWrite (PIN_C, LOW);
  131.     digitalWrite (PIN_D, HIGH);
  132.     break;  
  133.     case 11:
  134.     pinMode (PIN_A, OUTPUT);
  135.     pinMode (PIN_B, INPUT);
  136.     pinMode (PIN_C, INPUT);
  137.     pinMode (PIN_D, OUTPUT);
  138.     digitalWrite (PIN_A, HIGH);
  139.     digitalWrite (PIN_B, LOW);
  140.     digitalWrite (PIN_C, LOW);
  141.     digitalWrite (PIN_D, LOW);
  142.     break;  
  143.     case 12:
  144.     pinMode (PIN_A, OUTPUT);
  145.     pinMode (PIN_B, INPUT);
  146.     pinMode (PIN_C, INPUT);
  147.     pinMode (PIN_D, OUTPUT);
  148.     digitalWrite (PIN_A, LOW);
  149.     digitalWrite (PIN_B, LOW);
  150.     digitalWrite (PIN_C, LOW);
  151.     digitalWrite (PIN_D, HIGH);
  152.     break;
  153.   }
  154. }

Chiaramente così facendo potete accendere solo un led alla volta, ma qui viene in contro un altro trucchetto. Infatti se passate tra un led ed un altro molto rapidamente, il vostro cervello viene ingannato e i led accesi contemporaneamente sembreranno 2. provate a realizzare il circuito sopra, e nello sketch mettere un delay molto basso (ad esempio 10 ms) i led sembreranno tutti accesi. 


Questo è tutto,
per qualsiasi domanda lascia pure un commento.

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

Nessun commento:

Posta un commento

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post