Test d'un Dallas DS2401 - N° de Série hardware unique

Bonjour

Le DS2401 est un composant qui fonctionne avec le protocole 1-Wire (aussi connu sous le nom de bus Dallas ou OneWire). Son utilité est de fournir un numéro de série unique sur 64 bits, gravé dans le silicium de la puce lors de sa fabrication. Son usage est simple - si vous voulez rendre unique un montage, vous rajoutez une de ces puces dans votre montage et voilà il y a un N° de série. Votre code Arduino peut alors tester ce N° de série pour autoriser où non un fonctionnement par exemple.

Dans un post récent il y avait une discussion sur la modification du numéro de série d'un DS2401 qui bien sûr est impossible pour le commun des mortels puisque le N° est gravé dans le "matériel".

Je me suis dit que ce serait une bonne occasion de ressortir un de mes composants et de remettre à jour un petit code de lecture du N° de série et le partager ici

Je dispose de la version TO92 du composant. il a 3 pattes. Une pour le GND, une pour les données et une qui n'est pas connectée (cf la documentation)

Le montage est d'une simplicité enfantine:

On Connecte la pin 7 (celle que vous voulez - à définir dans le code) de l'arduino à PIN 2 du DS2401
On connecte aussi PIN 2 du DS2401 à 5V via une Résistance de 4.7kΩ
On connecte PIN 1du DS2401 vers GND de l'Arduino
On laisse la PIN 3 du DS2401 en l'air vu qu'elle n'est pas connectée et ne sert à rien


(ici avec une MEGA mais idem sur UNO)

Le code est assez simple, si vous lisez la doc ils disent d'envoyer sur le bus 1-Wire la commande 0x33 et que le composant (ne marche que s'il n'y en a qu'un) va répondre avec 8 octets:

  • 1 octet de 'famille'
  • 6 octets de N° de série (unique)
  • 1 octet de code de vérification de conformité (CRC des 7 premiers octets)

Voilà le code, tout est dans le setup()

// TEST DE LECTURE DU NO DE SERIE D'UN DS2401
// https://pdfserv.maximintegrated.com/en/ds/DS2401.pdf

// J'AI UN FORMAT TO92 --> Pin 1 = GND, PIN 2 = DATA, PIN3 = Non Connectée

// On Connecte la pin 7 de l'arduino à PIN 2
// On connecte aussi PIN 2 à 5V via une Résistance de 4.7kΩ
// On connecte pin1 vers GND

const byte oneWirePin = 7;

#include <OneWire.h>
OneWire DS2401(oneWirePin);

void printHex(byte b, const char separateur = '\n')
{
  if (b <= 0xF) Serial.print(0);
  Serial.print(b, HEX);
  if (separateur) Serial.write(separateur);
}


void setup()
{
  Serial.begin (115200);
  Serial.println(F("TEST DU DALLAS DS2401"));

  if (DS2401.reset()) {
    byte data[8];   // les 64 bits (8 octets) du DS2401: 8 bits de famille, 48bits de N° de série et 8 bits de CRC

    // extrait du manuel:
    // This command allows the bus master to read the DS2401’s 8-bit family code,
    // unique 48-bit serial number, and 8-bit CRC. This command can only be used
    // if there is a single DS2401 on the bus. If more than one slave is present on
    // the bus, a data collision will occur when all slaves try to transmit at the
    // same time (open drain will produce a wired-AND result). The DS2401 Read ROM
    // function will occur with a command byte of either 33h or 0Fh in order to ensure
    // compatibility with the DS2400, which will only respond to a 0Fh command word with
    // its 64-bit ROM data.

    DS2401.write(0x33);  //on envoie la commande de lecture "Read ROM [33h]"

    // on lit la réponse qui consiste en 8 octets

    data[0] = DS2401.read(); // le premier est le N° de famille
    Serial.print(F("Code famille: 0x"));
    printHex(data[0]);

    Serial.print(F("No de serie: 0x"));
    for (byte i = 1; i <= 6; i++) // les 6 suivants sont le N° de série
    {
      data[i] = DS2401.read(); // on lit les 6 octets
      printHex(data[i], (i < 6) ? '\0' : '\n');
    }

    data[7] = DS2401.read(); //on lit le dernier octect qui est le CRC

    // on vérifie que le CRC de la puce est bien le m$eme que celui calculé
    if (data[7] == OneWire::crc8(data, 7)) {
      Serial.print(F("CRC du DS2401 correct = 0x"));
      printHex (data[7]);
    } else {
      Serial.println(F("Erreur de CRC"));
    }
  }
}

void loop() {}

J'ai fait deux fois de suite le test avec deux de mes composants différents et j'ai obtenu

[sub][color=blue]TEST DU DALLAS DS2401
Code famille: 0x01
No de serie: 0xC19499090000
CRC du DS2401 correct = 0xC1

TEST DU DALLAS DS2401
Code famille: 0x01
No de serie: 0x75EC98090000
CRC du DS2401 correct = 0xC6
[/color][/sub]

ça à l'air de fonctionner :slight_smile:

J-M-L:
Bonjour

Le DS2401 est un composant qui fonctionne avec le protocole 1-Wire (aussi connu sous le nom de bus Dallas ou OneWire). Son utilité est de fournir un numéro de série unique sur 64 bits, gravé dans le silicium de la puce lors de sa fabrication. Son usage est simple - si vous voulez rendre unique un montage, vous rajoutez une de ces puces dans votre montage et voilà il y a un N° de série. Votre code Arduino peut alors tester ce N° de série pour autoriser où non un fonctionnement par exemple.

Dans un post récent il y avait une discussion sur la modification du numéro de série d'un DS2401 qui bien sûr est impossible pour le commun des mortels puisque le N° est gravé dans le "matériel".

Je me suis dit que ce serait une bonne occasion de ressortir un de mes composants et de remettre à jour un petit code de lecture du N° de série et le partager ici

Je dispose de la version TO92 du composant. il a 3 pattes. Une pour le GND, une pour les données et une qui n'est pas connectée (cf la documentation)

Le montage est d'une simplicité enfantine:

On Connecte la pin 7 (celle que vous voulez - à définir dans le code) de l'arduino à PIN 2 du DS2401
On connecte aussi PIN 2 du DS2401 à 5V via une Résistance de 4.7kΩ
On connecte PIN 1du DS2401 vers GND de l'Arduino
On laisse la PIN 3 du DS2401 en l'air vu qu'elle n'est pas connectée et ne sert à rien


(ici avec une MEGA mais idem sur UNO)

Le code est assez simple, si vous lisez la doc ils disent d'envoyer sur le bus 1-Wire la commande 0x33 et que le composant (ne marche que s'il n'y en a qu'un) va répondre avec 8 octets:

  • 1 octet de 'famille'
  • 6 octets de N° de série (unique)
  • 1 octet de code de vérification de conformité (CRC des 7 premiers octets)

Voilà le code, tout est dans le setup()

// TEST DE LECTURE DU NO DE SERIE D'UN DS2401

// https://pdfserv.maximintegrated.com/en/ds/DS2401.pdf

// J'AI UN FORMAT TO92 --> Pin 1 = GND, PIN 2 = DATA, PIN3 = Non Connectée

// On Connecte la pin 7 de l'arduino à PIN 2
// On connecte aussi PIN 2 à 5V via une Résistance de 4.7kΩ
// On connecte pin1 vers GND

const byte oneWirePin = 7;

#include <OneWire.h>
OneWire DS2401(oneWirePin);

void printHex(byte b, const char separateur = 'n')
{
 if (b <= 0xF) Serial.print(0);
 Serial.print(b, HEX);
 if (separateur) Serial.write(separateur);
}

void setup()
{
 Serial.begin (115200);
 Serial.println(F("TEST DU DALLAS DS2401"));

if (DS2401.reset()) {
   byte data[8];   // les 64 bits (8 octets) du DS2401: 8 bits de famille, 48bits de N° de série et 8 bits de CRC

// extrait du manuel:
   // This command allows the bus master to read the DS2401’s 8-bit family code,
   // unique 48-bit serial number, and 8-bit CRC. This command can only be used
   // if there is a single DS2401 on the bus. If more than one slave is present on
   // the bus, a data collision will occur when all slaves try to transmit at the
   // same time (open drain will produce a wired-AND result). The DS2401 Read ROM
   // function will occur with a command byte of either 33h or 0Fh in order to ensure
   // compatibility with the DS2400, which will only respond to a 0Fh command word with
   // its 64-bit ROM data.

DS2401.write(0x33);  //on envoie la commande de lecture "Read ROM [33h]"

// on lit la réponse qui consiste en 8 octets

data[0] = DS2401.read(); // le premier est le N° de famille
   Serial.print(F("Code famille: 0x"));
   printHex(data[0]);

Serial.print(F("No de serie: 0x"));
   for (byte i = 1; i <= 6; i++) // les 6 suivants sont le N° de série
   {
     data[i] = DS2401.read(); // on lit les 6 octets
     printHex(data[i], (i < 6) ? '�' : 'n');
   }

data[7] = DS2401.read(); //on lit le dernier octect qui est le CRC

// on vérifie que le CRC de la puce est bien le m$eme que celui calculé
   if (data[7] == OneWire::crc8(data, 7)) {
     Serial.print(F("CRC du DS2401 correct = 0x"));
     printHex (data[7]);
   } else {
     Serial.println(F("Erreur de CRC"));
   }
 }
}

void loop() {}





J'ai fait deux fois de suite le test avec deux de mes composants différents et j'ai obtenu 



[sub][color=blue]TEST DU DALLAS DS2401
Code famille: 0x01
No de serie: 0xC19499090000
CRC du DS2401 correct = 0xC1

TEST DU DALLAS DS2401
Code famille: 0x01
No de serie: 0x75EC98090000
CRC du DS2401 correct = 0xC6
[/color][/sub]




ça à l'air de fonctionner :)

Bonsoir JML
y a aucune raison que cela ne fonctionne pas ! :grin:

2 petits commentaires :

DS4201 et DS1990 c'est "kif/kif" (family code 0X01)

A ma connaissance , tous les compos slave 1-Wire®
renvoient sur "demande" du master leur "Unique, Factory Bit Registration Number (8-Bit Family Code + 48-Bit Serial Number + 8-bit CRC ) "
Et ce
" sans autre besoin que de les connecter entre (DQ/DATA) et GND au master "
même les compos 1-Wire® "+/- gourmand" en énergie" pour renvoyer/accepter d'autres infos/data

exemple typique , le DS18B20 bien connu sur le forum 8)

une simple connexion DQ/GND renverra son "ID" , mais pour obtenir une T° (phase acquisition/restitution)
il faudra choisir entre alim standard ou le "mode parasitic" du slave.

boite à grouille

Oui ceux que je connais de Maxim répondent effectivement à la commande 0x33 par leur N° de série.

Ce post était juste pour faire suite à l’autre discussion sur ce composant (c’est pour cela que je n’ai pas mis dans les tutos)

ça fait longtemps que je n’avais pas entendu parler des iButton! :slight_smile:

J-M-L:
ça fait longtemps que je n’avais pas entendu parler des iButton! :slight_smile:

et pourtant ...

pour certains , ils ont des "domaines/secteurs" d'emploi où il sont toujours encore aujourd'hui "quasi incontournable"

"ils" ont des domaines d'emploi ... "particuliers" 8)