Category Archive: Programation

Apr 28 2015

Horloge radio synchronisée par DCF77 avec sortie NMEA

DCF_Clock_01Peut être est-ce une question de gêne helvétique, mais, dans mon shack, j’ai besoin d’avoir l’heure précise devant les yeux. Pour remplir le log, contrôler le départ de mes trames WSPR et JT65, etc.
Pour ce faire, j’ai acheté deux horloges LCD. Une pour l’heure locale et une pour l’heure UTC.
Elles sont autonomes et il est  nécessaire de les remettre à l’heure régulièrement, sans quoi elles prennent quelques dizaines de secondes par semaine.
J’avais pensé les connecter à mon oscillateur OCXO de référence 10MHz pour assurer une précision minimum.
En démontant les dites horloges, je me suis trouvé face à un simple rond noir sur le circuit imprimé,  ni plus, ni moins. Et je la plante où ma fréquence de référence ?
Il faut trouver autre chose…
Je sais qu’il existe des horloges radio synchronisées, mais malgré quelques recherches je n’ai pas trouvé mon bonheur, comme par exemple l’affichage de deux fuseaux horaires (CET et UTC) et un encombrement réduit.

“Si tu ne trouves pas ton bonheur, alors fais le toi même”

DCF77 est un émetteur ondes longues situé en Allemagne dont la fréquence porteuse est de 77.5kHz, Avec une puissance de 30kW, on peut le recevoir dans de très bonnes conditions sur une grande partie de l’Europe. Il transmet l’heure légale “atomique” sous la forme binaire à raison de 1 bit par seconde. Les impulsions émises à chaque début de seconde sont de longueurs différentes, 100ms pour un 0 et 200ms pour un 1. L’ensemble de ces bits fournissent l’heure et la date au format BCD. Des bits de parité permettent de contrôler la validité des informations reçues.
Toute la doc concernant DCF77 sur Wikipédia.
dcf77coding

Il y a quelques temps, j’ai repéré sur la baie un petit module récepteur DCF77 munis de son antenne en ferrite.
Pour quelques dollars, j’en ai acquis un exemplaire. Celui ci intègre toute la partie réception et délivre un signal démodulé sous forme d’impulsions pouvant êtres traitées par un micro contrôleur.
dcf77_recepteurAyant récupéré un affichage LCD 4*16 sur une “vieille” radio internet, il ne me manquait plus que le cerveau.
Il existe dans le monde Arduino une librairie qui permet facilement d’implémenter un décodage de l’heure à partir des impulsions fournies par le récepteur.
En une soirée on peut monter une horloge radio sans trop d’effort.

Une seconde solution consiste à utiliser un uC AVR ATMega48 munis de son oscillateur interne, largement suffisant  avec ses 4kbytes pour cette horloge.
Et puis l’idée de mettre les mains de le cambouis me plaisait beaucoup.

Première étape, un schéma pour s’y retrouver (ici le définitif):

dcf_clock_schemaLe schéma au format PDF :  DCF_Clock_NMEA

Trouver la seconde 0

On commence par chercher le début de la minute, pour être synchro avec les bits qui nous permettront de décoder l’heure.
On utilise un des trois timer du uC pour détecter l’absence d’impulsion de la seconde 59.
Chaque flanc montant va déclencher l’appel d’une interruption. Dans celle ci on compare le temps écoulé entre deux appels. Si ce temps est de deux secondes, nous avons alors trouvé la seconde zéro.
Pour éviter de se synchroniser sur une fausse absence d’impulsion, par exemple en cas de mauvaise réception, un deuxième tour est effectué pour confirmer la position du début de minute.

Le décodage de l’heure

Le décodage de la longueur des impulsions utilise également l’interruption déclenchée par le flanc montant du signal.
A son appel on active un deuxième timer qui appellera à son tour une autre interruption, 150ms plus tard.
A ce moment précis, l’état de l’entrée du uC sur laquelle est connecté la sortie du récepteur nous indique simplement la valeur du bit reçu.

La suite est assez simple. On récolte les bits, on les assemble, on les décode et on contrôle que le la parité soit correcte. Le cas échéant, on affiche l’heure, la date, etc.
On repart dans la vérification de la position de la seconde 59, on décode l’heure, on vérifie la seconde 59, on décode l’heure, et ainsi de suite.

Une vidéo du premier prototype :

Real Time Clock DS3231

Dans cet état là, l’horloge doit refaire sa synchro à chaque remise en marche ce qui peut être long si le signal est perturbé, par exemple lors d’un orage.
J’ai trouvé un module RTC à 1$ destiné à la platine Arduino et qui communique par I2C.
Le DS3231, qui est équipé d’un TCXO, d’un accu Li-On au format 2032 et d’un thermomètre.

sku_222910_1Une fois mis à l’heure, le module fonctionne même si l’horloge n’est plus alimentée. Après une semaine sans alimentation la dérive reste relativement faible, soit environ 400ms de décalage dans un pièce à 21°C.

Sortie NMEA pour WSPR et JT65

Pour mes activités en portable WSPR et JT65 j’utilise un GPS maison pour la synchro. Mais il m’est arrivé quelques fois que la réception soit insuffisante, notamment à l’intérieur de bâtiments.
Ces modes numériques n’utilisent que le code horaire et en WSPR j’introduis manuellement le locator. L’idée m’est alors venue de générer une trame NMEA pour simuler un GPS et ainsi synchroniser mon Ultimate2 ou mon PC au moyen de l’horloge DCF.
Le système ne génère que la trame minimale RMC qui est suffisante pour mes applications. La communication est assurée par l’UART du uC et un FTDI232 externe pour une sortie USB.
Une sortie supplémentaire du microcontrôleur est utilisée pour le PPS nécessaire à l’Ultimate2.

 

DCF_Clock_02

La platine avec le uC et la RTC

La plaque frontale a été fabriquée au moyen d’un morceau de verre acrylique que j’ai dépoli grossièrement autour du LCD.

Le bilan de l’opération est plutôt positif, pour environ 30CHF, j’ai une horloge qui fonctionne à merveille et qui permet d’avoir une source de synchro autre que le GPS ou l’Internet pour les modes numériques.

73’s !

Laurent

 

 

Permanent link to this article: http://www.hb9fgk.org/horloge-radio-synchronisee-par-dcf77/

Mar 06 2015

TRX SSB 4 bandes – Librairie C AVR pour adresser un LCD à HD44780

Le type le plus commun de contrôleur utilisé par les modules LCD est le Hitachi HD44780, qui utilise une interface relativement simple entre le microcontrôleur et l’affichage.
C’est ce type de LCD qui a été choisi pour l’affichage des informations sur le TRX 4 bandes. (Voir le précédent billet pour une démo en vidéo)

Bien qu’il existe plusieurs librairies disponibles pour utiliser ces affichages au moyen d’un microcontrôleur AVR, j’ai opté pour l’option d’écrire ma propre collection de fonctions.
Pour ce faire, toute la documentation nécessaire (et bien plus) est trouvable sur la toile sans aucune difficulté. Il n’y plus qu’à….

Hardware

Avant de passer à la partie programmation, il est nécessaire de préparer et de connecter le microcontrôleur et l’affichage.
Le contrôleur peut être adressé soit avec un bus de 4 bit, soit avec un bus de 8 bit. Je ne sais pas chez vous, mais de mon côté le nombre de ports disponibles sur le uC a tendance à ne jamais être suffisant et c’est pour cette raison que c’est le bus à 4 bit qui a été retenu. Bien entendu il faut compenser ce “manque” de manière logicielle en envoyant chaque byte en deux paquets de quatre bits, les bits de poids fort en premier puis les bit de poids faible.
En plus des quatre bits sus-mentionnés, des lignes de contrôle, au nombre de trois, sont nécessaires :

  • EN ou E : Enable, Entrée de validation
  • RS : Sélection du registre de données ou d’instruction
  • RW : Mode lecture ou écriture

De ces trois, seules deux sont utilisées: EN et RS. La ligne RW permet, en mode lecture, de lire ce qui se trouve dans les différentes mémoire du contrôleur, ce dont je n’ai pas besoin, en tout cas dans un premier temps. Nous la forçons à zéro, c’est à dire en mode écriture.
Voici donc un schéma de principe en exemple :

schema_hd44780

Software

La librarie créée comporte deux fichiers. lcd_hd44780.c qui implémente les fonctions et auquel on ne touche en principe pas. Puis le fichier lcd_hd44780.h qui lui contient les déclarations des fonctions. C’est dans ce fichier que nous allons configurer notre librarie.

Il faut paramétrer la librairie avec les ports qui sont utilisés pour communiquer avec l’affichage :

// Définition des ports -----------------------------------------------------

#define RS_PORT PORTB
#define RS_BIT PB6

#define EN_PORT PORTB
#define EN_BIT PB7

#define DATA_PORT PORTC
#define DATA_BIT PC0 // Position du premier bit des data (lsb).
                     // Les trois autres bits doivent suivre consecutivement.

Les quatre bits de data doivent être sur le même port et se suivre.
Dés maintenant nous pouvons utiliser notre librairie en commençant par l’initialisation du LCD avec la commande init_lcd().

Cette commande initialise l’affichage avec l’affichage visible, le curseur invisible et fixe, puis efface l’écran.
Pour modifier ces états de départ à tout moment, on peut utiliser la fonction lcd_setdisplay(LCD_ON|CURSOR_OFF|CURSOR_NOBLINK); .Les options disponibles sont : CURSOR_ON, CURSOR_OFF, LCD_ON, LCD_OFF, CURSOR_BLINK, CURSOR_NOBLINK.

Ensuite nous pouvons utiliser les commandes d’affichage suivantes autant que nécessaire :

void lcd_putchar(char car); Ecrit un caractère à l’emplacement du curseur
void lcd_putstr(char *text); Ecrit une chaîne à l’emplacement du curseur
void lcd_gotoxy(unsigned char x, unsigned char y); Place le curseur sur l’affichage aux coordonnées X et Y.
void lcd_clrscr(void); Efface l’écran

Et pour terminer, voici un exemple simple :

#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd_hd44780.h"

int main(void)
{
       DDRB = 0xc0;
       DDRC = 0x0f;

       init_lcd();
       lcd_gotoxy(6,0);
       lcd_putstr("Hello");
       lcd_gotoxy(5,1);
       lcd_putstr("world!);

       while(1)
        {
        }

Vous pouvez télécharger la librairie sur la page download.

73’s

Laurent

 

Permanent link to this article: http://www.hb9fgk.org/trx-ssb-4-bandes-librairie-c-pour-adresser-un-lcd-a-hd44780/

0 visitors online now
0 guests, 0 members
Max visitors today: 4 at 09:39 am UTC
This month: 8 at 12-01-2021 02:05 pm UTC
This year: 94 at 09-24-2021 05:16 am UTC
All time: 94 at 09-24-2021 05:16 am UTC