RTC (Real Time Clock)

Ce composant, une fois programmé, donne la date et l'heure. On les trouve sur les ordinateurs (PC ou autres), sur les DataLogger: appareils qui effectue des mesures physiques et les stocke sur un disque ou une clé USB en les datant. Etc .. Ils sont équipés d'une pile de 3V CR2023 et continuent donc de fonctionner après une coupure de courant.
3 composants "Dallas" dénommés sont décrits ici.
  • le DS1307
  • le DS1302
  • le DS3231
Leur couplage avec un Arduino(Uno ou Mini Pro) nous permettra d'initialiser la date et l'heure, puis de la relire.

Les protocoles de communication

I2C Bus

Ce protocole concerne, ici, les DS1307 et DS3231.
I2C est un bus série synchrone bidirectionnel half-duplex.
Plusieurs équipements, soit maîtres, soit esclaves, peuvent être connectés au bus.
Les échanges ont toujours lieu entre un seul maître et un (ou tous les) esclave(s), toujours à l'initiative du maître (jamais de maître à maître ou d'esclave à esclave). Cependant, rien n'empêche un composant de passer du statut de maître à esclave et réciproquement.
La connexion est réalisée par l'intermédiaire de 2 lignes :
  • SDA (Serial Data Line) : ligne de données bidirectionnelle,
  • SCL (Serial Clock Line) : ligne d'horloge de synchronisation bidirectionnelle.
Il ne faut également pas oublier la masse (GND) et l'alimentation 5V (Vcc) qui doivent être communs aux équipements.
Les 2 lignes sont tirées au niveau de tension VDD à travers des résistances de pull-up (RP).
Le nombre maximal d'équipements est limité par le nombre d'adresses disponibles, 7 bits pour l''adresse et un bit pour définir si on écrit ou on lit, soit 128 périphériques, mais il dépend également de la capacité (CB) du bus (dont dépend la vitesse maximale du bus). Il faut savoir que des adresses sont réservées pour diffuser des messages en broadcast et que de nombreuses adresses sont déjà attribuées par les fabricants ce qui limite grandement le nombre d'équipements (une variante d'adressage sur 10 bits existe également) ... En savoir plus 

SPI Bus

Ce protocole concerne le DS1302.
Une liaison SPI (pour Serial Peripheral Interface) est un bus de données série synchrone baptisé ainsi par Motorola, qui opère en mode Full-duplex. Les circuits communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par une ligne dédiée entre le maître et l'esclave appelée chip select.
Le bus SPI utilise 4 signaux logiques :
  • SCLK — Serial Clock, Horloge (généré par le maître)
  • MOSI — Master Output, Slave Input (généré par le maître)
  • MISO — Master Input, Slave Output (généré par l'esclave)
  • SS — Slave Select, Actif à l'état bas (généré par le maître)
Il existe d'autres noms qui sont souvent utilisés :
  • SCK — Horloge (généré par le maître)
  • SDI, DI, SI — Serial Data IN
  • SDO, DO, SO — Serial Data OUT
  • nCS, CS, nSS, STE — SS
Dans le cas de la convention de nommage SDI/SDO, le SDO du maître doit-être relié au SDI de l'esclave et vice versa. Pour éviter les confusions au moment du câblage, il est donc souvent recommandé d'utiliser les dénominations MISO-MOSI qui évitent une certaine ambiguïté. A suivre ...

Le DS1307

Le composant

Ce composant Dallas est basé sur le protocole de communication I2C décrit plus haut.
En plus des I/O de I2C Bus SDA et SCL, il offre un signal carré (SQW/OUT) dont la fréquence est paramétrable avec les 4 valeurs suivantes : 1 Hz, 4096 kHz, 8192 kHz, 32768 kHz.

Le constructeur Maxim dans la note 58, donne une dérive de ±20 ppm  à ±30 ppm due au quartz. Soit 1.7 à 2.6s par jour ou autour de ±1 mn/mois).

Il contient une NVRAM dont 56 octets sont disponibles pour sauvegarder divers information (statut, configuration, ...).

DS1307 PDF

Interconnexion à l'Arduino

Le DS1302

Ce RTC s'appuie sur le protocole de communication SPI.
Avec ce type de dispositif, tous les composants SPI ont leur broche SDA  reliées entre elles d'une part et leur broche SCL reliées entre elles d'autres part. Le composant SPI sait qu'il est sélectionné à l'aide d'une broche de sélection CS . Il y a autant de fil de sélection que de composants en parallèle.
DS1302
UNO/MINI7SDA(TA)
6SCL(OCK)
8CS(EL)
MEGA29SDA(TA)
31SCL(OCK)
27CS(EL)
Interconnexion à l'Arduino

Le DS1307

DS1307
UNO / MINIA4SDA (TA)
A5SCL (OCK)
MEGA20SDA (TA)
21SCL (OCK)
Interconnexion à l'Arduino

Le DS3231

3231
UNO/MINIA4SDA(TA)
A5SCL(OCK)
MEGA20SDA(TA)
21SCL(OCK)
Interconnexion à l'Arduino
C'est une version améliorée de DS1307. Il est beaucoup plus précis, car il a un oscillateur interne qui n' est pas affecté par des facteurs externes. Il donne une date exacte jusqu'à au plus quelques minutes par an. Ils partagent donc les mêmes types de branchement
Ce composant Dallas est basé sur le protocole de communication I2C décrit plus haut.
En plus des I/O de I2C Bus SDA et SCL, il offre un signal carré (SQW/OUT) dont la fréquence est paramétrable avec les 4 valeurs suivantes : 1 Hz, 4096 kHz, 8192 kHz, 32768 kHz.
Le constructeur Maxim dans la note 58, donne une dérive de ±3 ppm. 
Il est contient une NVRAM dont  56 octets sont disponibles pour sauvegarder divers information (statut, configuration, ...).

Son expérimentation est en cours ...

Logiciels de setup horaire

Spécifications

Le dispositif logiciel de mise à l'heure des 3 composants décrits plus haut se décompose en 2 partie.

Soft Arduino

Ce logiciel implémenté sur Arduino permet de mettre à l'heure les RTC en ligne de commande via la liaison série entre un terminal (PC/Mac/TTY, ...). Les commandes sont décrites ici :

?T(X)  retourne la date déjà programmée dans le RTC. X = 1 pour le DS3231, 2 pour le DS1302, 7 pour le DS1307.

Le format retourné sera : YYYY_MM_DD_W_HH_mm_SS_CCCC...CC
où YYYY = année, MM = le mois, DD = le jour du mois, W = le joue de la semaine (0 = dimanche, ... 6 = samedi), HH = heure, mm = minute, SS = seconde, CCC..CC = le fuseau horaire en chaîne de catactère (UTC., PARIS., ...).

Exemple ?T7 retourne 2015-03-18-4-10-16-34 pour Mercredi 18 mars 2014 10:16:34 issu d'un DS1307.

!T(X)YYYY_MM_DD_HH_mm_SS_CCCC...CC  met à jour le composant X avec les valeurs qui suivent.
X = 1 pour le DS3231, 2 pour le DS1302, 7 pour le DS1307.

Le format de date sera : YYYY_MM_DD_HH_mm_SS_CCCC...CC
où YYYY = année, MM = le mois, DD = le jour du mois, W = le joue de la semaine (0 = dimanche, ... 6 = samedi), HH = heure, mm = minute, SS = seconde, CCC..CC = le fuseau horaire en chaîne de catactère (UTC., PARIS., ...).

Le jour de la semaine n'est pas nécessaire, il sera déduit par le RTC. Attention, pas de fuseau horaire mémorisable pour le DS1302 qui ne dispose pas de NVRAM pour stocker cela.

## retourne !! pour dire que le soft Arduino est à l'écoute.

Soft PC

Il constitue une aide confortable pour la mise à l'heure

Il permet
  • d'afficher l'heure UTC ou locale du système à avant la programmation.
  • de choisir le port série pour atteindre l'Arduino
  • de lire l'heure déjà programmée sur le RTC
  • de programmer le RTC
  • de suivre la dérive du RTC dans le temps
        #include <wire.h>
        #include <rtclib.h>
        #include "ds1302.h"
        #include "ds1307.h"

        char serial_buffer[BUFFER_SIZE];
        int buffer_position;
        ds1302_struct rtc;

        void setup() {
         buffer_position = 0;
         Serial.begin(56700);
         
         // Specific 1307
         Wire.begin();
         RTC.begin();
         
         // Specific 1302
         // Start by clearing the Write Protect bit
         // Otherwise the clock data cannot be written
         // The whole register is written,
         // but the WP-bit is the only bit in that register.
         DS1302_write (DS1302_ENABLE, 0);
         // Disable Trickle Charger.
         DS1302_write (DS1302_TRICKLE, 0x00);
        }