jueves, 15 de octubre de 2015

Reloj digital a base de led's. 2º FPB. Instalación y Mantenimiento de Redes de Transmisión de Datos.

Hola:
Con los alumnos de 2º de FP Básica nos hemos propuestos construir un reloj digital a base de led's. El proyectos entre otras cosas nos servirá para estudiar la transmisión de datos en serie y su salida en paralelo y para eso harémos uso de multiplexor 74HC595 que será el encargado de recibir los datos en serie de un Arduino Nano V3.0 y "atacar" los displays de 7 segmentos construidos de forma "artesanal" a base de led's.
Este post lo iré actualizando con las fotografías de las fases de nuestro proyecto.

1. Estudio y simulación del multiplexor.

Hemos estudiado y simulado las líneas de entrada al multiplexor con salida triestado 74HC595: CLK, Data, Latch.
Simulación del comportamiento de cuatro CI's 74HC595, conectados a displays de 7 segmentos.

2. Plantilla de led's e instalación en el soporte.

Nuestra plantilla y taladrado del soporte.
Instalación de led's. Delante.

Instalación de led's. Detalle de conexionado y soldadura blanda.

16 de octubre de 2015

Conexionado de salida a multiplexor

Disposición de led's.

21 de octubre de 2015

3. Plantilla de codificación y conexionado

4. Placa Prototipo

23 de octubre de 2015

Soldadura en placa prototipo.


6 de noviembre de 2015

Después de varios días dedicados a otros temas: teoría, exámenes, ejercicios... hemos retomado el trabajo con el prototipo del reloj. 
A falta de algunos componentes (varias resistencias y condensadores) y de los pulsadores de puesta en hora, el estado de la placa de prototipos es el siguiente:

Las soldaduras en la cara de las pistas es muy laboriosa pues se deben ir realizando las pistas con estaño, uniendo puntos de igual potencial.


5. Conexión de la placa a las matrices de LED

6 de noviembre de 2015. Por el momento se ha conexionado las señales correspondientes a las decenas de horas, y hemos probado su funcionamiento.

6. Programa código de Arduino.

A falta de alguna depuración en el código, el programa de Arduino está terminado. En los próximos días lo subiremos al blog.
Se ha utilizado como entrono de programación el IDE de Arduino:  https://www.arduino.cc/en/Main/Software
y se ha hecho uso de las librerías:

7. Alimentación del reloj.

12 de noviembre de 2015. Para la alimentación del reloj, hemos utilizado un cargador de un viejo teléfono móvil. Según la placa de característcas es capaz de suministrar a la carga 700mA a 9V. Como necesitamos una tensión constante de 5V para alimentar el arduino, el RTC y los CI 74595, hemos tenido que instalar el la placa un regulador de tensión positiva 7805.

8. Construcción del armazón soporte.

13 de noviembre de 2015. Hoy hemos estado contruyendo el marco soporte del reloj digital a base de led's. En principio pensabamos utilizar algún marco de bajo precio, pero con las premisas de realizar nosotros mismos todas las fases posibles del montaje e instalación e intentando reciclar productos, hemos utilizado unas patas de madera de una vieja silla que hemos encontrado.
Para la parte anterior se ha utilizado una placa de policarbonato liscio transparente que hemos cortado a la medida.
Para la parte porterior, al igual que para la sujección de los led's, hemos utilizado una plancha de cartón prensado reciclada de un viejo mueble de cocina.
Una vez ensambladas las piezas y aisladas procederemos a pintarlas.
Os dejo las fotos.



9. Código para el reloj con LED's con Arduino y RTC DS3231.


10. Ya tenemos el reloj terminado y en la entrada de nuestro Centro.

26 de noviembre de 2015.. El aspecto final de vuestro reloj terminado e instalado en el Centro: http://fpbasicaelectricidad.blogspot.com.es/2015/11/ya-tenemos-el-reloj-terminado-y-en-la.html

BUEN TRABAJO!!!!!!


Un saludo


15 comentarios:

  1. Apreciados Jóvenes, es un placer felicitarles, motivarles a continuar y comentarles que estaré al pendiente de su proyecto que espero poder replicar en la iglesia donde asisto. Un saludo desde El Salvador

    ResponderEliminar
  2. Muchas gracias por tus comentarios. Verdaderamente nos ha salido un proyecto muy "chulo". Desde ayer tenemos el reloj en la entrada de nuestro Centro.
    Espero que en su construcción te diviertas tanto como nosotros realizándolo.
    Gracias.

    ResponderEliminar
  3. Hola muy buenas.
    Llevo tiempo buscando informacion de como hacer un reloj de led´s con botones y he dado con vuestro blog.
    Me ha parecido genial y muy completo,voy a realizar el reloj como el vuestro,pero me falta el diagrama de conexiones,que no aparecen todas las fotos.
    El codigo lo he compilado y me funciona correctamente,he leido que tambien lleva resistencias y condensadores.
    Me gustaria conocer la informacion para poder realizarlo y os muestro el resultado cuando lo tenga terminado.
    Un saludo y gracias.
    David.

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tus comentarios. Nos alegra que te haya gustado nuestro proyecto de reloj a base de led's. Puedo decirte que aún está funcionando perfectamente y no ha retrasado ni adelantado ni un segundo.
      En cuanto a la dudas que planteabas sobre el diagrama de conexiones, lo único que falta es la conexión de los led's y las resistencias limitadoras de corriente a los led's. Nosotros solucionamos ésto con una única resistencia (50 Ohm) entre todos los cátodos de un mismo dígito de leds. La solución no es la más adecuada pero funciona. La solución mejor es usar transistores para excitar los led's, y en este caso un array de transistores darlington como puede ser ULN2803A. Según este esquema:
      http://embedded-lab.com/blog/wp-content/uploads/2013/04/MatrixCircuit.jpg
      Un saludo

      Eliminar
  4. amigo como seria para un reloj de 12 horas ??

    ResponderEliminar
    Respuestas
    1. Hola:
      Esta parte de código es la encargada de leer el RTC (DS3231) y de escribor los datos en los led's correspondientes:
      //=========================================================
      /* ESCRIBIR LAS HORAS */
      temporal = leer_DS3231(DIR_HORAS); // LEE EL REGISTRO DE LAS HORAS
      if ((temporal & 0b01000000) && (temporal & 0b00100000)){ // SI ESTÁ EN MODO 12 HORAS Y ADEMÁS ES PM --> CONVERTIR
      temporal = ((byte) ((int)(temporal & 0b00011111)+12));
      }
      // ESTÁ EN MODO 24 HORAS O EN MODO 12 HORAS Y ES AM o ya se ha convertido
      shiftOut(pinDatos, pinReloj, LSBFIRST, digitos_LED[(int) (temporal & 0x0F)]);
      if ((temporal>>4) & 0x03){
      shiftOut(pinDatos, pinReloj, LSBFIRST, digitos_LED[(int) ((temporal>>4) & 0x03)]); // SOLO LOS 2 PRIMEROS BITS DESPUÉS DE DESPLAZAR
      }
      else shiftOut(pinDatos, pinReloj, LSBFIRST, 0x00); // Para no escribir el 0 delante de las horas de una cifra
      digitalWrite(pinLatch, HIGH); // ACTIVA LATCH
      }
      //=========================================================

      A mí me interesaba que siempre e independiente de la programación del Reloj en Tiempo Real (DS3231), la presentación de las horas fuese en formato 24 horas.
      Si lo que deseas es que aparezcan los datos siempre en formato 12 horas, solo hay que modificar un poco estas líneas; quedando así:

      //=========================================================

      /* ESCRIBIR LAS HORAS */
      temporal = leer_DS3231(DIR_HORAS); // LEE EL REGISTRO DE LAS HORAS

      //Si temporal es mayor de 12, restar 12 al valor de temporal (además de quitar los 3 MSB)
      temporal &= 0b00011111; // Se quitan los 3 bits MSB
      if ((int)(temporal ) > 12) temporal = ((byte) ((int)(temporal) - 12)); // Se resta 12, a partir de las 13:00 h

      shiftOut(pinDatos, pinReloj, LSBFIRST, digitos_LED[(int) (temporal & 0x0F)]);
      if ((temporal>>4) & 0x03){
      shiftOut(pinDatos, pinReloj, LSBFIRST, digitos_LED[(int) ((temporal>>4) & 0x03)]); // SOLO LOS 2 PRIMEROS BITS DESPUÉS DE DESPLAZAR
      }
      else shiftOut(pinDatos, pinReloj, LSBFIRST, 0x00); // Para no escribir el 0 delante de las horas de una cifra
      digitalWrite(pinLatch, HIGH); // ACTIVA LATCH
      }

      Eliminar
  5. amigo en los displays de las horas siempre me aparece el numero 9, este problema resulto después de la modificación de la programación para 12 horas

    ResponderEliminar
    Respuestas
    1. Disculpa, efectivamente el código tenía un error. Perdona por no haberlo comprobado antes de responderte. Como tantas veces lo que parece obvio es justamente la causa del error. Las líneas de código a modificar para lo que quieres son:

      ========================================================================
      /* ESCRIBIR LAS HORAS */
      temporal = leer_DS3231(DIR_HORAS); // LEE EL REGISTRO DE LAS HORAS

      //Si temporal es mayor de 12, restar 12 al valor de temporal (además de quitar los 3 MSB)

      temporal &= 0b00011111; // Se quitan los 3 bits MSB

      if ((int)(temporal ) > 12) temporal = ((byte) ((int)(temporal) - 12)); // Se resta 12, a partir de las 13:00 h
      =========================================================================
      Otra opción sería programas el DS3231 para funcionar en modo 12 horas.

      Me alegra que te hayas decidido a hacer este proyecto. Te agradecería que adjuntara alguna alguna foto y/o reseña si ha funcionado.
      Nuestro reloj lleva funcionando ya 1 año y sigue dando la hora y la temperatura puntualmente.

      Un abrazo.

      Eliminar
  6. Muy buen proyecto me funciona en modo 24 horas,pero cuando quiero cambiarlo a 12 horas, no funciona trabaja siempre queda en 24 horas ya hice todos los cambios que sugeriste y ninguno surtió efecto, me podrías ayudar es que lo necesito.Gracias

    ResponderEliminar
    Respuestas
    1. Hola Álvaro:
      Te agradezco que hayas realizado nuestro proyecto y que compartas tu experiencia con nosotros.
      He estado comprobando las sugerencias de cambio que propuse y no encuentro un error para que no te funcione correctamente en modo 12 horas.
      Nosotros nos propusimos la programación para el funcionamiento solo en modo 24 horas, por lo que no hemos probado el modo 12 horas.
      En estos momentos no tenemos acceso a reprogramar el reloj en modo 12 horas con las sugerencias que te he hecho porque el reloj está funcionando de forma fija y no tenemos acceso. De hecho lleva funcionando algo más de 2 años sin ninguna intervención de puesta en hora y no ha retrasado más de 1 segundo.
      Como te comenté, hay dos posibilidades para conseguir que el reloj funcione en modo 12h:
      1) Programar el DS3231 para funcionar en modo 12 horas, de forma que la salida ya esté en ese formato 12 horas.
      2) Programar en modo 24 horas y restar 12 cuando el valor de la variable temporal (con los 3 bits MSB puestos a cero) es mayor de 12.
      De hacer las dos cosas a la vez tampoco te funcionará correctamente. Comprueba que no es ese el problema y nos cuentas.
      Si aún así persiste el problema, publica el código completo que has programado en arduino (con las modificaciones que has introducido) y le echo un vistazo.
      Muchas gracias y un saludo.

      Eliminar
    2. Si tienes tiempo me puedes explicar el valor numérico de estos items no me queda claro los registros de donde se obtiene ese valor
      **(leer_DS3231(DIR_HORAS)& 0x3F )
      **digitos_LED[(int) ((temporal>>4) & 0x03)])
      **temporal &= 0b00011111
      **if ((temporal & 0b01000000) && (temporal & 0b00100000))
      **(temporal & 0b00011111)+12))

      Eliminar
    3. Hola:
      Intentaré responderte. Disculpa que no lo haya hecho antes pero no vi el comentario.
      1) temporal=(leer_DS3231(DIR_HORAS)& 0x3F )
      Con esta línea se lee el valor del registro DIR_HORAS cuya dirección del registro está definida (#define DIR_HORAS 0x02) y después de poner los dos Bits MSB a 0 guardamos su valor en la variable temporal.

      2) **digitos_LED[(int) ((temporal>>4) & 0x03)])
      La función digitos_LED "traduce el valor del número binario en el valor binario de los led's que se deben encender para representar ese número. O sea, funcionaría como un conversor BCD-7 Segmentos (7447 TTL). (temporal>>4) & 0x03) es porque está convirtiendo el valor de las decenas del número en cuestión.

      3) **temporal &= 0b00011111
      Es igual a temporal = temporal & 0b00011111; Licencias de la programación en C. Sirve para poner a 0 los 3 bits MSB

      4) **if ((temporal & 0b01000000) && (temporal & 0b00100000))
      Ciertmente esta línea debería haberse puesto como " if ((temporal & 0b01100000); ". La compliqué en exceso para el código.

      5) **(temporal & 0b00011111)+12))
      Como nosotros siempre representamos en modo 24h, si es modo 12 horas, PM, para representar la hora en modo 24h sumamos 12.

      Espero haber solucionado tus dudas. Y disculpa si me he demorado un poco.

      Feliz 2018.

      Eliminar
  7. Mucho gusto, muy interesante proyecto, descargue el codigo y que compila bien, pero no entiendo como van las conecciones fisicas.
    Podrian compartir el diagrama del circuito.
    Desde ya Muchas gracias.

    ResponderEliminar
  8. Alguien que ya lo haya hecho y le este funcionando al 100, que pueda compartir el diagrama.
    Muchas gracias.

    ResponderEliminar