Haga un reloj Arduino preciso usando solo un cable - ¡NO se necesita hardware externo!

Haga un reloj Arduino preciso usando solo un cable - ¡NO se necesita hardware externo!

Tabla de contenido:

Anonim

Cómo hacer un reloj Arduino - sin usar osciladores externos o chips de reloj:

(más de mis proyectos en nuestro sitio web de investigación - haga clic en el logotipo de arduino en la parte superior de la página de inicio)

Necesitará:

Una placa Arduino (casi cualquier sabor funcionará bien) y software

1 LED

1 cable de puente

(Ejemplo de cableado actualizado a continuación …)

Soy un ingeniero eléctrico de más de 20 años y acabo de descubrir la plataforma Arduino hace unos meses. No hace falta decir que me enamoré de él y ahora estoy enganchado a proyectos. Para la Navidad de este año, quería hacer algunos regalos muy sinceros y únicos para mis padres. Para mi madre, definitivamente fue un diseño de 'reloj de uno'. No me preocupaba mantener el horario de verano o los años bisiestos, simplemente guardar el día de la semana y la hora con precisión.

¿Cómo generar los pulsos de reloj de una manera única pero precisa? Claro que podría usar un elegante reloj integrado o el oscilador de cristal común de 32.768, pero quería algo diferente al resto. Comencé a usar un temporizador 555 para generar una onda cuadrada constante de 100 Hz. Esto funcionó bastante bien, pero estaba perdiendo alrededor de 1 segundo por hora. No hay problema, acabo de escribir un algoritmo para corregir el segundo faltante en el software. Yo era feliz. Luego descubrí que aunque el temporizador interno del Arduino no era totalmente confiable para el mantenimiento del tiempo, las salidas analógicas PWM tenían una onda cuadrada muy estable de 490Hz. El ciclo de trabajo está determinado por el valor escrito en el pin analógico. (es decir, 0 es cero voltios, 127 es un ciclo de trabajo del 50%, 255 es una lógica alta / 5 V).

Decidí probar la salida analógica PWM conectada directamente al pin 2 de interrupción y ¡funcionó muy bien! Además, se mantuvo a la perfección con el reloj en tiempo real de mi computadora hasta el segundo sin necesidad de compensación de software. Lo he estado ejecutando durante días y sigue funcionando tal como lo esperaba … todo con un cable y algo de código.

El regalo final tendrá PCB de Eagle CAD personalizados para la fuente de alimentación y la lógica, alojados en una caja de plexiglás. Todo el tema es la iluminación LED azul hielo para simular un reloj analógico. Si bien el gabinete tiene una pantalla LCD blanca sobre azul que muestra el día, la hora y la temperatura de la habitación, un cable en serie se conecta desde la caja del proyecto al reloj real. Utilizando un contador de décadas de 12 bits, un servo y muchos LED azules, estoy encendiendo los segmentos de hora apropiados en una cara de reloj analógico diseñada a medida impresa en plexiglás. El servo está montado en el centro de la esfera del reloj y tiene una armadura unida con un LED montado para iluminar los minutos detrás del cristal. (Cada minuto el servo gira 6 grados, iluminando el minuto apropiado). Espero tenerlo terminado pronto y hacer un video del producto final … ¡Espero que a ella le guste!

Simple diagrama de cableado Arduino y código de demostración para hacer su propio reloj con este método. También un enlace a Circuit Lab que muestra cómo usar el método 555 timer @ 100Hz si así lo desea.

Código y enlaces a continuación …

555 Circuito del oscilador del temporizador (si desea probar este método)

www.circuitlab.com/circuit/b575r9/555-100hz-oscillator/

Código de demostración del reloj:

/ * Demostración de reloj interno simple: por Joseph Unik, también conocido como Relic1974

Utiliza una salida PWM analógica de 490Hz con un ciclo de trabajo del 50% para

mantener el tiempo muy preciso;). Conecte un LED al pin 13 a

Mira los segundos parpadear. Conecte un puente desde el pin analógico 0

a Digital Pin 2 (interrupción 0). Minutos de salida a serie

monitor. http://www.planetxresearch.com 'Arduino' logo

Para más proyectos y trucos …

(Siéntase libre de usar este código para expandirse a un

reloj u otro proyecto bajo Creative Commons;)

*/

int clockInt = 0; // pin 2 digital es ahora interrupción 0

int masterClock = 0; // cuenta las señales de reloj de borde ascendente

int segundos = 0; // variable

int minutos = 0; // variable

int ledPin = 13;

configuración del vacío ()

{

attachInterrupt (clockInt, clockCounter, RISING);

// clockInt es nuestra interrupción, se llama a la función clockCounter cuando

// invocado en un borde de reloj RISING

referencia analógica (DEFAULT);

pinMode (ledPin, SALIDA);

Serial.begin (57600);

analogwrite (0, 127); // esto inicia nuestro 'reloj' PWM con un ciclo de trabajo del 50%

}

void clockCounter () // llamado por interrupción

{

masterClock ++; // con cada aumento de reloj agregue 1 al conteo de masterclock

if (masterClock == 489) // 490Hz alcanzado

{

segundos ++; // después de un ciclo de 490Hz agregue 1 segundo;)

masterClock = 0; // Restablecer después de 1 segundo

tono (13, 100, 500); // usando tono para pulsar el LED sin demora de llamada;)

}

regreso;

}

bucle de vacío ()

{

if (segundos == 60) // AHORA EN GUARDAR EN TIEMPO REAL

{

minutos ++; // incrementa los minutos en 1

segundos = 0; // restablecer la variable segundos

Serial.print ("Minutos =");

Serial.println (minutos);

}

}

Demostración de mi proyecto en las obras aquí.

Suministros: