Ago 272013
 

In un precedente articolo abbiamo visto come espandere gli ingressi digitali con un 74HC165, mentre in un altro abbiamo visto come espandere le uscite tramite 74HC595. Poi col passare degli articoli abbiamo visto come collegare i display LCD HD44780 compaibili attraverso i 74HC595 e per finire abbiamo preparato una libreria apposita per il controllo di questi chip. In questo breve articolo volevo solamente rivisitare i concetti precedentemente visti e metterli tutti insieme.

I collegamenti

Abbiamo già visto come collegare entrambi i tipi di chip, ma c’è una considerazione importante da poter aggiungere. Entrambi necessitano di tre pin, uno per i dati, uno per il clock ed uno che potremmo definire di abilitazione che nel caso della lettura fà si che il chip prepari le letture per essere lette mentre nel caso della scrittura trascrive il buffer interno sulle uscite vere e proprie. La domanda è: non è che possiamo risparmiare ulteriormente qualche pin? Il pin dati in un caso è settato come input e nell’altro come output, quindi non possono essere certo mescolati. Neanche il pin di abilitazione potrà essere mescolato visto che non siamo certo in grado di leggere e scrivere in contemporanea ma possiamo unicamente fare una o l’altra operazione nel medesimo istante. ma il pin di clock? Nel momento in cui non leggiamo o scriviamo non rappresenta altro che un pin che sale e schende di livello ma che non ha alcun significato. Per questo motivo possiamo mettere in comune i pin di clock dei due chip così risparmiamo un pin di Arduino. Oramai lo schema di connessione vi uscirà fuori dalle orecchie, ma ve lo ripropongo ugualmente. Anzi, oggi voglio proprio esagerare, vi propongo lo schema del mio prototipo, quello che oramai avete visto in numerose foto e video. Per chi non lo ricordasse è composto da un Arduino standalone, un 74HC165 con relativi pulsanti, un connettore FTDI e due 74HC595, uno connesso ad un display ed uno ad un ULN2803A a sua volta collegato a 8 LED alimentati a 12V da un alimentatore esterno. Non fatevi spaventare, non è complicato come potrebbe sembrare a prima vista, sono i tre schemi già proposti in precedenti articoli uniti insieme. Ho provveduto unicamente a unire il pin di clock come abbiamo detto e visto che non l’avevo fatto in precedenza, ho messo i condensatori di disaccopiamento sulle linee di alimentazione del 74HC165 e del 74HC595 vista l’esperienza con il display di cui vi ho già raccontato.

Il software

Nei primi articoli abbiamo controllato in modo più o meno diretto i due chip. Oggi ho approfittato della libreria da me scritta per semplificare il software e connettere un display LCD. In questo modo possiamo scrivere sul display lo stato dei pulsanti in ingresso oltre che usare anche dei led per mostrare lo stato di pressione dei pulsanti. Anzichè stampare sul display qualcosa tipo o e 1 per segnalare lo stato degli ingressi, ho stilizzato una lampadina spenta ed accesa, così ripassiamo l’utilizzo dei caratteri personalizzabili. Non ho utilizzato nessun meccanismo di debouncing ed in realtà non ne abbiamo neanche mai parlato prima: quando premiamo un pulsante, nel momento i cui le parti metalliche cominciano a toccarsi, il contatto non è ancora stabile, si generano delle piccole scintille e c’è un’alternanza di segnali 0 e 1 che si succedono rapidamente fino a che otteniamo un segnale stabile alto. Se effettuiamo più letture degli ingressi nel periodo “instasbile”, si avranno delle false letture che possono compromettere il funzionamento di tutto il progetto. Per questo motivo si usano dei meccanismi che cercano di eliminare questo problema. Possono essere sia di tipo hardware che software. In quest’ultimo caso non si fà che prendeere due o più letture in un ristretto periodo di tempo e quando queste sono coerenti viene interpretata la reale pressione del pulsante. Se invece non sono coerenti si interpreta l’evento come un “falso contatto” per cui il software si comporta come se non fosse successo nulla. Non ho trovato nessuna libreria pronta che effettui questo lavoro sugli shift register in ingresso, potrebbe essere un’idea per un prossimo articolo.

Oggi però ci limitiamo alla semplice lettura degli ingressi per cui la sketch definitiva sarà:

#include <HC595.h>

hc595 My595(12,11,13,2); // latch,clock,data,number of 74hc595

const int IN_PL = 9;
const int IN_Data=10;
const int IN_Clock=11; // era 8 nel vecchio articolo ma lo abbiamo accorpato al clock del 74HC595

int attuale=0;
int lettura=0;
unsigned char lampOFF[8] = { B01110, B10001, B10001, B10001, B01010, B01010, B01010, B00100 }; // dati binari per la lampadina spenta
unsigned char lampON[8] = { B01110, B11111, B11111, B11111, B01110, B01010, B01010, B00100 }; // dati binari per la lampadina accesa
void setup() 
{
 pinMode(IN_PL,OUTPUT);
 pinMode(IN_Data,INPUT);
 pinMode(IN_Clock,OUTPUT);

 My595.DisplayReset(LCD595_BASIC_DISPLAY_INIT | LCD595_MORELINES ,0);
 My595.DisplayWrite("Setup is OK...",0); // serve solo a ripassare come scrivere una stringa sul display
 delay(1500); // piccola attesa per permetterci di leggere la scritta sopra
 My595.DisplayClean(0); // cancella il display
 My595.CreateChar(0,lampOFF,0); // crea il carattere ridefinito 0 per la lampadina spenta
 My595.CreateChar(1,lampON,0);// crea il carattere ridefinito 0 per la lampadina accesa
}

void loop()
{
 delay(50);
 digitalWrite(IN_Clock, HIGH);
 digitalWrite(IN_PL, LOW);
 digitalWrite(IN_PL, HIGH);
 lettura=shiftIn(IN_Data, IN_Clock, MSBFIRST );
 if(lettura!=attuale) // se non ci sono variazioni non perde tempo ad aggiornare gli shift register.
 {
  attuale=lettura;
  My595.Send595Pin(attuale,1); // setta lo stato dei led sul secondo 74HC595
  for(int i=0;i<8;i++)
  {
   My595.SetCursor(i,i%2,2,0);
   if(bitRead(attuale,i)) My595.DisplayChar(1,0); // 1 è il carattere ridefinito con la lampadina accesa
   else  My595.DisplayChar(0,0);  // 0 è il carattere ridefinito con la lampadina spenta
  }
 }
}


Eccovi un’immagine del progetto in funzione.  Anche se non si vede in foto, ho premuto il terzo, quarto e quinto pulsante, cosa che si riflette sull’accensione dei relativi LED e sulla visualizzazione nel display.

  3 Responses to “74HC595 e 74HC165: un aggiornamento sugli shift register – it”

  1.  

    Salve,
    Ho dato un’occhiata al suo blog e lo trovo molto ben fatto.
    E’ possibile contattarla tramite il blog senza lasciare commenti?

  2.  

    Buongiorno, avrei un problema quando compilo lo sketch, mi da un errore con scritto ” exit status 1
    errore durante la compilazione per la scheda arduino/genuino uno.

    Come mai ?

    grazie

Exit mobile version