Horloge pilotée par GPS
C'est une alternative aux horloges et montres pilotées par DCF77, tout le monde ne résidant pas dans un rayon de 500km de la ville allemande de Francfort. Cette horloge est pilotée par un petit récepteur GPS (un module NEO-6M) qui se synchronise sur les satellites du "Global Positioning System" américain, mais j'ai bien l'intention de le faire fonctionner un jour prochain avec le système Galileo.
1 Le proto 100% fonctionnel :
|
31 décembre 2015:
Je ne présente plus le module NEO-6M, visible en haut à droite, je l'ai déjà fait en détail pour mon générateur VHF 1Hz à 120MHz.
Le microcontrôleur est un ATmega8, en version DIL sur ce proto, et CMS pour la version définitive.
|
|
2 Le schéma :
|
|
La sortie TX (RS232) du NEO-6M est reliée à l'entrée RX de l'Atmega. C'est par ce biais que sont transmises les informations donnant l'heure précise, suivant le protocole NMEA. (informations dénommées "GPZDA" = date and time) Toutefois ces infos ZDA ne sont pas émises par défaut par le NEO-6M, seules les informations GPGLL (latitude-longitude) le sont. Il faut paramétrer le NEO-7M (avec le logiciel windows "u-center") pour qu'il sorte ces ZDA. On peut ensuite, toujours à l'aide du logiciel u-center faire en sorte que ce paramétrage soit mémorisé en RAM interne alimentée par un accu lilliputien présent sur le module, ce qui signifie que ces infos sont en fait perdues si le module n'est pas alimenté pendant un ou deux jours... Solution : ré-paramétrer correctement le NEO-6M automatiquement à chaque mise en service, et sans utiliser le logiciel windows u-center. Et il se trouve que l'ATmega s’acquitte fort bien de cette tâche ! Et c'est la raison d'être de la seconde liaison entre le TX de l'ATmega et le RX du NEO-6M.
|
3 Modes d'affichages
Un inverseur (le petit switch soudé au bout des fils à gauche sur la photo principale) permet de basculer entre deux modes d'affichages :
- Heures et minutes seulement avec des gros chiffres
- Heure minutes secondes + date et jour de la semaine
Le jour de la semaine est calculé par l'ATmega, par une fonction basée sur l' Algorithme de Mike Keith.
|
|
|
4 Le firmware :
CODE SOURCE en C
/** Horloge GPS Version A du firmware -> pour afficheur LCD 2x16c **/ #define F_CPU 16000000 #include <util/delay.h> #include <avr/io.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include "dm_lcd3.cpp" // l'attribution des pins/ports pour le LCD (et le type de LCD) est faite dans le fichier dm_lcd.h #include "LCD_gros_chiffres2_628.c" #include "uart_628.c" char version[] = "version 2.5"; uint8_t heure, minute, seconde; uint8_t annee_ok, heure_ok, minute_ok, seconde_ok; uint8_t jour, mois; uint16_t annee; uint8_t jour_de_la_semaine; uint8_t octet_recu; uint8_t buffer232[100]; uint16_t compteur1; uint8_t a_effacer; void init_ports (void) // ports perso // 0 = entree, 1=sortie ; les 1 sur les pins en entrees activent les R de Pull Up (tirage à VCC) { DDRB |= 0b11111111; PORTB = 0b00000000; DDRC = 0b11111111; // bit4=SDA ; bit5=SLC PORTC = 0b00000000; DDRD = 0b11101110; // PD0 = entree RXD; PD4 = switch PORTD = 0b00010000; } void InitINTs (void) { } void init_variables(void) { compteur1 = 0; heure = 0; minute=0; seconde=0; jour =0; mois=0; annee=0; a_effacer =1; } void init_lcd() { uint8_t i; lcd_init(LCD_DISP_ON_CURSOR); // cursor on //cd_init(LCD_DISP_ON); // cursor off lcd_clrscr(); } void lcd_gotoxy_clrEOL (int x, int y) // place le curseur en x,y et efface jusqu'à la fin de la ligne { lcd_gotoxy(x, y); uint8_t i; for (i=x; i<20; i++){ lcd_puts(" "); } lcd_gotoxy(x, y); } void lcd_aff_nb (uint32_t valeur, uint8_t nb_chiffres, uint8_t nb_decimales, uint8_t affi_zeros) { //affiche un nombre en representation decimale // affi_zeros = 1 affiche les zéros non significatifs à gauche. unsigned char r ; char tbl[7]; char digit; uint8_t i; for (i=1; i<=nb_chiffres; i++) { r=48 + valeur % 10; // modulo (reste de la division) valeur /= 10; // quotient tbl[i]=r; } uint8_t debut = 1-affi_zeros; // pour ne pas afficher des zeros à gauche du 1er chiffre for (i=1; i<=nb_chiffres; i++) { if (i== (nb_chiffres - nb_decimales +1) ) { lcd_puts("."); } digit = tbl[nb_chiffres +1 -i]; if (digit != '0') {debut = 0;} if ((digit != '0') || (debut == 0)) {lcd_putc(digit);} } } void lcd_aff_nb_relatif (int16_t valeur, uint8_t nb_chiffres, uint8_t nb_decimales) { //affiche un nombre relatif (c.a.d positif ou négatif) en representation decimale unsigned char r ; char tbl[7]; char digit; uint8_t i; uint8_t affi_zeros = 1; // affi_zeros = 1 affiche les zéros non significatifs à gauche. if (valeur <0) { valeur = -valeur; lcd_putc('-'); } else { lcd_putc('+'); } for (i=1; i<=nb_chiffres; i++) { r=48 + valeur % 10; // modulo (reste de la division) valeur /= 10; // quotient tbl[i]=r; } uint8_t debut = 1-affi_zeros; // pour ne pas afficher des zeros à gauche du 1er chiffre for (i=1; i<=nb_chiffres; i++) { if (i== (nb_chiffres - nb_decimales +1) ) { lcd_puts("."); } digit = tbl[nb_chiffres +1 -i]; if (digit != '0') {debut = 0;} if ((digit != '0') || (debut == 0)) {lcd_putc(digit);} } } void lcd_aff_nb_form3 (uint32_t valeur, uint8_t nb_chiffres) { //affiche un nombre en representation decimale en separant les groupes de 3 chiffres unsigned char r ; char tbl[7]; uint8_t i; for (i=1; i<=nb_chiffres; i++) { r=48 + valeur % 10; // modulo (reste de la division) valeur /= 10; // quotient tbl[i]=r; } for (i=1; i<= nb_chiffres; i++) { if ((((i-1) % 3) == 0 ) && (i>1)) { lcd_puts("."); } lcd_putc(tbl[nb_chiffres +1 -i]); } } void lcd_aff_bin (uint16_t valeur, uint8_t nb_digits) { //affiche un nombre en representation binaire // 16 bits max uint8_t r ; char tbl[17]; uint8_t i; for (i=1; i<=nb_digits; i++) { r= 48 + valeur % 2; // modulo (reste de la division) valeur /= 2; // quotient tbl[i]=r; }; for (i=1; i<=nb_digits; i++) { lcd_putc(tbl[nb_digits +1 -i]); } } void lcd_aff_hexa(uint16_t valeur, int nb_signes) { //affiche un nombre en representation hexadécimale // 16 nb_signes hexa max unsigned char r ; char tbl[17]; char signes[17] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; uint8_t i; for (i=1; i<=nb_signes; i++) { r= valeur % 16; // modulo (reste de la division) valeur /= 16; // quotient tbl[i]=signes[r]; }; for (i=1; i<=nb_signes; i++) { lcd_putc(tbl[nb_signes +1 -i]); } //lcd_putc('h'); } // lcd_aff_nb (valeur, nb_chiffres, nb_decimales, affi_zeros) void affiche_heure() { lcd_gotoxy_clrEOL (0, 0); lcd_aff_nb(heure, 2, 0, 1); lcd_gotoxy(2, 0); lcd_putc(':'); lcd_gotoxy(3, 0); lcd_aff_nb(minute, 2, 0, 1); lcd_gotoxy(5, 0); lcd_putc(':'); lcd_gotoxy(6, 0); lcd_aff_nb(seconde, 2, 0, 1); } void affiche_heure_BIG() { uint8_t h_u, h_d, mn_u, mn_d; if(a_effacer == 1) {lcd_clrscr(); a_effacer = 0;} mn_d = minute / 10; mn_u = minute % 10; h_d = heure / 10; h_u = heure % 10; if(h_d >0) { lcd_affi_Gros_Chiffre(h_d, 0);} else { lcd_efface_Gros_Chiffre(0); } lcd_affi_Gros_Chiffre(h_u, 4); if((seconde % 2) == 0) {seperateur(7);} else {lcd_efface_Gros_Chiffre(7);} lcd_affi_Gros_Chiffre(mn_d, 9); lcd_affi_Gros_Chiffre(mn_u, 13); } void affiche_date() { lcd_gotoxy_clrEOL (0, 1); if (annee_ok == 1) { lcd_aff_nb(jour, 2, 0, 1); lcd_gotoxy(2, 1); lcd_putc('-'); lcd_gotoxy(3, 1); lcd_aff_nb(mois, 2, 0, 1); lcd_gotoxy(5, 1); lcd_putc('-'); lcd_gotoxy(6, 1); lcd_aff_nb(annee, 4, 0, 1); lcd_gotoxy(11, 1); //lcd_aff_nb(jour_de_la_semaine, 2, 0, 1); char jours[7][3] = { {'D', 'I', 'M'},{'L', 'U', 'N'},{'M', 'A', 'R'},{'M', 'E', 'R'},{'J', 'E', 'U'},{'V', 'E', 'N'},{'S', 'A', 'M'}}; uint8_t i; for (i=0; i<3; i++) {lcd_putc(jours[jour_de_la_semaine][i]);} } else { lcd_gotoxy(2, 1); lcd_puts("Att date ok"); } } void RAZ_buffer() { uint8_t i; for (i=0; i<40; i++) { buffer232[i]=' '; } } void affiche_buffer232() { uint8_t n; //lcd_gotoxy_clrEOL(0,1); for(n=0; n<16; n++) { lcd_gotoxy(n, 0); lcd_putc(buffer232[n]); } for(n=0; n<16; n++) { lcd_gotoxy(n, 1); lcd_putc(buffer232[n+16]); // +16 ou +24 ou +32 suivant ce qu'on veut explorer } } void affiche_buffer232_hex() { uint8_t n, i; lcd_gotoxy_clrEOL(0,0); for(n=0; n<8; n++) { // affiche les 8 premiers octets sur la première ligne lcd_gotoxy(2*n, 0); lcd_aff_hexa(buffer232[n+8], 2); } lcd_gotoxy_clrEOL(0,1); for(n=0; n<10; n++) { // affiche les 8 octets suivants sur la seconde ligne lcd_gotoxy(2*n, 1); lcd_aff_hexa(buffer232[n+16], 2); } } void decode_message_horaire() { heure_ok =0; minute_ok=0; seconde_ok=0; heure = buffer232[7] -48 + 10*(buffer232[6] -48) +1; //pour la France -> +1 (heure d'hiver) ou +2 (heure d'été) if (heure <24) {heure_ok = 1;} minute = buffer232[9] -48 + 10*(buffer232[8] -48); if (heure <60) {minute_ok = 1;} seconde= buffer232[11] -48 + 10*(buffer232[10] -48); if (seconde <60) {seconde_ok = 1;} // heure =seconde; // <- pratique pour tester affichage gros chiffres jour = 0; mois = 0; jour = buffer232[17] -48 + 10*(buffer232[16] -48); mois = buffer232[20] -48 + 10*(buffer232[19] -48); annee = 0; annee_ok = 0; annee = buffer232[25] -48 + 10*(buffer232[24] -48) + 100*(buffer232[23] -48) + 1000*(buffer232[22] -48); if ((annee >0)&&(annee < 2100)) {annee_ok = 1;} } void calcul_jour_de_la_semaine() { // d'après l'Algorithme de Mike Keith uint16_t d, m, y, z, jds; d=jour; m=mois; y=annee; if (m>=3) { jds = ( ((23*m)/9) + d + 4 + y + (y/4) - (y/100) + (y/400) - 2 ) % 7; } else { z = y-1; jds = ( ((23*m)/9) + d + 4 + y + (z/4) - (z/100) + (z/400) ) % 7; } jour_de_la_semaine = jds; } /** Le message à transmettre au module NEO-6M peut-être affiché par u-center -ouvrir le fenêtre Messages (par F9 ou menu View / Messages View) -choisir dans la liste la fonction à programmer (ici: UBX / CFG(config/MSG(Messages) -puis dans la liste déroulante qui apparait alors dans la partie droite de la fenêtre 'Messages, selectionner 'F0-08 NMEA GxZDA' -le message à transmettre s'affiche alors dans le cadre au dessous. pour UBX-CFG(config)-MSG(Messages) = F0-08 NMEA GxZDA et UART1=on envoyé par u-centre -> B5 62 06 01 08 00 F0 08 00 01 00 00 00 00 08 60 B5 62 c'est l'entete toujours la même 06 01 -> CFG-MSG 08 00 -> LENGTH (=8 bytes) F0 08 c'est la commande ZDA (F0 = class, 08 = ID) 00 01 00 00 code pour UART1=on 00 00 08 60 à la fin nous donne le checksum qui convient Nous allons tranmettre ces 16 octets au module NEO-6M avec l'USART de l'ATmega, ce qui nous permettra pas la suite de nous passer du programme u-center **/ void config_NEO_6M_GPS() { //configure le recepteur GPS NEO-6M afin qu'il emette les informations horaires ("ZDA") sur son port RS232 // ce qui n'est pas le cas par défaut uint8_t i; uint8_t paquet[]={0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x08,0x60 }; for (i=0; i<16; i++) { USART_TxByte(paquet[i]); } } int main() { uint8_t i, n; uint8_t caract_i; init_variables(); init_ports(); InitINTs(); init_lcd(); cree_carateres(); USART_Init(); lcd_clrscr(); lcd_puts("Horloge GPS"); lcd_gotoxy(0,1); lcd_puts(version); _delay_ms(1000); lcd_command(LCD_DISP_ON); // cursor off lcd_clrscr(); affiche_heure(); // sei(); // enable interruptions _delay_ms(1000); lcd_clrscr(); lcd_gotoxy(0,1); lcd_puts("config ZDA GPS"); config_NEO_6M_GPS(); _delay_ms(1000); lcd_clrscr(); lcd_gotoxy(0,1); lcd_puts("Att signal GPS"); while(1) { i=0; octet_recu=0; RAZ_buffer(); /** caract_i = 0xB5; while (octet_recu != caract_i) { octet_recu=USART_RxByte(); } buffer232[0] = caract_i; n=1; octet_recu ='-'; while ((octet_recu != 0x0A) && (n<26)) { octet_recu=USART_RxByte(); buffer232[n]=octet_recu; n++;; } **/ //char debut_message[5]= {'G','P','G','L','L'}; char debut_message[5]= {'G','P','Z','D','A'}; caract_i = debut_message[0]; while (octet_recu != caract_i) { octet_recu=USART_RxByte(); } buffer232[i]=caract_i; i+=1; caract_i = caract_i = debut_message[1]; octet_recu=USART_RxByte(); if( octet_recu == caract_i) { buffer232[i]=caract_i; i+=1; caract_i = debut_message[2]; octet_recu=USART_RxByte(); if( octet_recu == caract_i) { buffer232[i]=caract_i; i+=1; caract_i = debut_message[3]; octet_recu=USART_RxByte(); if( octet_recu == caract_i) { buffer232[i]=caract_i; i+=1; caract_i = debut_message[4]; octet_recu=USART_RxByte(); if( octet_recu == caract_i) { buffer232[i]=caract_i; i+=1; for (n=i; n<33; n++) // 33 ou 65 suivant ce qu'on veut lire { octet_recu=USART_RxByte(); buffer232[n]=octet_recu; } //affiche_buffer232(); decode_message_horaire(); if ((heure_ok==1) && (minute_ok==1) && (seconde_ok==1)) { if ((PIND & 0b00010000) !=0 ) { calcul_jour_de_la_semaine(); affiche_heure(); affiche_date(); a_effacer = 1; } else { affiche_heure_BIG(); } } } } } } //affiche_buffer232(); //affiche_buffer232_hex(); compteur1--; if (compteur1 == 0) { compteur1 = 100; } _delay_ms(20); } }
|
|
CODE SOURCE en C
/************************************************************************************ LCD_gros_chiffres_628.c pour LCD 2x16 à Controller/Driver (HD44780) Ce code ci-dessous est inspiré du travail de " Written by Isaac A. on Dec. 9, 2014 " Le principe est repris à l'identique, les chiffres ont été redessinés (plus arrondis) Silicium628 - 30 décembre 2015 *************************************************************************************/ // commands #define LCD_SET_CG_RAM_ADDR 0x40 uint8_t bottom[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111, 0b11111 }; uint8_t top[8] = { 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; uint8_t fill[8] = { 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 }; uint8_t leftcircle[8] = { 0b00000, 0b00000, 0b00001, 0b00011, 0b00011, 0b00001, 0b00000, 0b00000 }; uint8_t rightcircle[8] = { 0b00000, 0b00000, 0b10000, 0b11000, 0b11000, 0b10000, 0b00000, 0b00000 }; uint8_t topandbottom[8] = { 0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111 }; void lcd_cree_1_char(uint8_t location, uint8_t charmap[]) { uint8_t i; location &= 0x7; // il y a 8 locations 0-7 lcd_command(LCD_SET_CG_RAM_ADDR | (location << 3)); for (i=0; i<8; i++) { lcd_putc(charmap[i]);} } void cree_carateres() { lcd_cree_1_char(0, bottom); lcd_cree_1_char(1, top); lcd_cree_1_char(2, fill); lcd_cree_1_char(3, leftcircle); lcd_cree_1_char(4, rightcircle); lcd_cree_1_char(5, topandbottom); } void espace(int pos) { lcd_gotoxy(pos, 0); lcd_puts(" "); lcd_gotoxy(pos + 1, 0); lcd_puts(" "); lcd_gotoxy(pos, 1); lcd_puts(" "); lcd_gotoxy(pos + 1, 1); lcd_puts(" "); } void seperateur(int pos) { lcd_gotoxy(pos, 0); lcd_putc(3); lcd_gotoxy(pos + 1, 0); lcd_putc(4); lcd_gotoxy(pos, 1); lcd_putc(3); lcd_gotoxy(pos + 1, 1); lcd_putc(4); } void zero(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void un(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 0); lcd_puts(" "); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)0); } void deux(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)5); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)0); } void trois(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)5); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void quatre(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos, 1); lcd_puts(" "); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 1, 1); lcd_puts(" "); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void cinq(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)5); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void six(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)5); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void sept(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos, 1); lcd_puts(" "); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)1); lcd_gotoxy(pos + 1, 1); lcd_puts(" "); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void huit(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)5); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void neuf(int pos) { lcd_gotoxy(pos, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 1, 0); lcd_putc((uint8_t)5); lcd_gotoxy(pos + 1, 1); lcd_putc((uint8_t)0); lcd_gotoxy(pos + 2, 0); lcd_putc((uint8_t)2); lcd_gotoxy(pos + 2, 1); lcd_putc((uint8_t)2); } void lcd_affi_Gros_Chiffre(int x, int pos) { switch (x) { case 0 : zero(pos); break; case 1 : un(pos); break; case 2 : deux(pos); break; case 3 : trois(pos); break; case 4 : quatre(pos); break; case 5 : cinq(pos); break; case 6 : six(pos); break; case 7 : sept(pos); break; case 8 : huit(pos); break; case 9 : neuf(pos); break; } } void lcd_efface_Gros_Chiffre(int pos) { lcd_gotoxy(pos, 0); lcd_puts(" "); lcd_gotoxy(pos, 1); lcd_puts(" "); lcd_gotoxy(pos + 1, 0); lcd_puts(" "); lcd_gotoxy(pos + 1, 1); lcd_puts(" "); lcd_gotoxy(pos + 2, 0); lcd_puts(" "); lcd_gotoxy(pos + 2, 1); lcd_puts(" "); }
|
5 Le circuit imprimé
Ce circuit imprimé conçu pour se plaquer sous l'afficheur LCD ce qui facilite l’insertion dans un petit boîtier.
|
|
|
6 Flashage et gravage du circuit :
|
|
13 avr 2016:
...cinq mois que j'avais mis cette réalisation de côté pour cause de choses plus urgentes à faire. Mais comme j'aime bien finir ce que j'ai commencé, voici la suite...
J'ai flashé le circuit avec ma machine laser décrite ICI .
Tout fonctionne correctement, après une petite correction ( le footprint que j'avais créé pour le module NNEO-6M (ou 7M) avait les pins TX et RX permutés. J'ai corrigé le footprint et le dessin kicad visible au #5, mais le circuit imprimé était déjà réalisé. Donc cela explique la petite différence entre le dessin et le circuit gravé au niveau des piste du haut).
|
7 L'horloge dans son boîtier
|
|
Le bouton poussoir fait basculer entre les deux modes d'affichage.
|
8 Second mode d'affichage :
|
|
|
9 Coup d'oeil dans la boite :
|
|
L'alimentation 5V dc est constituée par un petit "adaptateur 5V - 0.5A" qui se branche directement sur la prise secteur 230V.
|
10 Vue par la tranche
|
Il se trouve que l'écartement des trous de fixation du module GPS NEO-6M est exactement le même que celui des trous latéraux de l'afficheur LCD. Ce qui permet de fixer l'un à l'autre très simplement par deux vis + entretoises.
|
|
|