Module de réception DCF77

Le module de réception DCF77 utilisée dans cet article est commercialisé par Conrad sous la référence 641138-62. Le schéma des connexions figure ci-dessous :

Platine.png

On constate que ce récepteur propose deux sorties : la première est normale et la seconde est inversée. Les sorties étant à collecteur ouvert, il est nécessaire de placer une résistance de pull-up sur la sortie que l'on souhaite utiliser.

Schéma de câblage

Le schéma de câblage du module de réception DCF77 à l'Arduino Uno est le suivant :

Arduino_DCF77_bb.png

Les alimentations sont reliées comme il se doit. La résistance de pull-up est bien présente. La sortie de signal DCF77 du module de réception est connectée sur l'entrée numérique n°2, celle-ci étant également une entrée d'interruption.

[Télécharger le projet Fritzing]

Bibliothèque fiendie/Funkuhr

La bibliothèque Funkuhr de Fiendie permet de gérer un module de réception de l'heure DCF77. Les récepteurs DCF77 peuvent être classés en deux catégories en fonction de leur signal de sortie :

  • les récepteurs à signal de sortie normal ;
  • les récepteurs à signal de sortie inversé.

La bibliothèque Funkuhr ne gère que les premiers. Plutôt que de modifier la bibliothèque pour qu'elle gère les seconds, et que par conséquent elle ne puisse plus gérer les premiers, iDreamMicro préfère rendre la bibliothèque configurable.

La bibliothèque Funkuhr utilise deux broches d'entrée/sortie. La première sert à recevoir le signal fourni par le récepteur DCF77. La seconde sert à piloter une LED indiquant l'état de la réception. Malheureusement il n'est pas possible de modifier celles qui sont utilisées.

Pour remédier à ce manque de souplesse, iDreamMicro a donc créé un fork disponible sur GitHub.

Fork iDreamMicro/Funkuhr

Configuration de la bibliothèque

Dans le fichier source Funkuhr.cpp, on ajoute les variables statiques m_intNumber, m_dcf77Pin, m_blinkPin et m_invertedSignal :

003_-_Funkuhr_cpp_static_members.png

La variable m_invertedSignal doit être accessible dans la routine d'interruption. Par conséquent elle doit être statique et ne peut pas être un membre de classe comme l'exigerait la programmation orientée objet. Dans un soucis d'homogénéité, les variables m_intNumber, m_dcf77Pin et m_blinkPin sont également statiques.

On renomme la routine d'interruption int0handler et on en modifie la définition afin de prendre en charge les différents types de récepteurs DCF77 :

004_-_Funkuhr_cpp_interrupt_handler.png

On modifie l'initialisation de l'interruption :

006_-_Funkuhr_cpp_init_int.png

On ajoute les arguments intNumber, dcf77Pin, blinkPin et invertedSignal au constructeur de l'objet Funkuhr :

001_-_Funkuhr_h.png

  • dans le fichier source Funkuhr.cpp, sans oublier d'en modifier l'implémentation :

008_-_Funkuhr_cpp_constructor.png

On supprime les macros DCF77PIN et BLINKPIN respectivement remplacées par les variables m_dcf77Pin et m_blinkPin :

002_-_Funkuhr_cpp_macros.png

Et on modifie les différentes méthodes qui les utilisaient :

  • méthode init :

007_-_Funkuhr_cpp_init_pin.png

  • méthode getTime :

009_-_Funkuhr_cpp_getTime.png

Sketch d'exemple

Le constructeur Funkuhr propose des valeurs par défaut à ses différents arguments. Bien qu'il ne soit pas obligatoire de lui les passer, il est néanmoins préférable de modifier le sketch d'exemple de la bibliothèque Funkuhr :

010_-_Example.png

Le sketch d'exemple livré avec la bibliothèque Funkuhr n'est pas vu par l'environnement de développement Arduino. En effet, le fichier Example.pde est situé à la racine du dossier Funkuhr/examples alors qu'il devrait être dans un sous dossier portant le même nom que le sketch. On déplace donc ce fichier dans le dossier Funkuhr/examples/Example.

Coloration syntaxique

Bien qu'un fichier keywords.txt accompagne la bibliothèque Funkuhr, la coloration syntaxique ne fonctionne pas. La documentation Arduino indique :

Each line has the name of the keyword, followed by a tab (not spaces), followed by the kind of keyword.

Hors ce sont justement des espaces qui séparent le nom des mots-clés de leur type. On remédie à cette erreur et on en profite pour ajouter le mot clé Dcf77Time, structure représentant l'heure DCF77 :

011_-_keywords.png

[Télécharger la bibliothèque iDreamMicro/Funkuhr]

Mise en œuvre

On utilise le sketch Example.pde pour exploiter le module de réception DCF77.

/**
 * Example sketch for the Funkuhr Arduino library
 */
#include "Funkuhr.h"

Funkuhr dcf(0, 2, 13, false);
struct Dcf77Time dt = { 0 };

uint8_t curSec;


void dumpTime(void)
{	
	Serial.println("DCF77 Time");

	// Print date
	Serial.print(" ");

	if(dt.day < 10)
		Serial.print("0");
	Serial.print(dt.day, DEC);
	Serial.print(".");
	
	if(dt.month < 10)
		Serial.print("0");
	Serial.print(dt.month, DEC);
	Serial.print(".");
	
	if(dt.year == 0)
	{
		Serial.print("000");
	}
	else
	{
		Serial.print("20");
	}	

	Serial.print(dt.year, DEC);
	
	if(dcf.synced()) 
	{
		Serial.println(" ");
		Serial.print(" ");
	}
	else 
	{
		Serial.println(" ");
		Serial.print("~");
	}
	
	// Print Time 
	if (dt.hour < 10) 
		Serial.print("0");
	
	Serial.print(dt.hour, DEC);
	Serial.print(":");
	
	if (dt.min < 10) 
		Serial.print("0");
	
	Serial.print(dt.min, DEC);
	Serial.print(":");
	
	if (dt.sec < 10) 
		Serial.print("0");

	Serial.println(dt.sec, DEC);
	
	Serial.println(" ");
}


void setup(void) 
{
	Serial.begin(9600);
	dcf.init();
}


void loop(void) 
{
	dcf.getTime(dt);
	
	if(dt.sec != curSec)
	{
		dumpTime();
	}
	
	curSec = dt.sec;
}

Ce sketch récupère l'heure DCF77 puis la transmet par liaison série.

Le moniteur série de l'environnement de développement Arduino permet d'afficher l'heure DCF77 reçue par la carte de développement Arduino. L'heure s'incrémente relativement au démarrage de la carte (t = 0) tant que le module n'est pas synchronisé :

not_synchronized.png

Après une ou deux minutes, le module se synchronise sur un début de trame. L'heure DCF77 s'affiche alors dans le moniteur série :

synchronized.png

Conclusion

Tout fonctionne, Arduino est à l'heure légale. On peut dès à présent envisager de nombreuses applications, et pourquoi pas une horloge temps réel qui serait automatiquement mise à jour à l'heure DCF77. La suite dans un prochain article...

Le logiciel libre, et à plus forte raison Github, encourage les contributions. iDreamMicro adhère à cet état d'esprit et propose tout naturellement à Fiendie d'intégrer ces modifications dans la version originale. Pull request sent!

Références