Monday, June 11, 2012

RTC avec un arduino - Distributeur de croquettes pour chats

Cet article est la suite de mon article précédent et nous nous intéresserons à la gestion du temps.

Quelle heure avez-vous ?

Pour ce projet, j'ai utilisé un RTC, qui permet de fournir au Arduino une source de temps, y compris en cas de redémarrage ou même de coupure de courant. C'est d'ailleurs le composant qui est utilisé dans les ordinateurs pour maintenir l'heure du BIOS. Il existe plusieurs versions de RTC : certaines donnent l'heure, d'autres, permettent de programmer une heure de réveil.
L'autre avantage du RTC par rapport à la gestion de temps "basique" de l'Arduino est qu'il permet de s'abstraire également de toute la gestion du calendrier (jour de la semaine, mois à 30 ou 31 jour et année bissextile).
J'ai donc utilisé un composant de chez Maxim, le DS 1307, qui est un RTC sur bus i2c. Il a l'avantage d'avoir une librairie arduino prête à l'emploi, ce qui facilitera grandement l'intégration !
Le câblage est très simple et nécessite quelques composants auxiliaires :

  • Un quartz 32.768 KHz
  • 2 résistances de pull-up 2.2k
  • Une pile bouton CR2032
J'ai commencé par câbler le RTC sur une plaque de prototypage.
Puis j'ai soudé le composant sur une plaque d'essai en bakélite. Rien de bien compliqué.

La gestion du RTC dans l'Arduino

Une librairie arduino facilite grandement l'exploitation du composant. Comme il s'agit d'un composant I²C, la connexion se fait sur les E/S dédiées de l'Arduino :
  • SDA (data line) sur l'E/S analogique 4
  • SCL (clock line) sur l'E/S analogique5
Ensuite, c'est simplissime, grâce à librairie d'Adafruit :
#include 
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
La lecture de l'heure se fait ensuite de manière triviale :
DateTime now = RTC.now(); 

Et après ?

Je vous parlerais de la partie électronique de puissance, c'est à dire de la façon dont j'ai interfacé le moteur du tournevis électrique.

PS

Une fois que j'avais soudé sur plaque en backélite, j'ai trouvé sur mon site préféré un petit module tout fait à base de DS1302, à un prix défiant toute concurrence : 3.60$ !
Le DS1302 est un peu différent du DS1307 : il n'utilise pas d'interface I²C, mais une interface série "à l'ancienne". Ce n'est pas vraiment un problème pour l'interfaçage, on perd juste l'avantage du bus I²C (qui permet d'interfacer plusieurs (jusqu'à 127) modules sur les 2 pins dédiées). D'ailleurs, le DS1302 est suffisamment répandu pour avoir (au moins) une librairie sur github.

No comments:

Post a Comment