1-wire, Bash e C

15 sensori di temperatura collegati al Taspberry PI

Il bus 1-wire, proprietario di Dallas Semiconductor, permette di collegare dispositivi slave usando un solo filo. In realtà sono quindi necessari due o tre fili per realizzare una rete 1-wire: uno per la massa ed uno, opzionale, per l'alimentazione.

Gli ambiti principali di applicazione:

Un aspetto interessante è la possibilità di creare reti di dispositivi senza necessità di configurazione preliminare. La fotografia mostra per esempio 15 sensori di temperatura, connessi tra di loro e semplicemente inseriti nella breadboard, esattamente come tolti dalla confezione.

Non verrà qui descritto il protocollo 1-wire; basti sapere che ogni dispositivo ha un suo indirizzo univoco di 64 bit e che la rete deve necessariamente avere un solo master, nel nostro caso Rpi. Ulteriori informazioni su 1-wire in questa pagina.

Il questa pagina è descritto solo l'uso di sensori di temperatura in quanto non sono riuscito ad avere campioni gratuiti di altri dispositivi; spero di poterla espandere nel prossimo futuro.

L'hardware

Vari sono i metodi per connettere un bus 1-wire a Rpi:

Due sono le modalità possibili:

Slave alimentati

1-Wire parasitic supply

Molti sensori prevedono entrambe le modalità di alimentazione; la scelta può spesso essere fatta collegando il pin Vcc all'alimentazione oppure a massa.

Il driver

Il driver è contenuto in una serie di moduli (wire, w1_gpio,w1_therm) standard nel kernel linux, ma non in genere caricati automaticamente all'avvio del sistema.

vv@vvrpi ~ $ sudo modprobe w1-gpio

vv@vvrpi ~ $ lsmod
Module     Size  Used by
w1_therm   2870  0
w1_gpio    2747  0
wire       25249 2 w1_gpio,w1_therm
[...]

Nel caso di slave non alimentati da Vcc (parasitic supply), è necessario aggiungere una opzione per attivare lo strong-pullup:

vv@vvrpi ~ $ sudo modprobe w1-gpio pullup=1

Alcuni siti consigliano di attivare anche il modulo w1_therm, con la relativa opzione per il pull-up. Non ne ho vista l'utilità, ma neppure controindicazioni... Non ho trovato documentazione precisa a questo proposito.

vv@vvrpi ~ $ sudo modprobe w1-gpio pullup=1; sudo modprobe w1_therm strong_pullup=1

Ovviamente se volete attivare i moduli durante la fase di boot, occorre aggiungere a /etc/modules le seguenti righe:

wire
w1_gpio pullup=1
w1_therm strong_pullup=1

Dopo l'installazione del modulo viene creata una struttura di directory e file:

vv@vvrpi ~ $ ls -l /sys/devices/w1_bus_master1
total 0
drwxr-xr-x 3 root root 0 Jul 4 14:36 10-000802d3a98b
drwxr-xr-x 3 root root 0 Jul 4 14:36 10-000802d3ae8d
drwxr-xr-x 3 root root 0 Jul 4 14:36 10-000802d3afce
drwxr-xr-x 3 root root 0 Jul 4 14:36 10-000802d3b576
drwxr-xr-x 3 root root 0 Jul 4 14:36 10-000802d3b755
drwxr-xr-x 3 root root 0 Jul 4 14:36 28-00000558f21a
drwxr-xr-x 3 root root 0 Jul 4 14:36 28-0000055908a6
drwxr-xr-x 3 root root 0 Jul 4 14:36 28-000005f5c2d0
drwxr-xr-x 3 root root 0 Jul 4 14:36 28-000005f5c2e0
drwxr-xr-x 3 root root 0 Jul 4 14:36 28-000005f5ce26

I più attenti si saranno accorti di una contraddizione tra quanto appena mostrato e la fotografia di apertura: sono solo 10 directory, i dispositivi sono invece 15! Il problema risiede nel driver che è configurato per ricercare un massimo di 10 dispositivi...

Ciascuna di queste directory è relativa ad un diverso dispositivo. Il numero riportato è null'altro che una parte dell'indirizzo a 64 bit. In particolare, facendo per esempio riferimento all'ultima riga ed a uno degli schemi presenti sui fogli tecnici abbiamo:

64-bit lasered ROM code

Il contenuto di ciascuna directory è specifico dei device. Per i sensori di temperatura, le informazioni sono contenute in un singolo file, in formato testuale:

vv@vvrpi ~ $ cat /sys/devices/w1_bus_master1/28-000005f5ce26/w1_slave
75 01 4b 46 7f ff 0b 10 78 : crc=78 YES
75 01 4b 46 7f ff 0b 10 78 t=23312

Per chi è curioso e non si fida del lavoro svolto dal driver:

Una osservazione che può tornare utile: se viene letta la temperatura di 85 °C (in esadecimale 50 05) probabilmente la conversione non ha avuto luogo per mancanza di alimentazione, per esempio assenza dello strong-pullup.

Un breve script lo trovate a fondo pagina. Stampa la temperatura di tutti i sensori di temperatura presenti, fino ad un massimo di 10.

vv@vvrpi ~ $ ./read-1-wire.sh
La temperatura di 10-000802d3a98b è 22.3 °C
La temperatura di 10-000802d3ae8d è 22.3 °C
La temperatura di 10-000802d3afce è 22.3 °C
La temperatura di 10-000802d3b576 è 22.3 °C
La temperatura di 10-000802d3b755 è 22.2 °C
La temperatura di 28-00000558f21a è 22.5 °C
La temperatura di 28-0000055908a6 è 22.5 °C
La temperatura di 28-000005f5c2d0 è 22.5 °C
La temperatura di 28-000005f5c2e0 è 22.3 °C
La temperatura di 28-000005f5ce26 è 22.2 °C

Analogamente è presente a fondo pagina un breve programma C. Esso permette di esaminare sia alcuni specifici device specificati sulla linea di comando (come mostrato nell'esempio, includendo anche un errore) che di attivare la ricerca automatica.

vv@vvrpi ~ $ gcc 1-wire-th.c -std=gnu99 -o 1-wire-th

vv@vvrpi ~ $ ./1-wire-th 10-000802d3a98b 10-1000802d3ae8 10-000802d3afce 28-000005f5ce26
Rapsberry Pi: 1-wire in C - Versione 0.7 - Luglio 2014
Copyright (c) 2013, Vincenzo Villa (https://www.vincenzov.net)
Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported.
Creative Commons | Attribution-Share Alike 3.0 Unported
https://www.vincenzov.net/tutorial/RaspberryPi/1-wire.htm

Usage:
rpi ~ $ ./1-wire-th [ROM-ID-1] [ROM-ID-2] [ROM-ID-3]...
ROM-ID-X = Optional ROM-ID (e.g.: 10-000802d3a98b) - Up to 10

Testing 4 1-wire devices:

Device 0: /sys/devices/w1_bus_master1/10-000802d3a98b/w1_slave T = 23.6 °C
Device 1: /sys/devices/w1_bus_master1/10-1000802d3ae8/w1_slave ERROR! Wrong ROM-ID?
Device 2: /sys/devices/w1_bus_master1/10-000802d3afce/w1_slave T = 23.6 °C
Device 3: /sys/devices/w1_bus_master1/28-000005f5ce26/w1_slave T = 23.4 °C

Le forme d'onda

Il grafico mostra la lettura di un valore di temperatura da uno dei sensori: sono chiaramentemvisibili le fasi di comando inviato da Rpi e di risposta, inviata dallo slave. La durata complessiva della comunicazione è poco più di 40 ms; il tempo della sola trasmissione dell'ordine dei 6 ms, altrettanti quella della sola ricezione: devono essere infatti sempre essere trasmessi i 64 bit del ROM-ID. Si noti la diminuzione della tensione di alimentazione durante la trasmissione, causata dalla scarica della tensione del condensatore interno allo slave.

Lettura della temperatura

Il grafico seguente mostra la trasmissione di una serie di bit. In particolare sono stati evidenziati:

Entrambi i bit hanno la durata di circa 70 µs.

Il tempo di salita dipende dal valore della resistenza di pull-up, dalla capacità della linea (in pratica: dalla sua lunghezza), dall'assorbimento di corrente degli slave, dal numero di slave.

Alcuni bit

Codice Bash e C

Scarica il codice: 1-wire-read.sh

Scarica il codice: 1-wire-th.c


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima