En este artículo, por así decirlo, quiero hablar sobre mi primer proyecto en ingeniería eléctrica. Debo decir que, por mi ocupación, estoy lejos de los circuitos y la electrónica de radio, pero el interés en este tema no me dio descanso desde una edad temprana. Para las personas con experiencia, la siguiente información puede parecer demasiado obvia, y mucho de lo que he hecho es "inventar una bicicleta". Pero quizás algunos novatos, como yo, puedan descubrir algo nuevo e interesante. A quién le importa, por favor, debajo del gato.
Todo comenzó con la idea de hacer una placa de desarrollo para mi pequeña hija. Primero, quería estirar los brazos y hacer algo yo mismo. En segundo lugar, quería estirar mi cerebro y llegar a algo que no está en tableros comunes de este tipo.
Después de observar lo que más le gusta hacer al niño en la vida cotidiana, se decidió que, además de la cadena estándar de manijas, debe agregar botones para presionar y un cierto dispositivo que muestra la reacción al presionar. Como se debería haber mostrado algo simple, pero brillante, la elección recayó en la matriz roja de LED 8x8.
Hasta la creación del juguete, había estado acumulando polvo en el estante Arduino Uno durante un tiempo; estaba esperando hasta que pudiera encontrar algo útil que no fuera un sistema de riego automático de colores, que, además del aburrimiento del campo en sí, era un poco menos de lo que no necesitaba. Pensé que su hora (Arduino) había llegado, porque debes comenzar por algún lado. Después de leer los manuales de la matriz, descubrí que además de no conectarlo al Arduino (solo para eso necesitas 16 pines que no están en mi Arduino), es imposible controlar todos los LED al mismo tiempo. Puede brillar simultáneamente con ciertos diodos en una fila o en una columna (control del cátodo común o ánodo común). Y si hace esto de manera consistente y lo suficientemente rápido, una persona deja de percibir el parpadeo y ve una imagen estable. También aprendí que para Arduino hay controladores y bibliotecas disponibles en el mercado que se toman la molestia de administrar este proceso. Y el hecho de la ausencia de tal controlador en ese momento predeterminó el resultado de todo el proyecto.
Mientras postergaba todo y posponía la elección del mejor lugar para comprar un controlador, me encontré con un artículo sobre el funcionamiento de los sistemas de activación. Para mi cerebro, las humanidades, se ha convertido en un verdadero descubrimiento, dando una comprensión de cómo se organiza la memoria en un nivel primitivo. Luego me pregunté si podría prescindir de Arduino y hacer mi proyecto basado en disparadores y circuitos lógicos.
Entonces, primero tenía que decidir qué mostrar y cómo hacerlo. Estaba claro que era necesario aplicar una señal a su vez a ocho filas de la matriz y para cada iteración aplicar una señal paralela a ciertas columnas. Bueno, eso me dio una comprensión de los tres componentes principales: un generador de impulsos, un convertidor de reloj en ocho señales consecutivas y un convertidor que para cada una de las ocho señales generará una cierta combinación de señales paralelas. No es tan complicado.
Después de pensarlo, se formó un circuito en mi cabeza en el que la señal del reloj se convierte en código binario usando tres disparadores JK conectados en serie y luego, usando circuitos lógicos, en octal. Los detalles sobre este tipo de disparadores se pueden leer al menos en Wikipedia . En resumen, tiene dos entradas (J y K) y dos salidas (Q y Q̄), así como una entrada de sincronización (CLK). Cuando una unidad lógica se alimenta a una de las entradas durante el siguiente pulso de sincronización, la unidad se mostrará en la salida correspondiente y se almacenará en ella independientemente de si el pulso de sincronización se aplica nuevamente y si el valor en la entrada seleccionada cambia, siempre que la segunda entrada permanezca en cero. Si envía una unidad a la segunda entrada y al primer cero, en el siguiente impulso de sincronización, el valor de la primera salida cambiará a cero y el segundo a uno. Pero si se aplica una unidad a ambas entradas de disparo, entonces con cada impulso de sincronización, la unidad aparecerá alternativamente en una de las salidas. Y si toma dos disparadores, aplique un pulso de reloj a la entrada de sincronización del primero, y la señal de la salida Q̄ del primero a la entrada de sincronización del segundo, como resultado, la salida Q1 emitirá uno cada dos ciclos y Q2 cada cuatro. Por lo tanto, se obtiene un contador binario de dos dígitos. Y si agrega el tercer activador de la misma manera, entonces, debido al tercer dígito, puede contar hasta ocho con un código binario; eso es lo que necesita.

Luego, fue necesario crear una tabla de verdad y seleccionar un conjunto de claves lógicas para que el código binario se convirtiera en ocho señales consecutivas. Si, para algunos, la tabla de verdad y las operaciones booleanas son algo nuevo y desconocido, puede leer sobre ellas nuevamente en Wikipedia aquí y aquí .
Parece que la mitad del trabajo está ahí, pero de hecho, no fue tan simple. Cuando armé la primera parte del circuito para la prueba en una placa e imaginé cómo implementar la segunda parte de manera similar, mi fantasía se dibujó durante muchos meses (y tal vez años: el tiempo para dedicarme a un pasatiempo es un poco más de una hora después del trabajo) de dibujar diagramas y compilar tablas de verdad. De hecho, para ocho filas de cada imagen, debe generar una combinación única de columnas. Y cuantas más fotos haya, más monstruoso será el circuito. Me di cuenta de que no funcionaría hacer lo que se pretendía solo con las teclas lógicas. Era necesario buscar algo que pudiera simplificar este proceso.
La solución fue un chip de memoria. Para mi tarea, la EEPROM (memoria de solo lectura programable y borrable eléctricamente) era una buena opción: una memoria programable con la posibilidad de borrado eléctrico con entrada / salida paralela. La memoria tiene cuántas entradas de dirección, que, de hecho, son bits de la dirección binaria de las celdas de memoria. Es decir, si la memoria tiene n entradas de dirección, se pueden programar 2 ^ n celdas. El número de pines de memoria es la llamada "longitud de palabra", o la longitud real de una cadena binaria que se puede escribir en cada celda. El producto del número de celdas por longitud de palabra determina la cantidad de memoria en bits.
La señal de entrada en forma de código binario estaba disponible para mí en la salida de los activadores JK. Queda por complementarlo con bits de los botones, que deberían ser responsables de la salida de diferentes imágenes, y el punto está en el sombrero.
Y nuevamente, la falta de experiencia no me permitió evaluar adecuadamente la complejidad del proceso. Después de todo, la memoria necesita ser programada, y para esto necesita un programador: el dispositivo es significativamente costoso para comprarlo para una nave de juguete única. Buscar en Google demostró que era teóricamente posible hacer esto con el Arduino. Pero para la programación, es necesario suministrar simultáneamente señales tanto a las entradas de dirección del chip de memoria como a las salidas, que posteriormente deberían reproducir la señal. Y también necesitamos señales de control de chips. Es decir, de nuevo más que los pines disponibles. Google adicional me abrió un registro de desplazamiento, un chip que recuerda una secuencia dada de ceros y unos y los muestra en salidas paralelas. A menudo, estos chips también funcionan como un búfer y tienen una salida que puede reproducir secuencialmente las señales de entrada. Es decir, si conecta el siguiente registro al mismo, puede mostrar simultáneamente una secuencia dos veces más grande que una. Al ingresar a la línea, la primera parte pasará por el primer registro como a través de un búfer en el segundo, y el resto permanecerá en el primer registro. Al agregar un tercer registro, puede triplicar la longitud de la cadena, etc. Para implementar esto, tenía que escribir un boceto en un lenguaje de programación desconocido. Pero teniendo algo de experiencia en Python y muchos ejemplos en Internet, después de una serie de prueba y error, esta tarea resultó bastante factible. Sketch se puede tomar en github .
Y ahora el boceto está escrito, el microcircuito está conectado, el lanzamiento y ... nada: la memoria no está programada. Algunas muestras, cambios en la configuración de grabación y ningún resultado. Tenía un microcircuito W27C512-45Z. Una lectura cuidadosa de los manuales mostró un momento desagradable. Para escribir en un contacto específico del microcircuito, es necesario suministrar una corriente de 0.03A con un voltaje de 12V. Pensé que acababa de comprar un chip no tan adecuado. Pero después de desplazarme por los estantes de las tiendas locales de componentes eléctricos, me aseguré de que todos necesitaran 12V. No tenía una fuente de alimentación de laboratorio. Hay muchos bloques de 12V en la casa, pero todos están pulsados, además, la corriente es de aproximadamente 1A. Perdóname, ingenieros experimentados por tal sacrilegio, pero desesperado, decidí intentar ver si un milagro ocurriría con esos bloques que estaban a la mano. No sucedió Los dos primeros pasos de la grabación no produjeron nada, y después del tercer microcircuito, dejó de mostrar signos de vida.
En Internet, encontré referencias a un cierto microcircuito ST662AB, un convertidor de 5V-12V, que, junto con el conjunto correcto de condensadores, debería producir la corriente y el voltaje necesarios. De hecho, no fue fácil encontrar el chip. Como resultado, lo ordené a China, también a SMD. ¿Y qué hay de cuatro a seis semanas de entrega? Bien, aprende. Al desplazarme por los artículos sobre programación de memoria, me encontré con una mención de un chip que se puede programar a 5V. Se trataba del AT28C256. Y, de hecho, en las hojas de datos a ella no se mencionaba 12V. Necesito tomar! Es cierto que el chip para mis necesidades era un poco redundante, ya que me permitía ahorrar 256Kb: una salida de 8 bits para direcciones de 32K, que, teniendo en cuenta los tres pines de dirección ocupados para las señales de sincronización de línea, me permitió codificar hasta 4096 imágenes (10 serían suficientes para mí). Además, la entrega ya debía hacerse desde el Reino Unido. Pero no encontré otras opciones, y al final, la memoria se puede reprogramar, y cuando el juguete ya no es relevante, el chip se puede usar en otro lugar. Así que después de cuatro días tuve un recuerdo. Prueba de croquis y felicidad: todo funciona.
Lo último que queda es decidir cuántos botones habrá, dibujar imágenes de 8x8 e implementar la adición de señales de los botones al circuito. Habiendo estimado el lugar en el tablero, me decidí por cinco botones. Dada la demanda inútil en comparación con el recurso de memoria, la forma más fácil era enviar una señal de cada botón directamente a una entrada separada sin usar ninguna codificación. Es cierto que todavía tenía que resolver el problema de cambiar entre imágenes. Fue posible utilizar botones con fijación de presión. Pero tal implementación no era adecuada para su uso por un niño de un año de edad, porque entonces, antes de presionar el siguiente botón, era necesario presionar el que funcionaba, y era bastante primitivo en sí mismo. Quería idear un esquema para botones sin fijar, en el que se guardaría presionar cada botón, e incluso cancelar la presión del botón anterior. Leí sobre las características del uso de diferentes tipos de desencadenantes, con la esperanza de que algunos de ellos puedan resolver este problema por su cuenta, pero lamentablemente. Después de sentarme un poco con una hoja y un lápiz, se me ocurrió el siguiente diagrama (un ejemplo para tres botones).
Primero, debe conectar todos los botones a un determinado colector, que en la salida dará una unidad cuando haga clic en cualquiera de los botones. Para esto, la tecla OR es adecuada. Como la mayoría de las veces los circuitos clave tienen solo dos entradas, es necesario conectar los primeros dos botones a una tecla, luego conectar su salida a la primera entrada de la segunda tecla y el tercer botón a su segunda entrada. De esta manera, puede continuar conectando más botones, agregando una nueva clave para cada uno posterior. Además, cada botón debe estar conectado a una tecla XOR separada y a la entrada J de un disparador JK separado. Conecte la salida del búfer OR a la segunda entrada de las teclas XOR, y la salida de cada tecla XOR a la entrada K del disparador JK correspondiente. Por lo tanto, al presionar, por ejemplo, el botón 1, se enviará una unidad a J1 y XOR1 no se activará, ya que se le suministra una unidad desde el botón y desde el búfer OR. En la salida Q1, también aparecerá una unidad y se guardará. Al mismo tiempo, XOR2 y XOR3 funcionarán, alimentando una unidad a K2 y K3. Y si en Q2 o Q3 antes había una unidad, cambiará a cero.

Llegar con imágenes de 8x8 también fue una prueba separada. Muy pocos puntos para reproducir una imagen reconocible. Pero encendiendo la fantasía, todavía logró dibujar algunos, por ejemplo, un androide.

Para las imágenes, creé tablas de verdad. Pero dado que uno debe enviar uno para las filas de la matriz y cero para las columnas, la tabla tuvo que invertirse. Escribí el código binario resultante en codificación hexadecimal para un uso más conveniente en el boceto de Arduino.
Para construir todo el circuito, quería pedir un tablero terminado. Pero de la lista de compañías disponibles que ofrecen servicios de fabricación de placas simuladas, me ofrecieron la opción más barata para una junta bilateral por casi $ 25. No lo sé, tal vez sea un costo normal, pero me pareció demasiado. Además, no tengo absolutamente ninguna experiencia en el diseño de diseños. Y encuentro que el proceso de soldadura es muy agradable y relajante. Por lo tanto, compré una placa universal, un rollo de alambre multicolor, los componentes necesarios y me senté en la asamblea durante varias noches. Dado que todos los componentes funcionan con voltaje de 5V a 12V. Para mayor comodidad, hice una batería de 9V.
Aquí se puede ver cómo funciona todo, el esquema completo está disponible en el github .
Como el "corazón" de todo el circuito, utilicé un generador de impulsos. No estaba seguro de qué se necesita exactamente la frecuencia del pulso del reloj, así que utilicé el circuito listo para usar con el ajuste. Desafortunadamente, no tengo un osciloscopio, pero al comparar los ajustes y la hoja de datos del circuito, se usa alrededor de 1KHz. Aquí, el video muestra cómo la frecuencia cambia de menor a mayor, puede ver cómo se dibujan las filas de la matriz.
Gracias por su atencion