Come utilizzare le porte analogiche del Netduino
Netduino dispone di 6 ingressi per l’acquisizione di segnali analogici. Questa è una caratteristica importante perché molti sensori sono di tipo analogico, come alcuni che, ad esempio, variano la loro resistenza elettrica in base alla grandezza fisica che misurano.
Uno degli elementi più semplici che possiamo usare per imparare ad usare gli ingressi analogici del Netduino è la fotoresistenza che varia la sua resistenza elettrica in modo proporzionale alla quantità di luce a cui è sottoposta.
Prima di acquisire il segnale dobbiamo sapere che la massima tensione applicabile ai pin analogici è di 3.3Vdc. La risoluzione del Netduino, nel convertire il segnale analogico in digitale, è di 10bit, questo indica che applicando una tensione di 3.3Vdc all’ingresso analogico, otterremo un valore intero di 1024, applicando una tensione nulla otterremo un valore intero pari a 0, e applicando una tensione di 1.65 Vdc (pari alla metà della massima tensione applicabile) otterremo un valore intero di 512.
Quindi le variazioni di tensione tra 0 e 3.3v restituiranno dei valori compresi tra 0 e 1024.
Passiamo alla pratica e proviamo a collegare una fotoresistenza al Netduino. La sua resistenza varia in modo inversamente proporzionale alla quantità di luce che colpisce il sensore, più intensità luminosa corrisponde ad una minore resistenza e viceversa. Il modello che ho utilizzato io presenta una resistenza di 80-100 ohm quando il sensore è posto alla luce mentre quando è posto al buoi la sua resistenza aumenta sino a 10-15 Mohm.
Il circuito di test è il seguente:
La tensione di 3.3v va ad alimentare il circuito composto dalla fotoresistenza FR e dalla resistenza R da 5.6 KOhm.
Nota: Per i possessori di Netduino rev A dovete collegare anche la tensione 3.3v al pin Aref
Le variazioni di luminosità sul sensore si tradurranno in variazione di resistenza e di conseguenza in variazione di tensione. L’ingresso A0 è collegato tra la fotoresistenza e la resistenza.
Il software per iniziare ad acquisire il segnale analogico è molto banale ed è composto da alcune righe di codice:
AnalogInput FotoCellula = new AnalogInput(Pins.GPIO_PIN_A0); Int32 Segnale = 0; while(true) { Segnale = FotoCellula.Read(); Debug.Print(Segnale.ToString()); Thread.Sleep(100); }
Prima di eseguire il debug(F5) è necessario visualizzare la finestra Output dell’ambiente di sviluppo Visual C# per vedere i dati inviati dal Netduino tramite l’istruzione Debug.Print()
La finestra Output è disponibile nel menu Visualizza->Output di Visual C#
Creiamo un oggetto di nome FotoCellula dalla classe AnalogInput relativo all’ingresso A0 del Netduino e una variabile di tipo intero per memorizzare i valori letti dal pin A0.
Nel ciclo infinito l’oggetto FotoCellula espone il metodo Read() che permette di acquisire il segnale analogico. Il valore viene memorizzato nella variabile Segnale e inviato al pc tramite l’istruzione Debug.Print().
Proviamo a coprire la fotoresistenza per verificare che i valori letti nella finestra Output cambiano, in questo caso la resistenza elettrica del sensore aumenta e di conseguenza la tensione sul pin A0 tenderà a zero, l’acquisizione della tensione, tramite la Read(), produrrà dei valori che tenderanno allo zero; al contrario esponendo il sensore alla luce, la sua resistenza diminuirà e la tensione presente sul pin A0 tenderà a 3.3Vdc, in questo caso la Read() restituirà valori prossimi a 1024.
Se il range 0-1024 è troppo elevato possiamo tramite il metodo SetRange dell’oggetto FotoCellula definire un nostro intervallo:
AnalogInput FotoCellula = new AnalogInput(Pins.GPIO_PIN_A0); Int32 Segnale = 0; //Definisco un range personalizzato FotoCellula.SetRange(100, 500); while(true) { Segnale = FotoCellula.Read(); Debug.Print(Segnale.ToString()); Thread.Sleep(100); }
L’acquisizione di un segnale analogico, quindi, si riduce alla definizione dell’ingresso al quale verrà applicato il segnale, all’eventuale impostazione dell’intervallo e all’esecuzione del metodo Read(). L’unica accortezza è assicurarci che la massima tensione in ingresso non sia superiore ai 3.3Vdc.
Il pin Aref viene utilizzato dal Netduino quando la tensione di riferimento è diversa da 3.3Vdc, nella revisione B del Netduino Aref è impostato automaticamente al valore di 3.3Vdc. Nel caso in cui avessimo un sensore che fornisce un uscita una tensione massima di di 1.65Vdc possiamo intraprendere due strade:
la prima è non utilizzare il pin Aref ed avere l’acquisizione riferita ai 3.3Vdc, di conseguenza la risoluzione di acquisizione verrà dimezzata (Range da 0Vdc a 1.65Vdc equivale a un intervallo di valori di conversione tra circa 0 e 512) .
La seconda è inviare al pin Aref una tensione di riferimento di 1.65Vdc, in questo modo potremmo utilizzare la massima risoluzione del convertitore analogico digitale a 10 bit. L’intervallo dei valori si estenderà da 0 a 1024.
Per utilizzare il pin Aref dobbiamo eseguire una semplice istruzione per poterlo abilitare:
// usa il pin esterno Aref OutputPort arefSelect = new OutputPort((Cpu.Pin)56, false); // usa il valore di Aref interno (Default) OutputPort arefSelect = new OutputPort((Cpu.Pin)56, true); AnalogInput FotoCellula = new AnalogInput(Pins.GPIO_PIN_A0); Int32 Segnale = 0; while(true) { Segnale = FotoCellula.Read(); Debug.Print(Segnale.ToString()); Thread.Sleep(100); }
Ho modificato il circuito originale con la fotoresistenza in modo da utilizzare il pin Aref per puro scopo illustrativo.
Il circuito è il seguente
la tensione di 3.3Vdc viene inviata ad un partitore di tensione composto da due resistenze di 220 ohm. La tensione così dimezzata viene utilizzata per alimentare la fotoresistenza e per inviarla al pin Aref.
Quando la fotoresistenza è esposta alla luce la sua resistenza sarà minima e sul pin A0 avremmo una tensione di circa 1.65Vdc, in questo caso il metodo Read() dell’oggetto FotoCellula restituirà un valore che tenderà a 1024. Nel caso contrario, quando la fotoresistenza è al buoi, sul pin A0 avremmo una tensione quasi nulla e il metodo Read() dell’oggetto FotoCellula restituirà un valore che tenderà allo zero.
Il codice relativo a questo esperimento è il seguente, da notare che l’abilitazione del pin Aref con la prima istruzione:
// usa il pin esterno Aref OutputPort arefSelect = new OutputPort((Cpu.Pin)56, false); AnalogInput FotoCellula = new AnalogInput(Pins.GPIO_PIN_A0); Int32 Segnale = 0; while(true) { Segnale = FotoCellula.Read(); Debug.Print(Segnale.ToString()); Thread.Sleep(100); }
Ora disabilitiamo l’uso di Aref con la seguente istruzione
// usa il valore di Aref interno (Default) OutputPort arefSelect = new OutputPort((Cpu.Pin)56, true);
Eseguendo nuovamente il debug noteremo subito che il massimo valore ottenuto quando la fotoresistenza è totalmente illuminate tenderà a 512, questo perché il valore di tensione è ora riferito a 3.3Vdc e non più a 1.65Vdc.
In conclusione lavorare con i pin analogici risulta molto semplice, tutto si riduce all’uso del metodo Read(). Saper correttamente acquisire un segnale analogico da la possibilità di interagire con molti sensori di tipo analogico che ancora sono presenti in commercio.
Fatemi sapere se l’articolo è risultato interessante cliccando sul pulsante mi piace o lasciando un commento!