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:
- #define PIN_A 2
- #define PIN_B 3
- #define PIN_C 4
- #define PIN_D 5
- void setup()
- {
- }
- void loop()
- {
- for (int i=0; i<13; i++)
- {
- ledOn(i);
- delay(10);
- }
- }
- void ledOn(int num)
- {
- switch(num)
- {
- case 0:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 1:
- pinMode (PIN_A, OUTPUT);
- pinMode (PIN_B, OUTPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, HIGH);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 2:
- pinMode (PIN_A, OUTPUT);
- pinMode (PIN_B, OUTPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, HIGH);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 3:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, OUTPUT);
- pinMode (PIN_C, OUTPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, HIGH);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 4:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, OUTPUT);
- pinMode (PIN_C, OUTPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, HIGH);
- digitalWrite (PIN_D, LOW);
- break;
- case 5:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, OUTPUT);
- pinMode (PIN_D, OUTPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, HIGH);
- digitalWrite (PIN_D, LOW);
- break;
- case 6:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, OUTPUT);
- pinMode (PIN_D, OUTPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, HIGH);
- break;
- case 7:
- pinMode (PIN_A, OUTPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, OUTPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, HIGH);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 8:
- pinMode (PIN_A, OUTPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, OUTPUT);
- pinMode (PIN_D, INPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, HIGH);
- digitalWrite (PIN_D, LOW);
- break;
- case 9:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, OUTPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, OUTPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, HIGH);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 10:
- pinMode (PIN_A, INPUT);
- pinMode (PIN_B, OUTPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, OUTPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, HIGH);
- break;
- case 11:
- pinMode (PIN_A, OUTPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, OUTPUT);
- digitalWrite (PIN_A, HIGH);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, LOW);
- break;
- case 12:
- pinMode (PIN_A, OUTPUT);
- pinMode (PIN_B, INPUT);
- pinMode (PIN_C, INPUT);
- pinMode (PIN_D, OUTPUT);
- digitalWrite (PIN_A, LOW);
- digitalWrite (PIN_B, LOW);
- digitalWrite (PIN_C, LOW);
- digitalWrite (PIN_D, HIGH);
- break;
- }
- }
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.
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!