Tutorial Arduino 74HC595 v1 Controllare 8 led con uno Shift Register

Tutorial 74HC595 – 8 led con uno Shift Register

Step 9

BreadBoard 74HC595 Step 9

Vi sarete chiesti perchè avevo aggiunto al progetto un potenziometro da 10k,  ebbene, ora che avete il vostro simpatico led acceso che si muove da una parte all’altra c’è un’altra cosa molto importante di cui tenere conto.

Il nostro chip integrato è in grado di sostenere al massimo 35mA per singolo output, che sono più che sufficienti per bruciare un led se non lo proteggiamo con una resistenza, ma non può sostenere più di 70mA in totale. Pertanto, se vogliamo accendere in sicurezza più led contemporaneamente occorre ridurre ulteriormente la corrente. Inoltre, per questi tutorial non è male ridurre ulteriormente la luminosità del led in modo da poterlo osservare senza dare troppo fastidio agli occhi.

Il potenziometro lineare vi consente di ridurre la luminosità dei led limitando ulteriormente la corrente. Quando il pot è a zero, avremo i 220Ω delle resistenze a garantirci una limitazione a 15mA, e quindi una luminosità quasi piena del led, ma man mano che ruotiamo il pot possiamo arrivare a 10220Ω e ridurre ulteriormente la corrente.

Collegare solo due piedini di un potenziometro di fatto lo trasforma in un reostato, tuttavia quando si parla di reostati questi sono in genere concepiti per dissipare molta potenza a differenza dei potenziometri che sono più delicati, qui abbiamo a che fare con pochi milliwatt quindi il potenziometro usato come reostato andrà bene.

Una considerazione: il potenziometro è lineare ma la luminosità varia in modo logaritmico, pertanto gran parte della differenza di luminosità avverrà ruotando di pochi gradi la manopola del pot mentre per gran parte della rotazione rimanente vedrete poca differenza. Attenzione che variare la luminosità agendo sulla tensione è cosa ben diversa che l’uso del PWM dove la tensione è fissa ma varia il duty-cicle.

Il potenziometro, ha anche l’effetto di virare leggermente il colore del led (poiché opera sulla tensione) e quindi è una pratica da usare solo in prototipi come questo. Procedete quindi a spostare i cavetti di alimentazione ed a frapporre il pot tra il rail ground inferiore e quello superiore come mostrato nello schema.

Riprovate lo sketch precedente e regolate la luminosità al minimo prima di passare al prossimo sketch.

Step 10

In questo ultimo passaggio, sistemiamo lo sketch e facciamo qualche gioco di luce in più.


//Connesso al Pin DS del 74HC595
int dataPin = 8;
//Connesso al Pin ST_CP del 74HC595
int latchPin = 9;
//Connesso al Pin SH_CP del 74HC595
int clockPin = 10;

void setup() {
   //configuriamo i 3 pin di output
   pinMode(dataPin, OUTPUT);
   pinMode(latchPin, OUTPUT);
   pinMode(clockPin, OUTPUT);

}

//procedura che ci consente di mandare da un byte

void shiftOut(byte aByte)
{

   digitalWrite(clockPin, 0); //mi assicuro che clock si LOW
   digitalWrite(latchPin, 0); //abbasso il latch per iniziare a programmare il 74HC595

   for (byte i=0;i<8;i++)
   {
      bool b;

      if ( aByte & (1<<i) ) { b= 1; } else { b= 0; } digitalWrite(dataPin,b ); // alzo il pin data in base al bit corrente in aByte; digitalWrite(clockPin, 1); //alzo il clock -> abbiamo "spinto" il valore 1 nel primo registro del 74HC595.
      digitalWrite(dataPin, 0); //rimetto a zero il data pin e clock pin per non portare valori HIGH oltre questo punto.
      digitalWrite(clockPin, 0);
   }
   digitalWrite(latchPin, 1); //latch HIGH per confermare gli output.
}

//accendiamo e spegnamo tutti i led, possiamo indicare quante ripetizioni e quanto dura il lampeggio
void lampeggia(int repeat=1, int milli=200)
{
   for (int i=0;i < repeat; i++)
   {
      shiftOut(0b11111111); //accendiano tutti i led
      delay(milli);
      shiftOut(0b00000000); //pegnamo tutti i led
      delay(milli);
   }
}

//facciamo scorrere un led acceso da una parte all'altra o viceversa.
void onda(bool left=false,bool barra=false, int repeat=1, int milli=200)
{
   byte leds=left?1:128;
   if (barra)
      leds=255-leds;

   for (int i=0;i < repeat; i++)
   {
      for (int j=0;j<8; j++)
         {
            shiftOut(left? leds<<j:leds>>j);
            delay(milli);
         }
      }
   }

void loop() {

   lampeggia(2,300);
   onda();
   lampeggia(2,100);
   onda(true);
   lampeggia(2,100);
   onda(true,true);
   lampeggia(2,100);
   onda(false,true,3,50);

}

Il seguente video mostra lo sketch in esecuzione.