L’argomento di questo articolo non è sicuramente classificabile come tecnologia di uso quotidiano.
Si tratta però della riedizione largamente riveduta di un vecchio articolo del dicembre del 2006 pubblicato su un altro sito. In quel periodo amministravo la sezione di un forum dedicata ai microcontrollori e avevo pubblicato diversi articoli a scopo didattico. Approfitto quindi dello spazio disponibile su InSight, nonostante si tratti di un argomento di interesse molto molto ristretto, per riproporre quel materiale, sperando di far cosa gradita agli appassionati .
Il dispositivo
Il dispositivo di cui parleremo in questo articolo è una sonda digitale di temperatura prodotta dalla Dallas Semiconductors con il nome DS18B20.
La sonda è in grado di rilevare una temperatura compresa nel campo -55°C÷125°C con un’accuratezza di ±0.5°C nel campo -10°C÷85°C.
Di seguito riporto il diagramma dell’errore estratto dal datasheet ufficiale del componente. Anche le altre immagini riportate in questo articolo sono degli estratti del datasheet.
Dal diagramma si nota che l’errore si allarga agli estremi del campo di misura arrivando a ±2°C nel campo -55°C÷125°C. Questo è un dato da tenere presente se si vuole usare la sonda per dei rilevamenti di precisione per non lasciarsi fuorviare dal valore a quattro cifre decimali che viene restituito dal dispositivo.
Trattandosi di una sonda digitale, il valore della temperatura viene rilevato e campionato per essere trasmesso come valore numerico attraverso un protocollo di comunicazione che spiegherò nel dettaglio più avanti. Il campionamento della temperatura è effettuato su 12 bit in virgola fissa con 4 cifre decimali secondo il diagramma seguente:
I bit più significativi, dal 11 al 15, sono utilizzati come bit di segno e la parola negativa è in complemento a 2.
La sonda DS18B20 utilizza, per dialogare con un microcontrollore master, un protocollo detto one-wired© che vedremo nel dettaglio più avanti.
Collegamento elettrico
Il collegamento con il dispositivo master utilizza un solo filo e la sonda può essere alimentata in due modi: o da una alimentazione dedicata fra 3V e 5V oppure in parasite supply.
Nella seconda modalità di funzionamento la sonda sfrutta la stessa linea di trasmissione per ricavare l’alimentazione necessaria, ma necessita di un protocollo di dialogo opportuno per darle il tempo di assorbire l’energia necessaria fra una comunicazione e l’altra. Nel seguito di questo articolo mi occuperò solo della prima modalità di alimentazione come rappresentato dalla figura seguente.
Lo schema evidenzia come sulla stessa linea one-wired© possano essere collegati altri dispositivi compatibili. Questo è reso possibile dal fatto che ogni dispositivo contiene di fabbrica un codice univoco di 64bit memorizzato all’interno della propria ROM e, attraverso un opportuno algoritmo ad eliminazione, il master è in grado di identificare ognuno di essi e successivamente indirizzarli individualmente. In questo articolo tuttavia tratterò solo il caso di dispositivo singolo collegato sulla linea di trasmissione. In questo modo il codice si semplifica notevolmente e si può evitare l’uso dell’algoritmo di identificazione e selezione e andare direttamente a leggere la temperatura campionata.
Nell’immagine seguente si può vedere la piedinatura della sonda.
I dispositivi comunicano tramite un’uscita open collector. Per questo ho utilizzato, come uscita, la porta RA4 del PIC che ha proprio questa caratteristica.
Il valore logico 1 viene quindi generato da una resistenza di pull-up di 4.7kΩ collegata verso il positivo (5V) quindi, da un punto di vista elettrico, i due dispositivi che dialogano possono scrivere uno 0 collegando la linea a massa o scrivere un 1 semplicemente “rilasciando la linea”.
Il PIC è messo in ascolto sulla linea RA3 che risulta in definitiva cortocircuitata con la RA4.
Sarebbe possibile utilizzare un solo piedino del PIC per svolgere entrambe le funzioni di data in e data out, ma questo avrebbe appesantito di molto il codice di continue riconfigurazioni del piedino in questione e avrebbe reso più critico il calcolo e il rispetto dei timings di trasmissione. Per questo ho preferito non complicare troppo il codice e impegnare due piedini per il dialogo.
Prima di iniziare il commento spendiamo due parole per descrivere la comunicazione one-wired© ossia “su un solo filo”.
2 Febbraio 2020 at 10:40
Hai anche una versione del codice in C?
2 Febbraio 2020 at 13:53
Mi spiace, quando ho scritto questo codice, specialmente per il 16f84, il C non si usava granché.