Skyduino:~#
Articles
arduino, programmation, tutoriel

[Arduino] Tutoriel 1-Wire & DS1994

Bonjour tout le monde !

Depuis quelques jours je ne parlais plus trop d’arduino. J’étais plus parti dans mes bidouillages à base de STM32F4 🙂
Donc aujourd’hui je me rattrape en vous proposant un tutoriel sur la librairie arduino OneWire.

Librairie qui au passage est compatible arduino, teensy et chipkit, que ce soit en avec l’ide arduino 1.0 ou 0023 (c’est un point non négligeable).

Avant de commencer, la librairie OneWire est disponible ici : http://www.pjrc.com/teensy/td_libs_OneWire.html

Un peu de blabla :

Bon déjà qu’est ce que le « OneWire » (1-Wire pour les intimes) ?

En gros, 1-Wire est un protocole de communication utilisant un seul fil.
C’est un technologie créée par la sociéte Dallas/Maxim qui permet de faire communiquer deux modules compatible 1-Wire avec (comme son nom l’indique) un seul et unique fil de données.
Mais en tout il faut (au minimum) deux fils, un pour les données et un autre pour la masse 😉

L’avantage du 1-Wire c’est qu’il est possible d’avoir des systèmes complets allant jusqu’à 7 modules mais n’utilisant qu’un seul fil pour la communication.
Autre avantage, les modules Dallas peuvent fonctionner suivant deux types de câblage, « normal » ou « parasite ».
Dans le mode normal il faut 3 fils, VCC, Data, et GND.
Dans le mode « parasite » il faut uniquement deux fils, Data et GND.
L’alimentation du module se fait alors exclusivement grâce aux quelques mA qui se trouvent sur le bus de données.

Dans tout les cas il faut respecter un câblage type que voici :
VCC -> Résistance 4k7 -> Dx (arduino)
Dx (arduino) -> Data (module dallas)
GND (arduino) -> GND (module dallas)

(Ne pas oublier la résistance entre Dx et Vcc sinon ça ne marchera pas)

Bon je passe volontairement sur la partie installation de la librairie, vous êtes suffisamment grand pour copier/coller un dossier là où il faut 😉

L’api OneWire :

OneWire myWire(pin);
Déclare un objet du type OneWire sur la broche « pin », il est possible de déclarer plusieurs objets OneWire sur la même broche étant donnée qu’il s’agit d’un bus.

myWire.search(addrArray)
Cherche des modules compatible OneWire sur le bus.
Si un module est trouvé la fonction renvoi True et l’adresse du module est placé dans « addrArray » (addrArray qui correspond à un tableau de 8 byte), si aucun module n’est trouvé elle retourne False.
(Ps: C’est une fonction de recherche « glissante », cela signifie que si plusieurs module Dallas sont présent, il faudra appeler la fonction autant de fois qu’il y a de modules sur le bus)

myWire.reset_search()
Fait repartir la recherche de zéro, utile pour rescanner tous les modules présent sur le bus.

myWire.reset()
Relance le bus 1-Wire, obligatoire avant de communiquer avec la plupart des modules Dallas.

myWire.select(addrArray)
Sélectionne un module d’adresse addrArray afin de pouvoir communiquer avec lui.
Toutes les communications réalisées jusqu’au prochain reset se feront avec ce module.

myWire.skip()
Permet d’outre passer la sélection du module avec qui communiquer.
Utile dans le cas ou il n’y a qu’un module Dallas sur le bus et où, par conséquent, faire une recherche serait inutilement lourd.
(ne fonctionne QUE s’il n’y a qu’un module Dallas sur le bus)

myWire.write(valeur);
Écrit un octet « valeur » sur le bus.
(Note: bien prendre le temps de lire le datasheet du module utilisé, la plupart possède un « scratchpad » qui sert de mémoire tampon entre la mémoire physique et une mémoire ram virtuelle.
Si les données contenu dans le « scratchpad » ne sont pas transférées dans la mémoire physique en suivant la procédure qui va bien elle ne seront tout simplement pas sauvegardées)

myWire.write(valeur, 1);
Écrit un octet « valeur » sur le bus, mais conserve l’alimentation sur le bus à la fin de la transmission.
(utile dans le cas d’un câblage en mode parasite)

myWire.read()
Lit un octet depuis le bus.

myWire.crc8(dataArray, length)
Calcul la checksum (CRC8) du tableau « dataArray » de taille « length », très utile pour savoir si les données reçu sont corrompu ou non.

La matériel :

Tout d’abord il faut savoir qu’il existe une multitude de boitiers différents dans la gamme des modules Dallas.
Les plus communs étant les iButton et les TO-92 (le boitier rond avec un méplat comme pour les petits transistors).

Pour ce tutoriel je vais utiliser un module au format iButton, le DS1994.
Il s’agit d’une module horloge RTC avec ram embarquée.
Pour ceux qui voudrait plus d’info : http://www.maxim-ic.com/datasheet/index.mvp/id/3794

Voila à quoi ressemble un module iButton vu de l’extérieur.
C’est une espèce de petite capsule en métal sans grand intérêt au premier abords.

Note: Ce coté avec un plat est le coté « extérieur » du DS1994, c’est ici qu’il faudra appliquer le GND de l’arduino plus tard.

Et voici le coté « intérieur » où il faudra relier la broche servant de bus de données.

On peut voir les inscriptions gravée au laser, à savoir :
– le type de boitier (ici iButton),
– le numéro de série unique du module (ici 00000066B047),
– le type de bus (ici 1-Wire),
– et finalement le type de module Dallas (ici DS1994).

J’ai volontairement zoomé mes photos pour que ce soit lisible, mais en réalité un module iButton n’est pas plus gros qu’une pièce de 10 centimes 😉

Ensuite ce pose THE question : Comment câbler un truc qui ressemble à un bouchon de bouteille !?
Je suis pas allez chercher bien loin, une pince à linge et deux fils font très bien l’affaire ^^

Oui je sait ça fait un peu « cheap » …
Mais bon on fait avec ce que l’on a 🙂

Comme je le disais plus haut il ne faut pas oublier la résistance de 4k7 entre VCC et la broche Data (D10 pour cette exemple) sinon ça ne marchera pas.

Maintenant que vous avez le câblage et la référence de l’api OneWire vous ne devriez pas avoir de soucis à comprendre ce morceau de code d’exemple.

Exemple très simple qui affiche le nombre de secondes écoulées sous la forme d’un timestamp unix.

#include <OneWire.h>

/*
 * Exemple d'application utilisant un DS1994 et la librairie OneWire
 * Hardware: 
 * GND arduino -> Coté "extérieur" du DS1994
 * VCC 5v arduino -> résistance 4k7 -> D10 arduino
 * D10 arduino -> Coté "intérieur" du DS1994
 */

/* Création d'une instance de la classe OneWire */
OneWire ds(10); // Le DS1994 sera en mode "parasite" (utilise le bus de donnée comme alimentation) sur la broche D10

/* Variables 
 * i: itérateur pour les boucles
 * data: 5 octets de données venant du DS1994
 * addr: adresse trouvé sur le bus OneWire
 * timestamp: nombre de secondes écoulé
 */
byte i;
byte data[5];
byte addr[8];
unsigned long timestamp;

/* Setup() */
void setup(void) {

  /* Initialisation du port série */
  Serial.begin(9600);
  Serial.println("Exemple DS1994");
}

/* loop() */
void loop(void) {

  /* Recherche des DSxx présent sur le bus OneWire */
  Serial.print("Recherche ... ");
  if (!ds.search(addr)) {
    Serial.println("Fin du scan");
    ds.reset_search();
    delay(500);
    return;
  }

  /* Affichage de la ROM du DSxx détecté */
  Serial.print("ROM : ");
  for(i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  Serial.println();

  /* Vérification de la validité de la ROM reçu */
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("Erreur de CRC sur addr");
    return;
  }

  /* Vérification du type de DSxx */
  if(addr[0] != 0x04) {
    Serial.println("DSxx de type autre que DS1994");
    return;
  }  

  /* Activation de l'oscillateur du DS1994 */

  /* Initialisation de la communication avec le DS1994 */
  ds.reset();
  ds.select(addr);
  ds.write(0x0F, 1); // Commande write scratchpad

  /*
   * Le registre de contrôle RTC se situe à l'adresse 0x201
   * TA1 et TA2 = LSB / MSB du registre d'adresse
   */
  ds.write(0x01, 1);  // TA1
  ds.write(0x02, 1);  // TA2

  /* Mise à 1 du registre OSC */
  ds.write(16, 1);
  ds.reset();

  /* Copie du scratchpad en mémoire */
  ds.reset();
  ds.select(addr);
  ds.write(0x55, 1); // Commande copy scratchpad
  ds.write(0x01, 1); // TA1
  ds.write(0x02, 1); // TA2
  ds.write(0x01, 1); // Offset écrit dans le scratchpad
  ds.reset();

  /* Boucle infini */
  for(;;) {

    /* Initialisation de la communication avec le DS1994 */
    ds.reset();
    ds.select(addr);
    ds.write(0xF0, 1); // Commande read memory

    /*
     * Les données concernant le temps commence à 0x202
     * TA1 et TA2 = LSB / MSB du registre d'adresse
     */
    ds.write(0x02, 1);  // TA1
    ds.write(0x02, 1);  // TA2

    /* Lecture des données */
    for(i = 0; i < 5; i++)
      data[i] = ds.read();
    ds.reset();

    /* Conversion des 4 octets brute en un timestamp unix */
    timestamp = data[1];
    timestamp += data[2] << 8;
    timestamp += data[3] << 16;
    timestamp += data[4] << 24;

    Serial.print("Temps: ");
    Serial.println(timestamp, DEC);
    delay(1000);
  }
}

Voila ce que ça donne dans le Serial Monitor :
Exemple DS1994
Recherche ... ROM : 4 47 B0 66 0 0 0 D2
Temps: 59
Temps: 60
Temps: 61
Temps: 62
Temps: 63
Temps: 64
Temps: 65
Temps: 66
Temps: 67
Temps: 68
Temps: 69
Temps: 70
Temps: 71
Temps: 72

Remarque : Je vous conseille fortement de prendre le temps de lire le datasheet du modules Dallas que vous voulez utiliser avant de vous lancer 😉
Avec le DS1994 par exemple il faut écrire / copier le « scratchpad » avant de pouvoir modifier réellement le registre de contrôle.

Enjoy ! 🙂

Publicités

Discussion

2 réflexions sur “[Arduino] Tutoriel 1-Wire & DS1994

  1. Salut, j’imagine que c’est donc impossible de faire un double de ces boutons puisqu’ils disposent d’un numéro de série?

    Publié par 0Sekful | 9 mars 2016, 22 h 52 min

Rétroliens/Pings

  1. Pingback: Arduino | Pearltrees - 22 mars 2013

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.