Práctica 4: Sistema de Monitorización de tiempo mediante...

7
AUTOMATIZACIÓN - CURSO: 2010-2011- Práctica 4: Sistema de Monitorización de tiempo mediante Arduino Objetivos Conocer un circuito integrado RTC (Real-Time Clock). Conocer el funcionamiento del bus I 2 C para la conexión de sensores a microcontroladores. Conocer cómo utilizar una pantalla LED con Arduino. Desarrollar un programa en Arduino para gestionar el tiempo y generar eventos. Realización de la práctica Conexión de una pantalla LED a Arduino Una forma de mostrar información procedente de un microcontrolador es mediante la utilización de una pantalla LED. En esta práctica se utilizará una pantalla LED DisplayTech162C con interfaz paralela, que se muestra en la siguiente figura: Identifica los pines de la pantalla consultando su hoja de especificaciones. Conecta los distintos pines de la pantalla a la placa Arduino como se indica en la siguiente figura: Juan Antonio Corrales Ramón Carlos Alberto Jara Bravo Fernando Torres Medina Grupo de Innovación Educativa en Automática Departamento de Física, Ingeniería de Sistemas y Teoría de la Señal Universidad de Alicante

Transcript of Práctica 4: Sistema de Monitorización de tiempo mediante...

Page 1: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

AUTOMATIZACIÓN - CURSO: 2010-2011-

Práctica 4: Sistema de Monitorización de tiempo

mediante Arduino Objetivos

• Conocer un circuito integrado RTC (Real-Time Clock). • Conocer el funcionamiento del bus I2C para la conexión de sensores a

microcontroladores. • Conocer cómo utilizar una pantalla LED con Arduino. • Desarrollar un programa en Arduino para gestionar el tiempo y generar

eventos. Realización de la práctica Conexión de una pantalla LED a Arduino Una forma de mostrar información procedente de un microcontrolador es mediante la utilización de una pantalla LED. En esta práctica se utilizará una pantalla LED DisplayTech162C con interfaz paralela, que se muestra en la siguiente figura:

Identifica los pines de la pantalla consultando su hoja de especificaciones. Conecta los distintos pines de la pantalla a la placa Arduino como se indica en la siguiente figura:

Juan Antonio Corrales Ramón

Carlos Alberto Jara Bravo

Fernando Torres Medina

Grupo de Innovación Educativa en Automática

Departamento de Física, Ingeniería de Sistemas y Teoría de la Señal Universidad de Alicante

Page 2: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

Ten en cuenta que es necesario añadir un potenciómetro al pin V0 para regular el contraste de la pantalla. Las dos patillas exteriores del potenciómetro irán conectadas a 5V y 0V respectivamente, mientras que la patilla central irá conectada al pin V0. En la siguiente figura se muestra una fotografía de un potenciómetro.

Después de conectar el potenciómetro, se deberá encender el Arduino para regular el contraste de la pantalla. Gira el potenciómetro hasta que se comiencen a ver unos cuadrados oscuros en la pantalla. La visualización de estos cuadrados identifica la correcta configuración del contraste. A continuación, es necesario programar la pantalla para visualizar caracteres en ella. Para ello, es necesario enviar los valores correctos de voltaje (HIGH o LOW) a los pines RS, E, DB4, DB5, DB6 y DB7, siguiendo las especificaciones de la pantalla. Para simplificar esta operación, utilizaremos la librería LiquidCrystal, que viene incluida en la distribución Arduino. Abre el ejemplo HelloWorld de la librería y comprueba su funcionamiento. Analiza la funcionalidad de las funciones lcd.setCursor() y lcd.print(). El Circuito Integrado RTC DS1307 y su Conexión a Arduino Un chip RTC (Real-Time Clock) es un circuito integrado que implementa las funciones de un reloj en tiempo real, manteniendo tanto el tiempo (horas, minutos y segundos) como la fecha (día, mes y año) actuales. Las principales ventajas de este chip son: la larga duración de su batería (hasta 10 años) y la gestión automática del número de días de los meses, teniendo en cuenta los años bisiestos. Además, el modelo DS1307 que usaremos en prácticas tiene un pin de salida SQW/OUT con una señal cuadrada de 1 Hz (donde se podría conectar un LED como indicador de segundos) y una memoria RAM de propósito general de 56 bytes. En la siguiente figura se muestra una fotografía del chip RTC DS1307:

Identifica los distintos pines del circuito integrado en la hoja de especificaciones del componente.

Page 3: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

Conecta el chip al Arduino siguiendo el siguiente esquema.

Ten en cuenta que los pines SDA y SCL deberán ir conectados al Arduino mediante sendas resistencias de pull-up (cualquier valor entre 1K y 10K). A los pines X1 y X2 deberemos conectar un cristal de cuarzo de 32,768kHz, como el que se muestra en la siguiente figura:

La Comunicación I2C y su Programación en Arduino El reloj DS1307 se comunica con el Arduino a través del bus I2C. El bus I2C es un tipo de bus serie que permite la interconexión de dispositivos mediante dos únicas líneas, una de datos (SDA, serial Data) y otra de reloj (SCL, serial Clock). La principal ventaja de este bus es el ahorro de cables y de conexiones en comparación con una conexión paralela (como, por ejemplo, la conexión de la pantalla LED que vimos en el apartado anterior). A un mismo bus I2C pueden haber conectados múltiples dispositivos. Estos se identificarán por una dirección única (0x68 en el caso del RTC DS1307) y actuarán en el bus como maestros (Master) o como esclavos (Slave). El maestro es el dispositivo que inicia la transferencia en el bus y el que genera la señal de reloj SCL. El esclavo es el dispositivo direccionado que recibirá la orden del maestro y responderá en consecuencia. En nuestro caso, la placa Arduino actuará como maestro mientras que el reloj DS1307 actuará como esclavo. La secuencia de transmisión en un bus I2C es la siguiente:

1. El maestro comienza a transmitir mandando un bit de START (condición de START), seguido de la dirección de 7 bits del esclavo con el que desea comunicarse y seguido finalmente de un único bit R/W que representa si desea escribir (0) o leer (1) del esclavo.

Page 4: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

2. El esclavo envía un bit de ACK para indicar al maestro que existe un dispositivo conectado al bus con la dirección solicitada.

3. El maestro comienza entonces a transmitir información al esclavo o a recibir información de él dependiendo del modo R/W indicado en el paso 1. El esclavo funcionará en el modo complementario (es decir, modo recepción o modo transmisión, respectivamente). En el caso de que el maestro sea transmisor, éste enviará byte a byte mientras que el esclavo responderá con un bit ACK. En el caso de que el maestro sea receptor, el esclavo enviará byte a byte mientras que el maestro responderá con un bit ACK.

4. El maestro terminará la conexión con un bit de STOP (condición de STOP) o volverá enviar otro bit de START para realizar otra transferencia.

En la siguiente figura se muestra la secuencia de bits/bytes enviados a través del bus I2C cuando el maestro está en modo de transmisión y el esclavo en modo de recepción.

En la siguiente figura se muestra la secuencia de bits/bytes enviados a través del bus I2C cuando el maestro está en modo de recepción y el esclavo en modo de transmisión.

Este protocolo de comunicación es implementado en Arduino en la librería Wire. Esta librería utiliza las siguientes funciones para implementar dicho protocolo:

• Wire.begin(): Inicializa la librería Wire. Se coloca en la función setup(). • Wire.beginTransmission(address): Comienza una transmisión al

dispositivo esclavo cuya dirección es pasada como parámetro. Esta función enviará el bit START, la dirección del dispositivo esclavo y el bit R/W para escritura.

• Wire.send(byte): Prepara los bytes de datos que enviará el maestro al dispositivo esclavo.

• Wire.endTransmission(): Envía al esclavo los bytes que fueron preparados con la función send() y finaliza la transmisión con la condición de STOP.

• Wire.requestFrom(address,num_bytes): Inicia una recepción del dispositivo esclavo cuya dirección es pasada como parámatro. Esta función enviará el bit START y la dirección del dispostivo esclavo junto

Page 5: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

con el bit R/W para lectura. El maestro esperará recibir del esclavo el número de bytes especificado como segundo parámetro. Cuando se reciba dicho número de bytes, el maestro automáticamente cerrará la conexión con el bit STOP.

• byte b= Wire.receive(): Recupera un byte b que fue transmitido desde el esclavo al maestro después de la llamada requestFrom.

Lectura y Visualización de la Hora de Chip RTC con Arduino (Parte I) En esta primera parte de la práctica, se deberá desarrollar un programa en Arduino que acceda a la información de hora del reloj DS1307 y la muestre por la pantalla LCD. Para ello, en primer lugar se deberá consultar las especificaciones del reloj DS1307. En particular, se deberá comprender cómo organiza la información de tiempo en sus registros internos (página 8 del datasheet), analizando el siguiente diagrama:

A continuación, se deberá analizar qué información tiene que enviar a través de I2C la placa Arduino (que actuará como maestro) al reloj (que actuará como esclavo). En particular, se debe analizar el protocolo de comunicación entre ambos que se describe en la página 12 del datasheet. Serán necesario los dos modos de comunicación que implementa el reloj: modo de escritura (el esclavo es receptor de información y el maestro es el transmisor) y modo de lectura (el esclavo es el transmisor de información y el maestro es el receptor). A partir de la información anterior, se deberán implementar en Arduino las siguientes dos funciones para gestionar el reloj:

• void setDateDs1307(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year): Esta función utilizará el modo de escritura I2C del reloj para establecer la hora inicial del chip. Esta función deberá seguir los siguientes pasos:

1. Iniciar la transmisión desde el maestro con la función Wire.beginTransmission(addr).

2. Enviar como primer byte el puntero del registro interno del reloj donde se empezará a escribir (registro 0 en este caso). Se utilizará la función Wire.send(byte).

Page 6: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

3. Enviar byte a byte los 7 parámetros pasados a la función setDateDs1307. Los bytes de segundos y minutos estarán comprendido en el rango 0-59, el byte de horas estará comprendido en el rango 0-23. El byte del día de la semana estará comprendido entre 1-7, el byte del día del mes estará comprendido entre 1-31, el byte del mes estará comprendido entre 1-12 y el byte del año estará comprendido entre 0-99.

4. Cerrar la transmisión I2C con la función Wire.endTransmission().

• void getDateDs1307(byte *second, byte *hour, byte *dayOfWeek, byte *dayofMonth, byte *month, byte *year): Esta función utilizará el modo de lectura I2C del reloj para que el maestro lea la hora/fecha que tiene almacenada el reloj. Se ejecutará en la función loop() antes de mostrar los datos. Esta función deberá seguir los siguientes pasos:

1. El maestro deberá indicar al esclavo cuál es el puntero del registro sobre el que se va a empezar a leer datos. Para ello, deberá abrir una transmisión como en la función anterior, enviar un único byte con el puntero del registro y cerrar la transmisión. En este caso, el primer registro del que se empezará a leer será el 0 (registro interno de segundos).

2. El maestro deberá solicitar al reloj la lectura de 7 bytes mediante la función Wire.requestFrom(addr,num_bytes).

3. El maestro utilizará la función Wire.receive() para leer byte a byte los datos del reloj. Se debe tener en cuenta que en el caso del byte de segundos se deberá aplicar una máscara de bits para descartar el bit 7 (bit CH, que se encarga de activar o desactivar el cristal oscilador). En el caso del byte de las horas se deberán descartar los bits 7 y 6 y considerar que el formato de las horas es de 24H.

Todos los datos que se envíen y reciban del reloj deberán estar en formato binario BCD. Se podrán utilizar las siguientes funciones para su transformación: // Convierte numeros normales decimales a BCD (binario decimal

codificado)

byte decToBcd(byte val)

{

return ( (val/10*16) + (val%10) );

}

// Convierte BCD (binario decimal codificado) a numeros normales

decimales

byte bcdToDec(byte val)

{

return ( (val/16*10) + (val%16) );

}

La función setup() deberá invocar a la función setDateDs1307() para establecer el valor inicial de la hora/fecha del reloj. La función loop() deberá invocar a la función getDateDs1307() para leer en tiempo real la hora/fecha actuales y utilizará funciones de la librería LiquidCrystal para mostrar dichos datos en la pantalla LCD. Como recomendación, se podría mostrar en la primera fila de la pantalla la hora con el formato: HH:MM:SS. No es necesario mostrar la información de fecha.

Page 7: Práctica 4: Sistema de Monitorización de tiempo mediante ...rua.ua.es/dspace/bitstream/10045/19253/1/practica4.pdf · Conecta el chip al Arduino siguiendo el siguiente esquema.

Gestión de una Alarma en Arduino para el Reloj (Parte II) Se deberá añadir al código Arduino desarrollado en la práctica anterior la gestión de una alarma. El alumno definirá una alarma en un determinado instante HH:MM. El programa Arduino deberá mostrar la hora actual (tal como hacía en la parte I de la práctica) pero también deberá verificar si la hora actual se corresponde con la hora de la alarma. En el caso de que se corresponda, se deberá activar un zumbador piezoeléctrico que estará conectado a una salida digital del Arduino. En la siguiente figura se muestra un ejemplo de este zumbador.

Esta alarma se deberá apagar automáticamente cuando la hora del sistema ya no se corresponda con la hora de la alarma (es decir, 1 minuto después de su activación). Además, se deberá añadir un pulsador en una entrada digital del Arduino para desactivar la alarma. De este modo, si el usuario del reloj desea desactivar la alarma antes del minuto de duración, deberá pulsar dicho pulsador. Es recomendable utilizar la librería Bounce para evitar los rebotes del pulsador. Como parte opcional, el alumno podrá añadir un segundo pulsador que permita al usuario cambiar la hora de la alarma, mostrando dicho cambio en la pantalla LCD. Este segundo pulsador podría ser utilizado para iniciar el modo de cambio de alarma (pasando de “cambio de hora de alarma” a “cambio de minutos de alarma” cada vez que se pulse). El primer pulsador podrá ser utilizado para ir incrementando las horas o los minutos de la alarma (dependiendo de si se está en el modo de “cambio de minutos de alarma” o en el modo “cambio de horas de alarma”). Si se implementa esta funcionalidad, será necesario utilizar la librería Bounce para eliminar los rebotes del pulsador y detectar correctamente los flancos (cambios de voltaje) en las entradas digitales correspondientes del Arduino.