Découverte du bus One Wire et expérimentations autour du DS18B20 et Arduino Pro Mini 3,3v

Dans cet article, je vous propose de découvrir les grands principes du bus OneWire utilisé par de nombreux composants du fabricant Dallas Semiconductor. Nous verrons dans la pratique comment réaliser des mesures de températures grâce à l’utilisation du capteur DS18B20 connecté à un Arduino Pro Mini en 3,3v. 

Le Bus OneWire (ou 1-Wire)

Le bus OneWire est, comme son nom ne l’indique pas, un bus permettant de connecter des composants avec seulement 2 fils (la masse + le fil de donnés). Le fil est de données est relié à la tension d’alimentation (en général de 3 à 5v) via une résistance de « pull-up » ce qui permet au composant d’en tirer son alimentation lorsqu’il n’est pas en train d’emmètre un signal. Dans la pratique il est courant d’utiliser 3 fils (la masse, l’alimentation et le fil de données) pour plus de sécurité et moins de contraintes.

Exemple de composant OneWire utilisé notamment en matière de contrôle d'accès et de monétique (DS1990A)

Exemple de composant OneWire utilisé notamment en matière de contrôle d’accès et de monétique (DS1990A)

Ce bus a été conçu par la société Dallas Semiconductor (qui a depuis été acquise par Maxim Integrated en 2001). Il est particulièrement utilisé dans le domaine du contrôle d’accès (les célèbres iButton), en domotique (via les différents capteurs disponibles tel que le DS18B20) ou encore en matière de gestion du temps (notamment le célèbre DS1307 permettant de disposer d’une horloge temps-réel – RTC -).

Ce bus combine plusieurs avantages:

  • Une mise en oeuvre relativement simple d’un point de vue électronique (mais plus complexe d’un point de vue programmation… si on n’utilise pas les librairies dédiées)
  • La possibilité de connecter un nombre important de composants OneWire sur un seul et même bus (c’est à dire une paire de fils), chaque composant étant identifié par un numéro de série unique de 64 bits inaltérable.
  • Une vitesse de communication relativement importante de l’ordre de 16Kb/s
  • Des composants d’un coût raisonnable (on trouve par exemple le DS18B20 autour de 1 euros sur Ebay.fr)

Dans la pratique le fonctionnement se base sur une architecture du type  Maître / Esclave(s) avec un unique maître (l’Arduino dans notre cas) et un ou plusieurs esclaves. La communication est initié par le Maitre qui va soit chercher à connaitre la liste des esclaves connectées soit s’adresser à un esclave en particulier pour l’interroger. Le protocole intègre un système anti-collisions permettant de traiter le cas où plusieurs esclaves tenterait de communiquer au même instant.

Regardons le principe de fonctionnement pour un bus 3 fils:

Un Bus OneWire sur 3 fils

Un Bus OneWire sur 3 fils

Et le même principe sur 2 fils:

Un Bus OneWire sur 2 fils

Un Bus OneWire sur 2 fils

Focus sur le DS18B20

Le DS18B20 est un capteur de température fonctionnant sur une très large plage allant de -55 à +125 °C. On le trouve généralement sous la forme d’un boitier TO92 (celui des transistors comme le BC547) et il est principalement constitué d’un capteur de température analogique et d’un convertisseur analogique/numérique dont la résolution (c’est à dire la précision) est réglable de 9 à 12 bits. Accessoirement il contient également une mémoire de 8 octets et une EEPROM (mémoire non volatile) de 3 octets.

Un DS18B20 dans son boitier TO92

Un DS18B20 dans son boitier TO92… vraiment petit !

Le temps nécessaire pour réaliser une mesure (lié principalement à la conversion analogique/numérique) s’échelonne entre:

  • 93,75 ms pour une résolution de 9 bits avec une précision de 0,5 °C
  • 750 ms pour une résolution de 12 bits avec cette fois une précision (théorique) de 0.0625°C
Un DS18B20 étanche que l'on trouve aux alentours de 2 Euros sur eBay.fr

Un DS18B20 étanche que l’on trouve aux alentours de 2 Euros sur eBay.fr

Par rapport à d’autre capteurs de température analogiques (tel que le TMP36) ce capteur présente l’avantage de décharger le micro-controlleur de la phase de conversion analogique/numérique pour un coût similaire.

Montage de test avec un Arduino Pro Mini 3,3v

Avec une plage de tension d’alimentation allant de 3v à 5,5v, le DS18B20 est un candidat idéal pour utiliser un Arduino Pro Mini de 3,3v dans le but d’une future utilisation « portable » alimentée par une batterie Li-Po de 3,7v.

Les composants que j’utilise pour ce montage sont les suivants:

  • Un Arduino Pro mini 3,3v disponible notamment chez Adafruit (10 $) ou sur eBay.fr (à partir de 6 Euros environ).   J’ai acheté le mien auprès du vendeur owayl pour 5,8 Euros (expédition depuis la France et reçu en 2 jours !)
  • Un « FTDI Basic Breakout Arduino » qui n’est autre qu’un convertisseur USB–> Série basé sur le FT232RL permettant la programmation (et l’utilisation du moniteur série) de l’Arduino Pro mini.  Attention à bien le passer en mode 3,3v, dans mon cas j’ai du gratter une piste au dos du circuit et ajouter un « pont » de soudure. Un convertisseur basique à base de FT232RL fera également parfaitement l’affaire si ne souhaitez pas investir spécifiquement dans ce modèle. Ce produit est disponible sur eBay.fr (environ 6,5 euros fdp inclus) ou chez Adafruit (15 $).
  • Un DS18B20 également acheté sur eBay.fr (environ 1 Euros fdp inclus).
  • Une plaque d’expérimentation et quelques cables…
L'Arduino Pro mini 3,3v accompagné de son adaptateur USB <--> Série basé sur le composant FT232RL

L’Arduino Pro mini 3,3v accompagné de son adaptateur USB Série basé sur le composant FT232RL

Le montage de test que je vous propose est relativement simple. Nous allons tout simplement relier le composant Dallas DS18B20 à l’Arduino en utilisant une des broches d’entrée-sortie. L’alimentation du composant sera elle aussi prélevé sur l’Arduino (en réalité sur le port USB) de sorte à ce qu’aucune alimentation externe ne soit nécessaire.

Voici a quoi ressemble le montage une fois réalisé sur une plaque d’expérimentation (merci Fritzing):

Le montage de test sur une plaque d'expérimentation

Le montage de test sur une plaque d’expérimentation

Et voici dans la pratique ce que cela donne:

Le montage d'expérimentation monté sur la plaque

Le montage d’expérimentation monté sur la plaque

Il ne manque plus que le programme…

Passons désormais à la partie « programmation » dans l’environnement Arduino.

Pour cela voir allez avoir besoin:

  • De l’environnement de programmation Arduino disponible ici adapté à votre plateforme (Mac OS, Windows, Linux…). Pour ma part j’utilise la version 1.0.6.
  • De la librairie OneWire disponible ici (en version 2.2 à aujourd’hui).
  • De la librairie Dallas Temperature Control – DTC – disponible ici (en version 3.7.2 à aujourd’hui).

Une fois l’environnement Arduino installé, la première étape consiste à télécharger les deux librairies nécessaires et à copier les deux dossiers associés dans le dossier « libraries« .

Si vous êtes sous MAC OS X, il vous suffit de cliquer sur « Afficher le contenu du paquet » et de vous rendre dans le dossier « librairies« .

Contenu du paquet sous MAC OS X

Choissisez « Contenu du paquet » pour accéder au dossier « Libraries » sous MAC OS X

Accès au dossier Library sous MAC OS X

Accès au dossier Library sous MAC OS X

Sous Windows, il suffit de vous rendre dans le dossier associé.

Une fois ces deux librairies copiées, voici le programme que nous allons utiliser:

#include <OneWire.h>
#include <DallasTemperature.h>
 
// On utilise la Pin #2 pour connecter le DS18B20
#define ONE_WIRE_BUS 2
 
// Initialisation de la librairie OneWire
OneWire oneWire(ONE_WIRE_BUS);
 
// Lien avec la librairie Dallas Temperature Control
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  // On initialise le port série

  Serial.begin(9600);

  Serial.println("Démonstration de prise de température avec le DS18B20");

  // On initialise la librairie DTC
  sensors.begin();
}
 
 
void loop(void)
{
  // On réalise un appel pour tous les "esclaves" connectés
  Serial.print(" Demande de température en cours...");
  sensors.requestTemperatures(); // Envoi de la demande
  Serial.println("DONE"); // Confirmation de l'envoi de la demande

  Serial.print("La temperature pour le DS18B20 est de: ");
  Serial.print(sensors.getTempCByIndex(0)); // Le 0 corresponant au premier esclave trouvé (nous n'en avons qu'un).

  delay(1000); // On attend une seconde avant la prochaine mesure
 
}

Rien de particulier à signaler dans ce bout de code si ce n’est sa relative simplicité liée notamment à l’utilisation de nos deux librairies. Notez que j’ai inseré un délai d’une seconde entre chaque mesure mais que dans la pratique l’opération de conversion prenant environ 750 ms, il se passe ainsi presque 2 secondes (1,75s pour être précis) entre chaque affichage sur le moniteur série.

Vous pouvez désormais compiler ce code et lancer la programmation de votre Arduino après avoir pris soin de sélectionner le bon type de carte et le port série associé.

Selection de l'Arduino Mini 3,3v 8Mhz

Choix du port série

En activant le moniteur série, vous devriez désormais voir apparaitre les informations suivantes:

Démonstration de prise de température avec le DS18B20
 Demande de température en cours...DONE
La temperature pour le DS18B20 est de: 19.81 Demande de température en cours...DONE
La temperature pour le DS18B20 est de: 19.87 Demande de température en cours...DONE
La temperature pour le DS18B20 est de: 19.87 Demande de température en cours...DONE
La temperature pour le DS18B20 est de: 19.94 Demande de température en cours...DONE
La temperature pour le DS18B20 est de: 19.94 Demande de température en cours...DONE

Et voilà, rendez-vous prochainement pour un article permettant la réalisation d’un thermomètre sans fil Wifi basé sur le DS18B20 et l’ESP8266 présenté ICI.

Voici quelques liens complémentaires pour aller plus loin:

 

2 Responses to “Découverte du bus One Wire et expérimentations autour du DS18B20 et Arduino Pro Mini 3,3v”
  1. fidoboulettes says:

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *