Arduino: gestire un’array di tasti utilizzando il minor numero di pin

In un microcontrollore è essenziale risparmiare il numero di pin da dover utilizzare, soprattutto quando si tratta di dover gestire numerosi ingressi digitali( bottoni o interruttori) nel caso volessimo realizzare una tastiera per i nostri progetti.

Come mostrato in un’articolo precedente, quello che non si può fare direttamente con l’Arduino a volte si può realizzare con l’aiuto di qualche integrato e l’utilizzo di qualche funzione. Anche nel caso di dover gestire numerosi ingressi digitali abbiamo una soluzione simile: l’integrato 74HC165 e la funzione shiftIn.

In questo breve tutorial verrà mostrato come si utilizza questo integrato e la funzione shiftIn per realizzare una piccola tastiera sonora a 8 toni utilizzando solo 3 pin per acquisire i tasti premuti.

Iniziamo!

Lista della spesa

Queste sono le cose di cui avremo bisogno per realizzare il nostro progetto oltre a breadboard,Arduino e cavi:

8x bottoni
8x resistenze da almeno 10kOhm
1x 74HC165
1x altoparlante(opzionale)

L’integrato 74HC165

La dicitura di questo integrato è: “8-bit parallel-in/serial-out shift register” il che significa che il suo funzionamento è come un PISO, cioè ci consente di avere molteplici ingressi in parallelo ma ma ppati un’ uscita di tipo seriale, questo viene fatto attraverso un’opportuna funzione di shift all’interno dell’integrato.Con un 74HC165 si possono leggere fino a 8 input digitali.

Come funziona?

Quando l’integrato è abilitato(il pin CE si trova in uno stato basso) disabilitanto e riabilitando( ad una distanza anche di qualche microsecondo) il pin PL all’interno dell’integrato vengono letti tutti i valori ai pin identificati con i nomi Dx e salvati all’interno dell’integrato. Successivamente ad ogni segnale di clock al pin CP(gestito in questo caso dall’Arduino) i vari valori nei registri interni vengono man mano shiftati sul pin Q7(mentre sul pin Q7 segnato troviamo il valore negato). Per poter leggere da più di 8 pin si utilizzano più integrati in cascata sincronizzati con lo stesso clock: il valore Q7 di un’integrato a monte diventa un valore del pin Ds dell’integrato a valle.

Il circuito

Questo è il circuito creato con Fritzing(clicca per ingrandire):

Il programma per il nostro Arduino

Nello sketch che andremo a realizzare ci saranno due files: oltre a quello principale sarà presente il file “notes.h” (che possiamo creare cliccando sulla freccetta in alto a destra appena sotto il simbolo del serial monitor e selezionando “New Tab” e inserendo in fondo il nome “notes.h”). Il contenuto si può prendere dal file “pitches.h” nell’esempio nella sezione “Examples->Digital->Tone Melody”

Il codice della nostra applicazione sarà:


#include "note.h"
//definiamo i Pin
int latchPin = 8;
int dataPin = 9;
int clockPin = 7;
int audioPin = 6;

//Definiamo e inizializziamo la variabile
//che ospita il valore letto con il 74HC165
byte switchVar1 = 0;

void setup() {
//Inizializziamo la seriale
Serial.begin(9600);
//Definiamo le modalità dei pin
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(audioPin, OUTPUT);
pinMode(dataPin, INPUT);
}

void loop() {
//Settiamo il valore del pin di clock per
//non perdere la prima acquisizione
digitalWrite(clockPin,HIGH);
//Iniziamo l'acquisizione(parallel data)
//Settiamo il pin Latch a 0(LOW) iniziamo l'acquisizione parallela
digitalWrite(latchPin,LOW);
//Aspettiamo qualche istante mentre vengono caricati i registri...
delayMicroseconds(20);
//Iniziamo l'acquisizione(serial data)
//Settiamo il pin Latch a 1(HIGH) per prepararci
//ad acquisire i dati in modo seriale
digitalWrite(latchPin,HIGH);

//Utilizziamo la funzione shiftIn dell'Arduino
switchVar1 = shiftIn(dataPin, clockPin,MSBFIRST);
//Facciamo lo switch del valore per vedere che nota suonare
//(è permesso premere un pulsante alla volta)
//e suoniamo per 20ms la nota corrispondente
switch(switchVar1){
case 1:
tone(6, NOTE_B2, 20);
break;
case 2:
tone(6, NOTE_C3, 20);
break;
case 4:
tone(6, NOTE_D3, 20);
break;
case 8:
tone(6, NOTE_E3, 20);
break;
case 16:
tone(6, NOTE_F3, 20);
break;
case 32:
tone(6, NOTE_G3, 20);
break;
case 64:
tone(6, NOTE_A3, 20);
break;
case 128:
tone(6, NOTE_B3, 20);
break;
default:
break;
}
//Stampiamo il dato appena raccolto sulla seriale
//in forma binaria, questo comando è opzionale
Serial.println(switchVar1, BIN);
}

Compiliamo lo sketch e se non ci sono errori premendo i bottoni eseguiremo delle note.

References

Shift in e Arduino: Tutorial( in inglese) che piega il funzionamento della funzione shiftIn() con però un altro tipo di integrato.

Datasheet del 74HC165: Datasheet dell’integrato utilizzato in quest’articolo.

Luca Panebianco
Ciao! Mi chiamo Luca e frequento la magistrale in Ingegneria Informatica e dell'Automazione all'Università Politecnica delle Marche. Qui ho apprezzato pian piano la programmazione su microcontrollori oltre che la canonica sul PC. Sono interessato ai vari campi della programmazione su diversi dispositivi.
By Luca Panebianco | ottobre 18th, 2012 | SHOW COMMENTS (2)

2 Responses

  1. MattiaMc says

    ciao, buon 2014!
    mi chiedevo se invece di usare un piso, quindi un parallel in, potevo anche usare un parellel out serial in, per controllare i pin d’ingresso.

    • Luca Panebianco
      Luca Panebianco says

      Ciao, forse non ho capito bene..intendi utilizzare un SerialIn/ParallelOut sempre per leggere dei bottoni?
      Questo componente è più indicato per pilotare sul microcontrollore delle uscite digitali(come è stato fatto in un altro articolo nel sito) perchè con l’Arduino fai lo shift nella parte seriale e il risultato viene scritto in uscita dall’altra parte…mentre se avessi un parallelOut lato microcontrollore sei obbligato a leggere tutte le uscite digitali in parallelo(quindi dovresti utilizzare 8 pin per leggere il valore).