Reloj HH:MM:SS con RTC y display de 7 segmentos

Este es un simple reloj con display de 7 segmentos que nos mostrara las horas, los minutos y los segundos, la idea es utilizar displays de 7 segmentos de buen tamaño (al rededor de 2" de altura ya que el proyecto se implementara en un estudio de grabación y se suelen usar estos relojes de ese tamaño aproximadamente).
El sistema esta basado en un microcontrolador PIC16F883, pero podría ser cualquier otro, básicamente se elige este porque el costo es reducido y tiene una cantidad de pines que nos permitirá interconectar todo sin problemas.
El sistema funciona con oscilador externo (no es critico porque el reloj en si sera externo entonces no tenemos una necesidad precisa en el microcontrolador, por ende lo podremos poner como oscilador interno sin problemas.
El corazón de este proyecto es un RTC (Reloj en tiempo real) en base al DS1302, pero podríamos usar cualquier otro RTC, sinceramente use este porque lo tenia a mano.
Este RTC tiene 3 pines de datos, pero en realidad usaremos 2 como dato y 1 como sincronismo que es el que nos entregara un pulso cada 1s exactamente.
Este RTC cuenta con un oscilador a cristal de 32768Hz y una pila de 3V de backup para que el sistema siga en hora aunque apaguemos el circuito.
Los 6 displays están en paralelo (en cuanto a los segmentos) y controlaremos el encendido de cada uno de forma independiente con el común de cada uno.
En este caso se utilizan display cátodo común, pero podríamos usar de ánodo común, es lo mismo ya que en el firmware tenemos que invertir los bits del puerto que genera el numero nada mas.
En mi caso lo ideal es usar 3 displays dobles ya que vienen interconectados, digo de usarlos así para separarlos por HH MM SS mediante dos leds redondos quedando HH : MM : SS, pero podríamos dejarlo sin los dos puntos y el resultado sera el mismo, empleando display triples o cuádruples, también podemos hacerlo con display simples pero tendremos que cablear mas o realizar un PCB mas complejo.
El proceso de muestra en los displays es multiplexado, para ello usamos el timer0 y en el elegimos el display a activar y el dato a mostrar en ese display, es decir, activamos display 1, mostramos dato de display 1, activamos display 2 y mostramos el dato del display 2, así sucesivamente para los 6 displays de una forma muy rápida que a la visión aparecen los 6 dígitos encendidos cada uno con su valor correspondiente.
Luego definimos un vector donde pondremos los 10 valores posibles de los display del 0 al 9, y este vector sera el que llamaremos continuamente para elegir los valores a mostrar.
Luego tendremos la configuración del timer y del microcontrolador en si y por ultimo la función principal que sera la que realiza la repetición de proceso.
En esta función principal tendremos 3 etapas:
1) El if del botón en pin RC5, este botón configura los minutos del reloj, es decir, cada vez que presionemos este botón se incrementara en una unidad el minutero, si mantenemos presionado se incrementara automáticamente, por cada incremento realiza la actualización al DS1302 mediante la función rtc_set_datatime();
2) El if del botón en pin RC4, este botón configura las horas del reloj, es decir, cada vez que presionemos este botón se incrementara en una unidad las horas, si mantenemos presionado se incrementara automáticamente, por cada incremento realiza la actualización al DS1302 mediante la función rtc_set_datatime();
3) El resto del código funcionara siempre que no estén presionados los botones de hora o minuto, este ultimo bloque realiza la función rtc_get_time(); donde toma el tiempo que va contando el DS1302 y lo guarda en las tres variables de su argumento HH, MM y SS, luego estas tres variables las separaremos en unidades y decenas mediante la división por 10 y el resto de esa división, por ultimo tomaremos las 6 variables correspondientes a cada dígito y la enviaremos a la función timer0_mux() para que se actualice en los displays.
La función rtc_get_time() como se puede ver se ejecutara casi a tiempo de proceso del microcontrolador pero no cambiara su valor hasta que el DS1302 lo decida, es decir el segundero se actualizara cada un segundo por mas que llamemos a la función rtc_get_time() cada 1us, por ello no es necesario usar un cristal externo en el microcontrolador y podremos utilizar el interno del mismo.


  1. #include <16F883.h>
  2. #FUSES NOWDT
  3. #FUSES XT
  4. #FUSES MCLR
  5. #use delay(clock=4000000)
  6. #define RTC_RST    PIN_C0
  7. #define RTC_SCLK   PIN_C1
  8. #define RTC_IO     PIN_C2
  9. #include <DS1302.C>
  10. #int_timer0
  11. void timer0_mux(int8 horD, int8 horU, int8 minD, int8 minU, int8 segD, int8 segU){
  12.    output_a(0b00000001);
  13.    output_b(horD);
  14.    delay_ms(3);
  15.    output_a(0b00000010);
  16.    output_b(horU);
  17.    delay_ms(3);
  18.    output_a(0b00000100);
  19.    output_b(minD);
  20.    delay_ms(3);
  21.    output_a(0b00001000);
  22.    output_b(minU);
  23.    delay_ms(3);
  24.    output_a(0b00010000);
  25.    output_b(segD);
  26.    delay_ms(3);
  27.    output_a(0b00100000);
  28.    output_b(segU);
  29.    delay_ms(3);  
  30.    set_timer0(0);
  31. }
  32. int valorDisp[10]={0b00111111,0b00000110,
  33.                    0b01011011,0b01001111,
  34.                    0b01100110,0b01101101,
  35.                    0b01111101,0b00000111,
  36.                    0b01111111,0b01101111};
  37. int8 horU, horD, minU, minD, segU, segD, HHSet, MMSet, HH, MM, SS;
  38. void main(){
  39.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
  40.    set_timer0(0);
  41.    enable_interrupts(INT_TIMER0);
  42.    enable_interrupts(GLOBAL);
  43.    while(TRUE){
  44.       if(input(PIN_C5)==1){
  45.          MMSet = MMSet + 1;
  46.          if(MMSet > 59)
  47.             MMSet = 0;
  48.          minD = MMSet/10;
  49.          minU = MMSet%10;
  50.          timer0_mux(valorDisp[horD], valorDisp[horU], valorDisp[minD],
  51.                     valorDisp[minU], valorDisp[0], valorDisp[0]);
  52.          rtc_set_datetime(0,0,0,0,HHSet,MMSet);
  53.          delay_ms(200);  
  54.       }  
  55.       if(input(PIN_C4)==1){
  56.          HHSet = HHSet + 1;
  57.          if(HHSet > 23)
  58.             HHSet = 0;
  59.          horD = HHSet/10;
  60.          horU = HHSet%10;
  61.          timer0_mux(valorDisp[horD], valorDisp[horU], valorDisp[minD],
  62.                     valorDisp[minU], valorDisp[0], valorDisp[0]);
  63.          rtc_set_datetime(0,0,0,0,HHSet,MMSet);
  64.          delay_ms(200);
  65.       }
  66.       rtc_get_time(HH,MM,SS);
  67.       horD = HH/10;
  68.       horU = HH%10;
  69.       minD = MM/10;
  70.       minU = MM%10;
  71.       segD = SS/10;
  72.       segU = SS%10;
  73.       timer0_mux(valorDisp[horD], valorDisp[horU], valorDisp[minD],
  74.                  valorDisp[minU], valorDisp[segD], valorDisp[segU]);
  75.    }    
  76. }

En cuanto al circuito podremos ver que es muy simple, el microcontrolador, los 6 displays, el RTC y por ultimo los transistores del multiplexado que en este caso los tengo representados por compuertas NOT para la simulación pero estoy usando 2N3904 con una resistencia de 2k2 en su base. 



Podremos utilizar el pin de sincronismo del DS1302 para activar un transistor extra y este puede activar los leds separadores de dígitos para que se de el aspecto HH : MM : SS, pero también puede quedar fijo como en algunos relojes.





Auto RC con HT12, L293D y Módulos a 433MHz

Después de realizar la nota sobre el mando a distancia de cuatro canales con los integrados HT12E y HT12D. Mediante el enlace de RF a 433MHz con los módulos comerciales TWS y RWS, realizamos un control remoto de 4 canales simultáneos. 

Enlace del mando de 4 canales: http://electgpl.blogspot.com.ar/2016/07/mando-distancia-de-4-canales-por-rf-con.html

En este caso le agregaremos un control de potencia para controlar dos motores de corriente continua, al necesitar la inversión de giro necesitamos un puente H, un sistema denominado full-bridge que no es mas que un una doble salida complementaria donde cada una de ellas conecta un borne del motor, entonces de esta manera logramos poner a positivo o negativo cada borne del motor de forma independiente y logramos la inversión de giro.

Como podemos ver, tenemos una fuente de tensión Vin que sera la tensión que alimentara el motor M, luego tenemos una doble salida complementaria formada en su primera etapa por S1 y S2, y en su segunda etapa por S3 y S4, la doble salida complementaria toma el nombre de Full-Bridge o Puente H.
Si cerramos el interruptor S1 y el S4, entonces la polarización en el motor sera de izquierda a derecha, si en cambio abrimos estos dos y cerramos S2 y S3, entonces la corriente en el motor sera de derecha a izquierda, de esta manera controlando estos 4 interruptores (en la vida real transistores) podremos controlar el giro del motor, y obviamente si abrimos las 4 el motor se detendrá. (hay casos en donde se alimentan de determinada forma de que el motor se frene, pero eso quedara para los motores Paso a Paso).

El L293D, posee en su interior los diodos Flyback para que la FCEM producida por el inductor del motor no genere un pico inverso que destruya la electrónica.
Si el integrado no posee estos diodos, debemos agregarlos por afuera, pero en el caso del L293D no tendremos ese problema.

El integrado L293D posee dos canales de alimentación, uno sera para la lógica y el control TTL lo cual sera de 5V, el otro canal de alimentación sera únicamente para el motor, lo cual puede ir desde los 4.5V hasta los 36V, en el caso del circuito propuesto estoy usando 5V ya que los motores que utilizo no soportan mas de 5V.

Hay que tener en cuenta que el consumo de los motores es mucho mayor al de la lógica (el HT12 y el modulo receptor), el problema es que si la batería no esta lo suficientemente cargada o si no tiene la corriente mínima necesaria, cuando el HT reciba un comando para prender un motor, el motor se encenderá haciendo que el consumo del mismo genere una caída de tensión que da por resultado el mal funcionamiento de la lógica del HT o del receptor y esto hace que el auto no pueda recibir mas ordenes del transmisor quedando "colgado" con el motor encendido sin responder.
Para ello se ha solucionado con un capacitor electrolítico de 4700uF que cumple la función de Bootstrap para almacenar la corriente necesaria para que en el arranque del motor sea descargada del mismo y no apague la lógica.

El transmisor es el mismo que se ha implementado en la otra nota del mando a distancia, claro que pueden redistribuir los botones para que sea mas amigable a lo que es un control remoto para un auto de juguete.




En el caso del receptor es donde encontraremos los cambios mencionados al principio de la nota, como podremos ver tenemos el modulo receptor representado por un conector ya que solo tendremos que conectarlo en la placa, luego tenemos el HT12D con su dipswitch para la codificación, su led de handshake que nos avisara que el sistema esta online, y por ultimo tenemos el L293D con los conectores para los motores y el capacitor de Bootstrap para proveer picos de corriente a demanda de los motores.






Metrología Eléctrica y Calibración de Multimetro

Un instrumento de medición es un dispositivo que nos provee de un valor que hace referencia a un fenómeno físico, por ejemplo una regla midiendo una dimensión, un termómetro midiendo temperatura, un voltímetro midiendo una diferencia de potencial, etc...
Pero como sabemos que aquella medición es correcta, si se mide una pila con un determinado multímetro y un compañero mide la misma pila con otro multímetro posiblemente de valores diferentes y cual sera el correcto?
Es aquí donde tendremos que analizar un poco nuestra medición y nuestro instrumento, es decir, que instrumento estamos utilizando para medir y que tan exacto es en cuanto los valores mostrados por el mismo.
Al realizar una medición determinada, es indispensable comprender que ésta jamás será absolutamente exacta, el resultado de la medida no coincidirá exactamente con el valor verdadero del mensurando. 
Cuando hablamos de calibración de instrumental la mayoría de la gente piensa en que uno desarma el multímetro y se pone a modificar valores en preset de ajuste fino y esa es la calibración, pero la realidad es que el 95% de la veces no se desarma ni se ajusta ningún instrumento, solo se lo compara o somete a un instrumento de mayor precisión que sera nuestro patrón y se realizan una serie de cálculos estadísticos que nos dará como resultado un desvió y una incertidumbre.

Para comprender que es el desvió y la incertidumbre tenemos un ejemplo muy visual y sencillo.
Analicemos el deporte de arqueria donde disponemos de flechas que serán lanzadas a una diana a determinada distancia.
El objetivo es que todas las flechas impacten en el centro de la diana para obtener el mayor puntaje, pero podría darse de que alguna pegue en el centro y otras por la cercanía, o que todas peguen a determinada distancia del centro pero agrupadas, de aquí podremos entender el desvió y la incertidumbre.

Ejemplo 1:

Podemos observar que las flechas han impactado todas en diferentes lugares, esto claramente habla de un arquero o arco que no tiene precisión ya que todos los intentos han sido diferentes a pesar de que una impacta en el centro el resto no, entonces se podría tomar como que ha sido suerte y no ha sido voluntario, lo cual llevado a un instrumento de medición, si hacemos 5 mediciones y todas dan muy diferentes entonces tenemos un instrumento con un desvió e incertidumbre mala.

Ejemplo 2:

En este caso podremos ver que a pesar de que ninguna flecha logra impactar el centro de la diana, todas están impactando muy cerca de la otra, esto se traduce como una buena incertidumbre, es decir si lo llevamos a un multímetro nos dirá que las mediciones son siempre iguales o cercanas, esto es muy bueno, pero sin embargo no pega en el centro, lo cual tiene un desvió considerable.

Ejemplo 3:

El ultimo caso, nos muestra una situación ideal, donde todas las flechas impactan en el mismo lugar y a su vez es en el centro de la diana, es decir, tiene una buena incertidumbre y un buen desvió, es la situación ideal de un instrumento de medición.
Por ejemplo un multímetro que tiene estas dos cualidades sera aquel que nos mostrara siempre el mismo valor (si medimos siempre la misma fuente) y a demás nos dará el valor mas cercano a la realidad ya que tiene muy poco desvió.

Para realizar esta medición de desvió e incertidumbre debemos realizar una serie de cálculos que podrían ser complejos pero voy a mostrar la versión acotada de los mismos para que sea sencillo, claro esta que aquel que quiera profundizar el tema podrá estudiarlo como Metrología Eléctrica y Calibración según norma EL-001.

En nuestro caso el proceso sera sencillo, realizaremos una determinada cantidad de mediciones con nuestro multímetro a testear y las tendremos que ir anotando, para ello hay dos maneras o caminos conocidos:

1) Método Directo
El método directo es el mas complejo ya que se requiere de un instrumento muy costoso, pero es el mas empleado en las organizaciones certificadoras, consiste en utilizar un instrumento calibrador como instrumento patrón, este instrumento es un dispositivo que ademas de mostrar en pantalla (con muy buena resolución) el valor de medición también provee de las señales para medir con el multímetro a testear, es decir, imaginemos una fuente de alimentación de muy alta precisión a la que podremos setearle el valor de tensión, corriente, frecuencia, resistencias, etc.. que deseamos y que a su ves nos lo mostrara en su pantalla de alta representación.
Un ejemplo de este instrumento podría ser un multicalibrador tipo el Fluke 5522
2) Método Indirecto
El método indirecto es el mas adecuado si no contamos con el dinero para la inversión de un instrumento como en el caso directo, pero al realizar este método indirecto podremos hacerlo en casa sin problemas.
Este método esta basado en la comparación con otro multímetro que debe tener mas precisión que el que vamos a testar.
Por ejemplo podríamos usar un multímetro de banco de 5 o 6 dígitos que se encuentre calibrado para usar como patrón (o bien el mejor que tengamos a mano), y luego podríamos usar una fuente de alimentación o pilas (las pilas son electro químicas por ende no tendrán ruido, es lo que denomino una fuente pura), de esta manera medimos simultáneamente la misma fuente con los dos medidores y anotamos los valores medidos, así sabremos que desvió tendremos respecto al instrumento patrón.
La incertidumbre la calcularemos en base a el multímetro a testar únicamente.

Laboratorio de Calibraciones:
Para realizar una calibración hay que tener en cuenta algunos parámetros extra que suelen ser ambientales y temporales.

a) Cables en buen estado y de correcta impedancia para las conexiones entre
el patrón y el multímetro.
b) Ambiente con temperatura y humedad controlada.

c) Termómetro e higrómetro de buena exactitud ya que también es un dato para la calibración.
d) Contar con el manual del multímetro a calibrar (es necesario saber que incertidumbre y resolución garantiza el fabricante).
e) Esperar a la estabilización térmica del instrumento patrón.
f) Temperatura y humedad en las condiciones indicadas por el fabricante o las de referencia del laboratorio (23 ºC ± 2 ºC y <75 %).
g) Corroborar que se los terminales están correctamente sujetados y con el contacto optimo para que la resistencia de contacto sea la menor posible.

Si el multímetro a testear posee ajuste de cero (no suele ser así en multímetros con menos de 5 dígitos), se debe realizar el cero correspondiente antes de empezar, en caso de que no posea este ajuste, simplemente se puede anotar.

Conociendo el Multímetro Digital (DMM)
Algunos datos tendrán que tener en cuenta como importante al momento de adquirir un DMM.
i) Dígitos disponibles en el display (Esto nos dirá la resolución del instrumento).
ii) Impedancia de entrada. Para la medición de tensión debe ser alta, y  para la medición de corriente debe ser baja. (Hay DMM que poseen una tecla especial como LoZ para medir baja impedancia en tensión).
iii) Respuesta en frecuencia. Hasta que frecuencia puede medir el instrumento una señal alterna.
iv) Resolución en cada rango, el valor mínimo de medición en cada escala, es un valor que debemos calcular en la calibración.
v) Incertidumbre para cada rango de medición.

Existen dos tipos de multímetros digitales que podremos encontrar hoy en día, dejando de lado la resolución y precisión, tendremos los TrueRMS y los No TrueRMS.

El valor RMS de la señal alterna es el valor equivalente al que se somete una carga lineal que generara una determinada cantidad de disipación térmica igual que si alimentamos la misma carga con una corriente continua, es decir, si alimentamos una resistencia y esta genera calor, debe ser el mismo calor generado tanto por la corriente continua que por la alterna, pero como ambas corrientes son diferentes, debemos ajustar sus valores de amplitud para que la resistencia nos proporcione el mismo calor, para ello se supone que el 70.7% del valor pico de una corriente alterna sera el RMS (Este calculo viene dado una función matemática integral). Este sera solo para una senoidal pura.

La medición TrueRMS nace de la necesidad de medir valores de tensión o corriente alterna que no poseen una forma de onda senoidal, por ende debemos realizar una serie de cálculos matemáticos para analizar instantáneamente cada valor de amplitud de la señal y así llegar a un numero final, es decir, si medimos por ejemplo una fuente capacitiva tendremos un desfasaje de la corriente respecto a la tensión, pero no solo es ese desfasaje sino que también se puede deformar la onda ya que la fuente posee componentes semiconductores que no son lineales y al deformar la onda tendríamos una medición errada si no usamos un medidor TrueRMS. 
De esta manera medimos el valor RMS verdadero luego de someter dicha señal a un calculo matemático para procesar la misma.

DMM TrueRMS
En DC o CC (Corriente Continua) se toma el valor medio de la señal. Si la señal es continua simplemente mostrará su valor.
En AC (Corriente Alterna) se elimina la componente continua con un capacitor de desacople de entrada y muestra el valor eficaz de la señal resultante del algoritmo matemático.

DMM NO TrueRMS
En DC o CC (Corriente Continua) al igual que el TrueRMS se toma el valor medio de la señal. 
Si la señal no tiene componente continua como en el caso de una senoidal pura, entonces la indicación será cero, o casi cero por errores de medición o ruido. 
Si la señal es continua, simplemente nos muestra su valor continuo.
En AC (Corriente Alterna) el instrumento le saca a la señal su componente continua por medio de un capacitor de desacople de continua en serie a la entrada luego se rectifica con un diodo y de ahí se toma el valor medio que es multiplicado por 1.1 siempre pensando que la señal es sonidal pura, pero como se mencionaba anteriormente si la forma de onda no es senoidal pura, la medición sera errada.

Ejemplo



En este caso tenemos 6000 cuentas en la pantalla como podremos ver, 3 tipos de resolución y una precisión.

El display de un DMM viene representado por la cantidad de dígitos, por ejemplo: 3 1/2.
Por ejemplo para una medición de 5.999 se representan 3 dígitos del 0 al 9 (999) y luego el medio dígito que podría ser equivalente del 1 al 5 dependiendo del fondo de escala. del instrumento. 6V, 60V, 600V.
Si miramos el manual del DMM podremos ver que para cada función de medición de nuestro DMM tendremos asociados algunos valores, por ejemplo para la tensión (V), tendríamos Rango, Resolución y Precisión.
Rango: 6000mV, Resolución: 1mV y Precisión: 0.1%.
Rango: 60V, Resolución: 10mV y Precisión: 0.1%.
Rango: 600V, Resolución: 100mV y Precisión: 0.1%.

Si estoy en 6V (6000mV) el DMM mostrara hasta 5.999V
Cuando vemos que la precisión es de 0.1 nos indica que es un error absoluto y si nos indica que es 0.1% es un error relativo.

Ejemplo Práctico:

Medición de una pila alcalina de 1.5Vdc y situamos el multímetro en la escala a testear

1) Tomamos por ejemplo 10 muestras: 

1,48 V
1,48 V
1,47 V
1,45 V
1,51 V
1,50 V
1,52 V
1,52 V
1,48 V

1,50 V

2) Aplicamos el promedio de las mediciones:
(1,48+1,48+1,47+1,45+1,51+1,50+1,52+1,52+1,48+1,50) / 10 = 1,491

3) Calculamos el Error Absoluto por cada una de las 10 mediciones:

1,48 - 1,491 = -0,011
1,48 - 1,491 = -0,011 
1,47 - 1,491 = -0,021 
1,45 - 1,491 = -0,041 
1,51 - 1,491 =  0,019 
1,50 - 1,491 =  0,009 
1,52 - 1,491 =  0,029 
1,52 - 1,491 =  0,029 
1,48 - 1,491 = -0,011 

1,50 - 1,491 =  0,009 

4) Calculamos la incertidumbre absoluta


S = RAIZ(((-0,011)^2+(-0,011)^2+(-0,021)^2+(-0,041)^2+(0,019)^2+(0,009)^2+(0,029)^2+(0,029)^2+(-0,011)^2+(0,009)^2) / 9) = 0,0228

S = 0,023

5) Calculamos el valor final

1,491 ± 0,023 V

Este sera el valor medido para el testeo del multímetro respecto de la medición de una pila de 1.5V.