El DS1307  de Maxim/Dallas es un circuito integrado capaz de almacenar y llevar la cuenta de la fecha y hora, además disponemos de unos cuantos bytes de datos de usuario en su memoria RAM no volátil (NVRAM). El arduino posee un CPU bastante poderoso, y sin embargo aún así es incapaz de mantener la hora correctamente a largo plazo, debido a los microsegundos que se atrasan (o adelantan) al dividir la frecuencia del reloj principal para dar con el segundo exacto. En esta entrada, exploraremos las ventajas y operaciones básicas del circuito  DS1307 instalado en el módulo TinyRTC y explicaremos su funcionamiento en conjunto con una placa arduino para aquellas aplicaciones que requieren un control preciso del tiempo.

El módulo TinyRTC, además de todo el circuito de soporte del DS1307 (incluida su batería), incluye también una memoria EEPROM para almacenar datos en ella y un zócalo para soldar de manera opcional un sensor de temperatura DS18B20,  sin embargo en esta ocasión trataremos únicamente el uso del DS1307, el uso de la memoria EEPROM y el sensor quedarán de tarea para el lector.

Conceptos básicos.

Para entender como funciona el circuito DS1307 y el programa que corre en la tarjeta Arduino debemos conocer algunos conceptos clave:

  • RTC o Reloj en Tiempo Real – Es un circuito electrónico especializado cuya función es mantener la hora y fecha actual en un sistema informático (ya sea con microcontrolador u otro tipo de CPU). Se caracteríza por tener un bajo consumo de energía y también normalmente su propia fuente de alimentación auxiliar. Normalmente al recurrir a este tipo de circuitos integrados obtenemos una mejor precisión del tiempo. Un ejemplo de dispositivos que incluyen relojes en tiempo real son las computadoras personales (PC).
  • Bus I2C o TWI – Es el protocolo de comunicación físico mediante el cual se comunican el Arduino y el módulo RTC DS1307. El bus cuenta con dos lineas: de datos y de reloj, ambas del tipo colector abierto (o drenador abierto). Por lo que se requieren resistencias pull-up (Rpu en el esquemático) para generar un estado lógico alto. La figura siguiente muestra una conexión básica del DS1307 con un microcontrolador a través del bus I2C.ds1307_conexion_con_microcontrolador
  • Decimal codificado en binario – Es un estándar de datos en el cual los dígitos decimales se representan mediante secuencias de 4 bits. Esto es así por que con 4 bits se pueden representar todos los dígitos decimales del 0 al 9. En un byte en memoria se pueden almacenar números decimales del 0 al 99. En el DS1307 los datos de fecha y hora están codificados en BCD y veremos más adelante la forma de convertir de BCD a binario. A continuación se muestran los dígitos decimales y sus equivalentes en BCD.equivalencia_BCD

Funcionamiento interno y registros del DS1307

  • El DS1307 requiere un cristal de 32.768 Khz, este valor viene dado por el hecho de que 2^15 = 32,768. Esto quiere decir que la frecuencia es divisible binariamente para generar un segundo exacto. El cristal ya se incluye si compramos algún módulo con el DS1307.
  • El DS1307 requiere dos fuentes de alimentación: Por una parte, requiere alimentación de 5 volts que opera mientras el circuito esta encendido y funcionando y otra fuente de poder que proviene de una batería de litio (tipo reloj) que mantiene funcionando el reloj/calendario mientras la alimentación principal NO esta disponible. El cambio entre ambas fuentes de alimentación es gestionado por el DS1307 de manera automática.
  • Disponemos de un pin de salida que puede ser configurado para que el RTC entregue una onda cuadrada con una frecuencia configurable, las frecuencias disponibles se muestran en la siguiente tabla y se configuran mediante los bits RS1, RS0 y SQWE de registro de control, si se usa este pin hay que agregar una resistencia pull-up, ya que es del tipo “Open drain”:ds1307_squarewave_output
  • Los registros del DS1307 almacenan la fecha y la hora en formato BCD. La dirección de cada registro y la información almacenada en cada uno se muestra en la siguiente tabla:ds1307_mapa_de_registros
  • El funcionaliento del chip se controla mediante el bit 7 del registro del segundero (0x00) y el registro de control (0x07): El bit CH del segundero detiene el reloj cuando esta en alto (así se entregan los módulos de fábrica) y en este modo NO se lleva el conteo de tiempo por que el oscilador esta detenido. ES MUY IMPORTANTE PONER A 0 ESTE BIT PARA QUE EL RTC FUNCIONE. El registro de control maneja la funcionalidad del pin de salida de onda cuadrada.ds1307_registro_de_control
  • A partir de la dirección 0x08 disponemos de memoria RAM no volátil (NVRAM) cuyo contenido no se borra con la pérdida de energía, este segmento de memoria funciona de manera similar a una memoria EEPROM.

Materiales necesarios.

Para las prácticas vamos a requerir el siguiente material, que pueden encontrar en nuestra tienda virtual:

Conexión del TinyRTC al Arduino

El módulo TinyRTC requiere las siguientes conexiones con la tarjeta Arduino. Nótese que el pin “DS” del módulo TinyRTC no se utiliza, corresponde al sensor de temperatura 1-wire que no se encuentra instalado de fábrica. Solamente son indispensables las lineas SDA, SCL y la alimentación de 5 volts:

ds1307 con arduino. Tinyrtc diagrama de conexion

Para montar el circuito de prueba, podemos auxiliarnos de un protoboard, de manera opcional. También es válido usar solamente cables.El circuito armado nos quedó de la siguiente forma:

tutorial_ds1307_con_arduino_01

Ejemplo de lectura DS1307 sin librería

Con la información que tenemos hasta ahora, ya podemos darnos una idea de como estructurar el sketch para leer y escribir el RTC DS1307. Utilizaremos la librería “Wire.h” que se incluye instalada de serie con el ambiente arduino para manejar la comunicación I2C entre el DS1307 y el Arduino. Presentamos dos “sketches” o programas. En el primero realizaremos la escritura o puesta a tiempo del módulo RTC y en el segundo, realizaremos la lectura y muestra de la información de fecha y hora que ya hemos almacenado. En estos ejemplos NO estamos utilizando ninguna librería específica para el DS1307, solamente utilizamos la librería “Wire.h” de arduino para hablar con dispositivos a través del bus I2C.

¿Como poner a tiempo el DS1307?

El siguiente código permite escribir una fecha arbitraria en el RTC y ponerlo a funcionar. Hay que configurar una fecha y hora válidos (actual) dentro de la función setup, donde se inicializan los valores de variables que contienen información horaria. Hay que aclarar que se trata de un ejemplo minimalista que será fácil de entender para los principiantes.

El resultado de ejecutar el sketch anterior en el DS1307 debe ser como el siguiente:

poner_a_tiempo_ds1307_con_arduinoEste programa no genera salida adicional a la terminal serial, ya que solamente pone a tiempo el reloj. Una vez puesto a tiempo ya  podemos usar la información almacenada con nuestro siguiente sketch o para la aplicación que estamos desarrollando. Recomendamos ejecutar este sketch solamente una vez, ya que siempre que se resetea o conecta la tarjeta este reestablecerá la misma fecha y hora programadas, es necesario cargar el sketch de lectura de inmediato y evitar reiniciar la tarjeta con este sketch cargado.

¿Como leer la fecha y hora del DS1307?

El siguiente sketch lee la información de fecha y hora del DS1307 y la muestra en la terminal (monitor serial).

El resultado de este programa es  el siguiente, deberemos ver la fecha y la hora en el monitor serial, esta debe conservarse aunque desconectemos el cable USB o la alimentación principal del Arduino.

leer_tiempo_ds1307_con_arduino

Librería de Arduino para el DS1307

Nuestra librería para el DS1307 encapsula el código anterior en una clase que podemos llamar para obtener la fecha y hora o poner a tiempo el reloj. Esta clase esta basada en algunas otras librerías que se encuentran en internet para manejar este integrado, pero la hemos modificado para funcionar de manera correcta con las librerías que estamos desarrollando de manera interna en geekfactory. Hemos agregado métodos para poder leer/escribir en la memoria NVRAM del DS1307. El siguiuente ejemplo muestra como realizar la lectura de facha y hora desde el DS1307. En la carpeta de ejemplos de la librería podemos encontrar también el ejemplo para poner a tiempo el reloj, con la fecha y hora de compilación.

El resultado de ejecutar el ejemplo anterior debe ser similar al siguiente:

monitor_serial_ds1307_01

La libreía para el DS1307 que utilizamos y el ejemplo anterior pueden encontrarse en nuestro repositiorio de github. También podemos descargarla directamente en la sección de descargas. Para que esta librería funcione correctamente, requerimos otra librería (dependencia) llamada “TimeLib”. Se puede encontrar el enlace a ambas liberías a continuación:

  • Librería RTCLib – Esta librería permite leer y escribir el reloj DS1307 y manipular la fecha y hora almacenada
  • Librería TimeLib – Esta librería permite realizar operaciones de fecha y hora en formato Unix en la plataforma arduino y otros microcontroladores.github_logo

Conclusión

En este tutorial aprendimos como manipular los registros del DS1307 para ponerlo a tiempo y para realizar la lectura de la fecha y hora. Aprendimos que es posible accesar al DS1307 mediante librerías especializadas o de forma manual mediante la librería “wire.h” sin necesidad de instalar ninguna otra librería. La forma final en la que el usuario accede a los datos del RTC depende de sus preferencias y del proyecto en el que se trabaja. El DS1307 es un ejemplo muy bueno de como podernos comunicarnos con cualquier dispositivo usando el bus I2C, por lo que siempre podemos utilizar este código como base para cualquier dispositivo que  posee interfaz I2C.

 

Si requiere factura de su producto el pago se tiene que realizar a nuestra cuenta en Santander.