Tabla de contenido:

Minidot 2 - el Holoclock: 6 pasos
Minidot 2 - el Holoclock: 6 pasos

Video: Minidot 2 - el Holoclock: 6 pasos

Video: Minidot 2 - el Holoclock: 6 pasos
Video: Как я настраиваю новый месяц в своем ежедневнике — шаг за шагом 2024, Mes de julio
Anonim
Minidot 2 - el Holoclock
Minidot 2 - el Holoclock
Minidot 2 - el Holoclock
Minidot 2 - el Holoclock

Bueno, tal vez holoclock sea un poco inexacto … usa una película de dispersión holográfica en el frente para dar un poco de profundidad. Básicamente, este instructivo es una actualización de mi Minidot anterior ubicado aquí: https://www.instructables.com/id / EEGLXQCSKIEP2876EE / y reutilizar una gran cantidad de código y circuitos de mi Microdot ubicado aquí: https://www.instructables.com/id/EWM2OIT78OERWHR38Z/EagleCAD y el código Sourceboost se incluye en los archivos zip adjuntos. El Minidot anterior era demasiado complejo, del Microdot aprendí cómo hacer un RTC en un PIC usando solo un cristal 32.768 y no necesitaba usar un chip RTC especial. También quería deshacerme de los chips de visualización del Minidot anterior. Así que ahora solo hay un chip regulador de potencia y un PIC16F88 … solo dos chips. Las otras razones para una actualización fueron que mi Minidot se estaba volviendo un poco poco confiable debido a la placa de interruptores separada y quería un desvanecimiento suave entre los patrones de puntos como así como algún tipo de sensor de luz ambiental para atenuar la pantalla por la noche. El otro Minidot tenía brillo fijo e iluminaba una habitación por la noche. El dispositivo se construyó con la ayuda del paquete de software EagleCad y el compilador Sourceboost. Necesitará tener algo de experiencia con la electrónica y la programación de controladores PIC para comenzar este proyecto. Tenga en cuenta que esto no es un instructivo sobre electrónica o programación PIC, así que mantenga las preguntas relevantes para el diseño de Miniclock. Consulte los instructivos anteriores o muchos otros instructivos en este sitio para obtener consejos sobre el uso de EagleCad o la programación de PIC. Así que aquí está….. Minidot 2, El Holoclock …… o Minidot The Next Generation ………….

Paso 1: el circuito

El circuito
El circuito
El circuito
El circuito
El circuito
El circuito

Este circuito es muy similar al Microdot. Tenga en cuenta que la matriz charlieplex es prácticamente idéntica … solo se han movido unos pocos pines.

Se ha agregado un cristal de 20Mhz al circuito Microdot para sincronizar el PIC mucho más rápido, esto permite que la matriz se escanee más rápido y permite la implementación de un algoritmo de atenuación. El algoritmo de atenuación fue muy importante para lograr que una función de luz ambiental y desvanecimiento de patrón cruzado funcionara. Esto hubiera sido imposible con el Microdot, debido a la velocidad de reloj más lenta, ya que algunos ciclos de escaneo debían dedicarse a la atenuación. Consulte la siguiente sección para obtener una descripción de la función de atenuación. Las otras cosas a tener en cuenta son el uso de un regulador de bomba de carga MCP1252 para suministrar 5V, mi chip favorito en este momento. Si modificaste el circuito, podrías usar un viejo 7805 … Solo tengo algunos de estos prácticos chips por ahí. Ahora moví los interruptores al frente, me ahorra tocar el violín en la parte posterior del reloj después de cortes de energía para restablecer el tiempo y ahora todo es solo una PCB … sin problemas de cableado. También es de destacar la inclusión de un LDR. Esto se usa en un divisor de voltaje que es detectado por el pin A / D en el PIC. Cuando el PIC detecta que el nivel de luz ambiental es bajo (es decir, durante la noche), el algoritmo de atenuación mantiene la matriz charlieplex oscura durante más ciclos que cuando el nivel de luz es alto. No pude encontrar un símbolo LDR en la biblioteca de Eaglecad, así que utilicé un símbolo LED … no se deje engañar, es un LDR. Vea la imagen real de la PCB a continuación. Una cosa a tener en cuenta cuando se utilizan LED multicolores en una matriz charliplex. Debe asegurarse de que el voltaje directo de los LED sea más o menos el mismo. De lo contrario, pueden producirse rutas de corriente parásitas y se encenderán varios LED. Por lo tanto, el uso de LED de 5 mm o más de potencia para esta configuración no funcionará, ya que generalmente hay una gran diferencia entre los LED verde / azul y los LED rojo / amarillo. En este caso utilicé leds 1206 SMD y en particular leds verde / azul de alta eficiencia. Sin embargo, los voltajes de avance no fueron un problema aquí. Si quisiera utilizar una combinación de LED de mayor potencia verde / azul y rojo / amarillo en una matriz charlieplex, necesitaría separar los diferentes colores en dos matrices charliplex. Hay numerosas explicaciones de charlieplexing que se pueden buscar en Google …… No entraré en detalles aquí. Te dejo a ti que investigues un poco. (Presione el pequeño ícono 'i' en la esquina de la imagen de abajo para ver una versión más grande)

Paso 2: El algoritmo de atenuación: modulación de ancho de pulso Charliplexed

El algoritmo de atenuación: modulación de ancho de pulso Charliplexed
El algoritmo de atenuación: modulación de ancho de pulso Charliplexed

Como se mencionó anteriormente, quería que los diferentes patrones de puntos durante el tiempo se desvanecieran suavemente en lugar de pasar de un patrón a otro. Vea el video para una demostración. En el medio está el nuevo reloj Minidot, a la derecha está el Minidot más antiguo. Fíjate cuánto mejor es el nuevo. (Para su información, las otras pantallas en el fondo son la pantalla de estado de mi superordenador Minicray y mi partícula Nebulon capturada que alimenta al Minicray en un campo de confinamiento magnético de antimateria. Vea aquí: https://www.youtube.com/watch? V = bRupDulR4ME para una demostración de la cámara de confinamiento del nebulón) Si busca en el código, abra el archivo display.c. Tenga en cuenta que hay cuatro matrices para mapear los valores de tris / puerto para iluminar cualquier matriz en particular y dos matrices (una más que el código Microdot) para definir qué LED deben iluminarse para cualquier patrón particular de LED, por ejemplo:

// LED1 LED2 LED3… carácter sin firmar LEDS_PORTA [31] = {0x10, 0x00, 0x00,… carácter sin firmar LEDS_TRISA [31] = {0xef, 0xff, 0xff,… carácter sin firmar LEDS_PORTB [31] = {0x00, 0x02, 0x04, … Carácter sin firmar LEDS_TRISB [31] = {0xfd, 0xf9, 0xf9,… carácter sin firmar nLedsA [30]; carácter sin firmar nLedsB [30];Para encender el LED1, por ejemplo, debe configurar los registros TRIS TRISA: B = 0xef: 0xfd y los registros PORT PORTA: B = 0x10: 0x00 y así sucesivamente. Si escribe los valores tris en binario, notará que en cualquier momento, solo hay dos salidas habilitadas. Los demás están todos configurados en Tri-state (de ahí el registro TRIS). Esto es fundamental para charlieplexing. También notará que una salida es siempre un '1' lógico y la otra es siempre un '0' lógico … cuya dirección se enciende en el LED que se encuentre entre estas dos líneas de salida. El último valor en el puerto / tris matrices es un valor nulo para encender ningún LED en absoluto. En el Microdot, la función update_display cicló continuamente a través de otra matriz (nLeds ) para ver si ese LED en particular debía iluminarse. Si fue así, entonces se establecieron los valores de puerto / tris correspondientes y el LED se iluminó durante un período de tiempo. De lo contrario, el valor nulo se envió a los registros TRIS / PORT de PIC y no se iluminó ningún LED durante un período de tiempo. Cuando se hizo lo suficientemente rápido, esto dio un patrón. El resto del programa leería periódicamente los valores de RTC y crearía un patrón aleatorio agradable en esa matriz … y así la pantalla cambió. Para hacer una función de atenuación, esto se extendió ligeramente para que después de que se iluminaran los 30 LED (o no), entonces se gastarían períodos adicionales en enviar valores nulos si la pantalla se atenuara …..para obtener un brillo completo, entonces no se gastarían períodos adicionales. Cuando se repite si hay muchos períodos nulos en los LED iluminados, la pantalla se atenuará. En efecto, esto es modulación de ancho de pulso multiplexado…..o porque el hardware está configurado en un arreglo charlieplex, luego modulación por ancho de pulso charlieplexed. El segundo diagrama a continuación muestra la configuración básica para esto. Yo llamo a esto un marco de escaneo. Los primeros 30 períodos del marco se utilizan para pasar por los LED…..y un número variable de períodos adicionales definen qué tan tenue será la pantalla. Este ciclo se repite. Más períodos nulos significan menos tiempo para que un LED esté encendido por cuadro (porque el número de períodos aumentó). Tenga en cuenta que el eje vertical no significa nivel de voltaje. El estado real de los pines que van a los LED varía dependiendo de su posición en la matriz charlieplex … en el diagrama solo significa encendido o apagado. Esto también significó que la longitud total del marco en el tiempo también aumentó, disminuyendo así la actualización índice. A medida que los LED se atenuaban, comenzaban a parpadear en otras palabras. Entonces, este método es útil solo hasta cierto punto. Para el reloj, estaba bien. Se llama intermitentemente una función que lee el convertidor A / D en el PIC y establece este nivel de brillo. Si lee el código, también verifica si el LED más cercano al LDR está encendido y no realiza ningún ajuste de nivel, si es así, esto detiene la pantalla de forma inesperada cuando cambia el patrón. A continuación, la función de fundido cruzado.

Paso 3: Algoritmo de atenuación: efecto de fundido cruzado y búfer doble

Algoritmo de atenuación: efecto de fundido cruzado y búfer doble
Algoritmo de atenuación: efecto de fundido cruzado y búfer doble

La transición entre un patrón y el siguiente era previamente inmediata. Para este reloj, quería mostrar un patrón que disminuía gradualmente en brillo y el siguiente patrón aumentaba gradualmente … es decir, un desvanecimiento cruzado.

No necesitaba tener LED individuales para controlarlos en niveles de brillo separados para hacer un fundido cruzado. Solo necesitaba el primer patrón con un brillo y el segundo con un brillo bajo. Luego, durante un período corto, disminuiría un poco el brillo del primero y aumentaría el segundo … esto continuaría hasta el segundo patrón como en su totalidad. Luego, el reloj esperaría hasta que se mostrara el siguiente patrón y habría otra transición. Por lo tanto, necesitaba almacenar dos patrones. El que se muestra actualmente y el segundo patrón que estaba a punto de mostrarse. Estos se encuentran en las matrices nLedsA y nLedsB. (tenga en cuenta que no tiene nada que ver con los puertos en este caso). Este es el doble búfer. La función update_display () se modificó para recorrer ocho fotogramas y mostrar varios fotogramas de primero una matriz y luego la otra. Cambiar el número de cuadros asignados a cada búfer a lo largo de los ocho ciclos definió qué tan brillante sería cada patrón. Cuando terminamos de alternar entre los búferes, cambiamos los búferes de 'visualización' y 'siguiente visualización', por lo que la función de generación de patrones escribiría solo en el búfer de 'siguiente visualización'. El siguiente diagrama muestra esto con suerte. Debería poder ver que la transición tomará 64 cuadros de escaneo. En la imagen, el pequeño recuadro muestra el diagrama del marco de escaneo de la página anterior ingeniosamente reducido. Una palabra sobre la tasa de renovación. Todo esto debe hacerse muy rápidamente. Ahora tenemos dos niveles de cálculo adicional, uno para la atenuación de la pantalla ambiental y otro para los ocho ciclos de fotogramas dedicados a hacer una transición entre dos búferes. Por lo tanto, este código debería escribirse en ensamblador, pero es suficientemente bueno en 'C'.

Paso 4: Construcción: la PCB

Construcción - el PCB
Construcción - el PCB
Construcción - el PCB
Construcción - el PCB

Esto es bastante sencillo. Solo una PCB de doble cara con algunos componentes SMD en la parte superior. Lo siento si eres una persona con agujeros pasantes, pero es mucho más fácil hacer proyectos SMD … sin agujeros para perforar. Debe tener una mano firme, una estación de soldadura con control de temperatura y mucha luz y aumento para facilitar las cosas.

Lo único a destacar en la construcción de la PCB es la inclusión de un conector para programar el PIC. Esto se conecta a los pines ICSP en el PIC y necesitará un programador ICSP. De nuevo utilicé un práctico conector para mi caja de basura. Puede omitir esto y soldar cables a las almohadillas si lo desea. Alternativamente, si solo tiene un programador enchufado, puede hacer un encabezado que se enchufa en su enchufe y luego soldarlo a las almohadillas ICSP. Si hace esto, desconecte Rx y conecte Ry, que son solo enlaces de cero ohmios (solo uso una gota de soldadura). Esto desconectará el resto de la energía del circuito del PIC para que no interfiera con la programación. Un programador enchufado solo usa los pines ICSP como un programador ICSP, realmente no hay magia involucrada. También debe hacer esto si, por error, se olvidó de poner un retraso en el código antes de que se inicie el RTC. Para el 16F88, los pines de programación ICSP son los mismos que los pines necesarios para el cristal de 32,768 kHz utilizado para el RTC …… si el oscilador externo T1 (es decir, el RTC) se está ejecutando antes de que el ICSP pueda comenzar a funcionar, entonces la programación fallará. Normalmente, si hay un reinicio en el pin MCLR y hay un retraso, entonces los datos ICSP se pueden enviar a estos pines y la programación puede comenzar correctamente. Sin embargo, al aislar la alimentación del PIC, el programador ICSP (o programador enchufado con un encabezado) puede controlar la alimentación del dispositivo y forzar un programa. Las otras cosas a tener en cuenta son que las almohadillas de cristal en la PCB se diseñaron originalmente para cristales SMD. No podía esperar a que se entregaran algunos, por lo que el cristal de reloj de 32.768 kHz se soldó a la parte superior como se muestra, y el cristal de 20 MHz se colocó perforando un par de agujeros en las almohadillas, metiendo el cristal por la parte inferior y soldando en el cima. Puede ver los pines a la derecha del PIC16F88.

Paso 5: la película holográfica y la carcasa

La película holográfica y la carcasa
La película holográfica y la carcasa
La película holográfica y la carcasa
La película holográfica y la carcasa
La película holográfica y la carcasa
La película holográfica y la carcasa

La construcción final consiste simplemente en colocar el PCB en la carcasa y, después de programarlo, fijarlo con un poco de pegamento caliente. Tres orificios permiten el acceso a los microinterruptores desde el frente.

La parte notable de este reloj es el uso de una película difusora holográfica. Esta es una película especial que tenía por ahí que proporciona una buena profundidad al dispositivo. Puede usar papel de calco normal (en el que movería la PCB más cerca del frente) o cualquier otro difusor como los que se usan en las lámparas fluorescentes. Experimente, lo único que necesita hacer es permitirle diferenciar entre la cantidad de LED iluminados, o de lo contrario contar los puntos para saber la hora será difícil. Usé material de dispersión holográfica de la Corporación de Óptica Física (www.poc.com) con una dispersión circular de 30 grados, la pantalla de estado de la supercomputadora que se muestra en otra parte del instructable usó una película con una dispersión elíptica de 15x60 grados. Podría usar un poco de cinta opaca para ocultar las entrañas brillantes durante el día para obtener un aspecto más misterioso. Incluso puedes dejar la pantalla despejada y dejar que la gente vea las entrañas como yo. El soporte era de dos pedazos de barra de aluminio en "L" con un poco cortado en la parte inferior para permitir una curva. Tenga en cuenta que en estas imágenes se agregó iluminación adicional para que pueda ver las cubiertas de la pantalla, etc. En la iluminación normal de la sala de estar, los LED son más prominentes, incluso a la luz del día.

Paso 6: Software e interfaz de usuario

El funcionamiento del dispositivo es muy simple, sin modos de patrón especiales o cosas llamativas. Lo único que hace es mostrar la hora.

Para configurar la hora, primero presione SW1. El dispositivo hará parpadear todos los LED unas cuantas veces y luego el grupo de LED de 10 horas SW3 incrementará el grupo seleccionado SW2 se moverá al siguiente grupo de LED, cada vez que parpadearán todos los LED del grupo brevemente. El código está escrito para la versión 6.70 del compilador Sourceboost 'C'. El código RTC está en los archivos t1rtc.c / h, y tiene una función de interrupción en el temporizador T1 del PIC. El temporizador T1 está configurado para interrumpirse cada segundo. En cada segundo, la variable del tiempo se incrementa. Además, un temporizador de tic se cuenta atrás cada segundo junto con el tiempo. Esto se utiliza para determinar cuándo realizar la transición de la pantalla. La función de interrupción también usa la interrupción del temporizador T0 para refrescar la pantalla, llamando a una función en la pantalla. C Los archivos display.h / display.c contienen las funciones para actualizar la pantalla y mostrar la hora Los archivos control.c / h contienen el funciones para configurar la hora y leer los interruptores Los archivos holoclock.c / h son los bucles principales y de inicialización.

Recomendado: