viernes, 25 de octubre de 2024

Base de tiempo - 1 Segundo con Arduino ATMEGA328

  Página principal

Base de tiempo
1 Segundo
Arduino ATMEGA328

Después de haber realizado el Generador de DCF77 con el Arduino, me dí cuenta que algunos relojes no sincronizaba bien.
El caso es que debía tener una base de tiempos muy precisa, y con la función de delay
() no servía.
Pensando y mirando montajes anteriores míos, encontré entre mis montajes uno que utilizaba interrupciones internas mediante contadores.

Para este montaje se utilizan los contadores de 16bits, en modo CTC

19.9.2 -Modo de borrado del temporizador en comparación (CTC)
En los modos de borrado del temporizador en comparación (CTC) (modo 4 o 12, WGMn[3:0]=0x4 o 0xC), los registros OCRnA o ICRn se utilizan para manipular la resolución del contador: el contador se pone a CERO cuando el valor del contador (TCNTn) coincide con el OCRnA (si WGMn[3:0]=0x4) o el ICRn (WGMn[3:0]=0xC). El OCRnA o el ICRn definen el valor superior del contador, por lo tanto también su resolución. Este modo permite un mayor control de la frecuencia de salida de comparación. Simplifica la operación de conteo de eventos externos.
El valor del contador (TCNTn) aumenta hasta que se produce una comparación con OCRnA o ICRn, y luego se borra el TCNTn.


ISR(TIMER1_COMPA_vect)
{
  if(playRun==true)  rutina100();   
}


setup()
{
.............
.............
  // Interrupciones cada 0,1 Segundos
    cli();
    TCCR1A=0;
    TCCR1B=0;   
#if MODO_SEG == 0   // 0=999.762.128 nS 1=999.762.876
      OCR1A=1562; 
      TCCR1B |= (1<<WGM12);   //  0 1 0 0 CTC OCR1A Immediate MAX
      TCCR1B |= (1<<CS10);    // clk I/O /1024 (From prescaler)
      TCCR1B |= (1<<CS12);
#endif
#if MODO_SEG == 1   // 1=1.000.081.262 nS  0=1.000.0828
      OCR1A=6253;   //6252 DIV-256
      TCCR1B |= (1<<WGM12);   //  0 1 0 0 CTC OCR1A Immediate MAX
      TCCR1B |= (1<<CS12); // clk I/O /256 (From prescaler)
#endif  
#if MODO_SEG == 2   // DIV-64
      OCR1A=25031;
                      // 25020    1.000.282.772 nS
                      // 25015    1.000.082.800 nS
                      // 25013 DIV-64   1.000.003.00 nS
                      // 25013 DEDO     1.000.241.871
                      //       DEDO     1.000.121.011
                      // 25013 otro reloj 999.289.372 nS
                      // 25032 otro reloj 1.000.052.634 nS
                      // 25031 otro reloj 1.000.012.119 nS
      TCCR1B |= (1<<WGM12);   //  0 1 0 0 CTC OCR1A Immediate MAX
      TCCR1B |= (1<<CS10); // clk I/O /64 (From prescaler)
      TCCR1B |= (1<<CS11);
#endif
  TIMSK1=(1<<OCIE1A);     // Timer/Counter1, Output Compare A Match Interrupt Enable 
  sei(); 
}


En el código se crea un a interrupción cada 0.1 Segundos.
Con un contador hasta 10, se crea un incremento de 1 Segundo.
Al utilizar los prescaler de   /1024, /265, /64 , podemos aumentar la resolución.
La mejor resolución la conseguimos al utilizar la división 64 , o eso debería ocurrir.





DIV 1024 16000000/1024=15625/10=1562 999.762.128 nS
DIV 256 16000000/256=62500/10=6250 1.000.081.262
DIV 64 16000000/64=250000/10=25000 25020    1.000.282.772 nS
25015    1.000.082.800 nS
25013    1.000.003.000 nS
25013    1.000.241.871 ns    DEDO    
25013    1.000.121.011 ns   DEDO2    

25013    999.289.372 nS    otro reloj
25032   1.000.052.634 nS  otro reloj
25031   1.000.012.119 nS  otro reloj

Todos los tiempos de este montaje dependen de la precisión del cristal de cuarzo a 16 MHz.
Es claro que para el circuito del Arduino nano, no creo que empleen un cristal demasiado exacto.

Entre dos Arduinos nano existe una variación de 14 microsegundos.

Con el mismo módulo nano, si colocamos el dedo sobre el cristal de cuarzo, la variación llega alcanzar 118 microsegundos.
Esto puede ser debido al aumento de temperatura y a la variación de capacidad que induce el dedo.

Vamos a realizar unos cálculos sobre la variación de tiempo en un reloj después de 3 meses, en el caso de 1.000.003.000 nS.

1 Segundo ->3 microSegundos
1h -> 10800 uS
1 dia ->259200 uS   (0.259 S.)
3 meses->23 Segundos

Conclusión:
Se puede y no se puede utilizar el ATMEGA328 como base de tiempos de un reloj.
Lo primero que debemos hacer es ajustar el temporizador para cada circuito nano, y obtener la la mejor precisión, o tener un cristal de 16MHz muy preciso.
También tenemos que tener cuidado la temperatura del entorno del Arduino nano.
Para las medidas he utilizado un analizador de señal Saleae Logic , y no estoy seguro de su precisión, creo que es alta.

Programa Arduino

Espero que os haya gustado este pequeño análisis.

Saludos.
Juan Galaz





jueves, 24 de octubre de 2024

DCF77 - Generador de señal - Signal generator - Versión 2 - DS1302

  Página principal

DCF77
Generador de señal
Signal generator
Versión 2  - DS1302

Después de haber realizado el Generador de DCF77 con el arduino, me dí cuenta que algunos relojes no sincronizaba bien.
También me resultaba engorroso tener que
actualizar la hora mediante un ordenador, antes de emitir la señal DCF .
He visto que se podía mejorar el código del arduino y el circuito mediante:
-Mejorando el tiempo de interrupción de 0.1 Segundo. Me dí cuenta que ciertos relojes exigen alta precisión, de esta forma la mayoría de los relojes se sincronizan.
-Cambiando la resistencia de la señal DCF a 4K7.
-Eliminando la parte del modo del audio.
-Se coloca una variable en compilación #define SINCRO . Según el manual DCF, la señal de DCF debe sincronizarse con el flanco de bajada de la portadora. Funciona igual con sincronización que sin ella, por lo que lo dejo a gusto de cada uno.
-La resistencia R1 es de 100 ohmios, para que module al 20%, pero también funciona si se modula al 0%, para este caso debemos colocar la resistencia a 0 ohmios.
-He colocado un pulsador para las pruebas. Si durante el arranque se tiene pulsado, carga una fecha prefijada y no la carga del DS1302.  Fecha prefijada:  7:52:50   9/10/2024 .


Esquema realizado con https://easyeda.com.

Circuito montado.


Señales generadas.


La sincronización tarda entre 2 y 5 minutos. La distancia entre el circuito emisor y los radio relojes es de 80 cm.

También he creado un programa en Linux bajo consola para poner la fecha y la hora automáticamente.
./dcfSerie /dev/ttyUSB0

El programa en arduino admite una serie de ordenes:
HORA=

SEGUNDO=
MINUTO=
DIAMES=
DIASEMANA=  (Algunos relojes comprueban que sea correcto)
MES=
ANO=
PRINT
START
STOP
SAVE
LOAD

Durante el arranque del circuito, espera 15 antes de empezar a emitir señal.
En el tiempo de espera de 15 segundos, si se ejecuta el programa en consola, se actualiza la hora y la fecha en el DS1302.



Programa Arduino
Programa Linux

Espero que os haya gustado este pequeño circuito.


Saludos.
Juan Galaz



Bibliografía:


PTB-Mitteilungen_2009_Heft_3_en

http://www.brettoliver.org.uk/DCF77_Analyzer_Clock_Mk2/Arduino_DCF77_Analyzer_MK2.htm
https://ednieuw.home.xs4all.nl/Woordklok/DCF77/DCF77_Arduino.html
https://es.wikipedia.org/wiki/DCF77
https://j-rpm.com/2019/05/transmisor-experimental-dcf77/
http://www.redesmadrid.com/?page_id=4
Radio watch sync   en Google Play

domingo, 13 de octubre de 2024

DCF77 Generador de señal - Signal generator - ESP-12E ESP8266

  Página principal

DCF77
Generador de señal
Signal generator
ESP-12E   ESP8266

Después de haber realizado el Generador de DCF77 con el ESP32, he realizado el mismo circuito pero con el ESP8266, placa ESP-12E.
El ESP8266 es el hermano pequeño del ESP32, no tiene bluetooth ni doble procesador, pero para este montaje no hace falta.
Voy a utilizar el programa de 
https://github.com/SensorsIot/DCF77-Transmitter-for-ESP32  , pero con alguna modificación para que funcione con el ESP8266.

Para generar la señal de 77.5 KHz he utilizado:
analogWriteFreq(FRECUENCIA);
analogWrite(OUT_DCF, 128);
No es que sea muy fiable, he tenido que configurar al variable #define FRECUENCIA 76190  para que genere 77.5 KHz.
En ESP8266 no existe ledcAttach(ANTENNAPIN, FRECUENCIA, RESOLUCION);

Montado todo funcionaba bien, solo debía configurar mi red wifi cambiando los valores en:
// Wifi credentials
const char* ssid = "yourSSID";
const char* password = "yourPassword";

Respecto al anterior circuito he quitado el display OLED.

Esquema realizado con https://easyeda.com.


El que haya realizado montajes con estos módulos, se habrá vuelto loco con los pins.
Esta es la relación de los diferentes pins.










Antes

Después

Con la prueba que he realizado  me funcionan todos lo relojes radio-controlados.

PROGRAMA

VIDEO

------------------------------------------------


Para los que quieran colocar un OLED el diagrama es el siguiente.

PROGRAMA
He de comentar que me dio bastantes problemas, las rutinas del display  deben interferir los tiempos de la interrupción, me costó tiempo averiguarlo.
Por lo cual solo se utiliza al principio para ver la IP y el día, en cualquier otra parte del programa induce a error en los tiempos, y los relojes no se sincronizan.
Si leemos en el manual "
El ESP8266 no tiene pines I2C de hardware, pero se puede hacer mediante "bitbanging". Funciona bastante bien y el ESP8266 es lo suficientemente rápido como para igualar la velocidad del 'nivel Arduino'. ".
Este es el motivo de que no se pueda utilizar el BUS I2C en el ESP8266 en este montaje.


Espero que os haya gustado este pequeño circuito.


Saludos.
Juan Galaz



Bibliografía:


https://github.com/SensorsIot/DCF77-Transmitter-for-ESP32
PTB-Mitteilungen_2009_Heft_3_en

http://www.brettoliver.org.uk/DCF77_Analyzer_Clock_Mk2/Arduino_DCF77_Analyzer_MK2.htm
https://ednieuw.home.xs4all.nl/Woordklok/DCF77/DCF77_Arduino.html
https://es.wikipedia.org/wiki/DCF77
https://j-rpm.com/2019/05/transmisor-experimental-dcf77/
http://www.redesmadrid.com/?page_id=4
Radio watch sync   en Google Play

viernes, 11 de octubre de 2024

Antena Full-wave loop - triangulo 50 ohmios -Antenna

  Página principal

Antena
  Full-wave loop triangulo 50 ohmios
Antenna


La antena Full-wave loop (Bucle de onda completa) tiene varias formas.

Había realizado este montaje  en ANTENA_TRI
Esta antena tiene una impedancia de 100 ohmios, con lo cual si queremos utilizar un cable de 50 ohmios debemos utilizar un adaptador de impedancias.
Existen dos métodos, usar un balum de 2/1 o utilizar un cable de 75 omios  de 20 cm.
En la página:  
http://f6kft.free.fr/spip.php?article183   explican una forma de adaptar la impedancia mediante la variación de la medidas del triangulo.
Ahora pruebo esta forma de antena.






Con esta pieza hecha en PLA , podemos cambiar el ángulo de la antena .
En posición vertical la polarización es horizontal, y en posición inclinada es polarización vertical (la normal en la mayoría de los casos).




Los resultados son bastante buenos, pero no se sabe hasta que no se prueba en campo abierto, eso se hará otro día.



Saludos.

Juan Galaz



Bibliografía:

https://pa0fri.home.xs4all.nl/Ant/Quad/quadeng.htm
https://sites.google.com/site/ea7ahg/antena/tipos-de-antenas/antenas/delta-loop/construccion_de_-delta_loop
https://antjab.wordpress.com/2012/06/07/parasitic-loops-the-nabla-and-the-delta/
https://johnsonfrancis.org/techworld/what-is-a-delta-loop-antenna/
http://w5sdc.net/delta_loop_for_hf.htm
https://www.qsl.net/lu3lj/archivos/Delta%20Loop%20de%20%CE%BB%20completa.pdf
http://f6kft.free.fr/spip.php?article183



jueves, 10 de octubre de 2024

DCF77 -Generador de señal - Signal generator - LOLIN32 LITE - SSD1306 con I2C

  Página principal

DCF77
Generador de señal
Signal generator
LOLIN32 LITE  y SSD1306 con I2C

Después de haber realizado el Generador de DCF77 con el arduino, busque en internet algún montaje similar con el ESP32.
Encontré la página https://github.com/SensorsIot/DCF77-Transmitter-for-ESP32.
Intente montar el circuito y compilarlo con la última versión del compilador ESP32, me salio un error en la línea:
    ledcSetup(0, 77500, 8); // DCF77 frequency
Está instrucción ya no existía en la actual versión, por lo que mirando por aquí y por allí encontré la solución.
 ledcAttach(ANTENNAPIN, FRECUENCIA, RESOLUCION);

 delay(1);
 ledcWrite(ANTENNAPIN, 128); //configuramos el Duty Cycle al 50% del led LEDPWM1

Ahora compilaba bien, pero aún tenía un trabajo que hacer, adaptar el programa al I2C, mi SSD1303 funciona con I2C.
El problema que encontré fue que la placa LOLIN32 LITE no tenía los pin de I2C normales de la familia ESP32 , había que buscar otros.
Al final encontré la solución, modificar en la configurar Wire.begin() de la siguiente forma:
 Wire.begin(23, 19);  //Para esp32 lolin32 mini --Wire.begin(sda_pin, scl_pin)
Ahora el pin SDA es el 23, y SCL el 19.

Montado todo funcionaba bien, solo debía configurar mi red wifi cambiando los valores en:
// Wifi credentials
const char* ssid = "yourSSID";
const char* password = "yourPassword";

He simplificado el código y he añadido una opción  para que funcione con interrupciones o mediante esp_timer_get_time(); .
Esto lo hace comentando o descomentado :  #define MODO_INTERRUPCION

Para que tenga un poco de potencia la señal de 77,5 KHz he añadido
un transistor que tiene en su colector un conjunto LC que está calculado para 77,5 KHz.

El LOLIN32 lite tiene un conector para alimentar el circuito con una batería 16850.

La señal obtenida es:



Con la prueba que he realizado  me funcionan todos lo relojes radio-controlados.
Tuve algún problema un día que no sincronizaba ningún reloj, era el día del huracán. No sé el motivo.....


PROGRAMA

VIDEO

Espero que os haya gustado este pequeño circuito.


Saludos.
Juan Galaz



Bibliografía:


https://github.com/SensorsIot/DCF77-Transmitter-for-ESP32
PTB-Mitteilungen_2009_Heft_3_en

http://www.brettoliver.org.uk/DCF77_Analyzer_Clock_Mk2/Arduino_DCF77_Analyzer_MK2.htm
https://ednieuw.home.xs4all.nl/Woordklok/DCF77/DCF77_Arduino.html
https://es.wikipedia.org/wiki/DCF77
https://j-rpm.com/2019/05/transmisor-experimental-dcf77/
http://www.redesmadrid.com/?page_id=4
Radio watch sync   en Google Play

domingo, 6 de octubre de 2024

DCF77- Generador de señal - Signal generator

Página principal
DCF77
Generador de señal

Signal generator

Muchos de los relojes que se compran ahora, tienen el ajuste automático de hora.
Utilizan la señal que proporciona una emisora en Alemania en la frecuencia de 77,5 KHz, esta señal se llama DCF77  .
De acuerdo con la serie de indicativos de llamada asignada, D significa Deutschland.
La letra C fue seleccionada para identificar transmisores de onda larga.
Como tercera letra, se determinó la letra F para los transmisores de onda larga en las instalaciones de la estación transmisora ​​ Mainflingen (debido a su proximidad a Frankfurt).
Para distinguir los distintos transmisores de esta estación, a las tres letras DCF se han añadido dos cifras, en el caso del DCF77.
Los datos se mandan cada segundo, codificando como la supresión de la señal hasta un 20% durante 100mS para el 0, y de 200mS para el 1.
También se utiliza el cambio de fase, pero en este artículo no se verá.







En este montaje vamos a utilizar un arduino para generar todas las señales.
Con el temporizador del arduino se puede generar una frecuencia bastante cercana a 77,5KHz.
    (8000000/77,50)-1=102 --->77,76khz
Deberíamos tener un reloj interno y utilizar un DS1302, pero como no es el objeto de este montaje, utilizaremos un programa de ordenador para actualizar el reloj en el arduino.




Por el pin 3 generaremos la señal de 77,5 KHz, y se modulará mediante el pin 2.
La señal excitará a un transistor que tiene en su colector un conjunto LC que está calculado para 77,5 KHz.











Estas ondas son las resultantes en el pin 2 o  pin 13.


Mirando por internet, encontré Radio watch sync   en Google Play. 
El problema de esta aplicación es que te deja usarla unas cuantas veces, luego tienes que comprar la aplicación.
Esta aplicación producía un audio en el altavoz del teléfono móvil , era una señal senoidal al límite de la señal audible,   15,5 KHz.
Esta señal se modulaba con la codificación de DCF77.

Parece increíble, pero con el altavoz a unos centímetros del reloj, hacía que el reloj se sincronizase con la señal DCF77.

Monté un circuito sencillo con el arduino, que generaba 15,5 KHz, alimentando 4 transistores complementarios ,a modo de amplificador de audio.
La señal no se modulaba en amplitud, solo se activaba o se desactivaba.






El programa del arduino es el mismo para RF que para audio.
Lo único que debemos hacer es comentar (RF) o descomentar (AUDIO) ,dependiendo para que lo usemos.

PROGRAMA

Como podemos observar en el video siguiente, de 4 relojes, se sincronizaba 3, el único que no se sincronizaba era el de la marca Oregon Scientific.
Unos relojes tardan más que otros, dependiendo de cuantas veces comprueba si los datos son iguales.
Esa es una espina que tengo clavada, no tengo ni ideal el motivo, pero me he tirado mucho tiempo con este circuito.

VIDEO

El programa en arduino admite una serie de ordenes:

HORA=

SEGUNDO=
MINUTO=
DIAMES=
DIASEMANA=  (Algunos relojes comprueban que sea correcto)
MES=
ANO=
PRINT
START
STOP

PROGRAMA GAMBAS
Este programa está realizado en Gambas(VB para Linux)

Próximamente realizaré un programa que funcione en Linux y Windows.

Espero que os haya gustado este pequeño circuito.


Saludos.
Juan Galaz



Bibliografía:


PTB-Mitteilungen_2009_Heft_3_en


http://www.brettoliver.org.uk/DCF77_Analyzer_Clock_Mk2/Arduino_DCF77_Analyzer_MK2.htm

https://ednieuw.home.xs4all.nl/Woordklok/DCF77/DCF77_Arduino.html

https://es.wikipedia.org/wiki/DCF77

https://j-rpm.com/2019/05/transmisor-experimental-dcf77/

http://www.redesmadrid.com/?page_id=4

Radio watch sync   en Google Play