Regalo del amado para el 14 de febrero de un ingeniero electrónico

Saludos GT lector. Para mí, como persona técnica y poco romántica, elegir un regalo para cualquier ocasión es un dolor increíble. Todo sería simple si mi amado pudiera darle la RAM a una computadora portátil o una diapositiva de procesadores, pero nunca fue una experta en tecnología.

Pero como: un regalo no es tan caro como la atención es cara (s), trataremos de invertir en tiempo. Les presento a su atención "Heart v1.0"



La idea básica del dispositivo fue inventada colectivamente con mi equipo para el "Árbol de Navidad v1.0". Brevemente, un conjunto de funciones:

- felicitación grabada en el corazón
- energía del cargador del teléfono (conector microUSB)
- Luz de fondo RGB con la capacidad de grabar perfiles parpadeantes que se pueden cambiar con un botón
- modo de luz nocturna
- memoria incorporada para grabar saludos. Cuando se conecta a una PC, se define como una unidad flash.

Después de discutir / alegrarnos por la funcionalidad inherente, decidimos hacerlo; nadie sospechó qué gastos de tiempo requeriría el corazón ...

Hierro


Al final resultó que - la parte más simple del corazón. El primer paso fue elaborar un diagrama estructural del dispositivo:



se tomaron detalles de los que estaban en nuestro almacén y también se usaron más de una vez en los dispositivos. De acuerdo con el esquema, podemos decir: el MK más barato con USB a bordo STM32F042F6P6, un LDO simple - XC6206P332MR, memoria SPI de 32Mbps W25Q32FVSSIG (se colocaron 2 piezas en la placa, pero terminaron soldando una), LED WS2812 controlado por RGB28.

Diagrama esquemático: el



mínimo de detalles y el error de cálculo más importante es la esperanza de que el WS2812 funcione normalmente desde el nivel de 3.3V (¡Slavik! Sí, lo hice cien veces ... muchos dijeron).

El tablero estaba hecho del ancho mínimo, para ocultarlo lo más posible bajo el borde del corazón. El color es blanco. El resultado obtenido en la figura.



Feil


¿Recuerdas que mencioné la tímida esperanza de que el WS2812 funcionará desde 3.3V? ¡Entonces no será! Más precisamente, todo parecía funcionar como antes del inicio del intercambio a través de USB. Al mismo tiempo, el canal azul comenzó a fallar. Buscamos un problema en el software durante mucho tiempo, pensando que no había suficientes recursos de procesador, pero luego extrajimos la pata PB1 a 5V a través de una resistencia de 1kΩ y todo funcionó claramente. Al mismo tiempo, el nivel de log.1 se convirtió en aproximadamente 4.3V. Entiendo que esto no es bueno, pero no había otra opción. La junta resultó ser una "granja colectiva" bastante elegante:



Soft MK


STM HAL Library, , . , , STM32CubeMX — . — , — HAL .

, 32, , (R-G-B), . , .

Aquí nos enfrentamos con el primer problema: el LED WS2812 es muy exigente en el período y la duración de los pulsos, mientras que el tiempo de pulso (0.4-0.8 μs) es lo suficientemente pequeño para un procesador que funciona a 48 MHz. Además, debemos tener en cuenta que, además de controlar el LED, nuestro microcircuito también tendrá que mantener la comunicación con una PC a través de USB y leer / escribir memoria flash.
Afortunadamente, este diodo es bastante popular y se describen varios métodos para implementar su protocolo en Internet, incluidos los microcontroladores STM. Hemos elegido, quizás, uno de los más difíciles en términos de implementación, pero también al mismo tiempo el más efectivo en términos de tiempo de CPU: el temporizador DMA +. DMA escribe directamente en el puerto GPIO, el temporizador controla los canales DMA. Dado que DMA escribe en todo el puerto a la vez, no funcionará usar otros pines del puerto como salida. Es por eso que se seleccionó el pin PB1 para controlar el LED. Ideológicamente, todo es simple, pero tendría que jugar con la implementación más o menos si no fuera por la maravillosa biblioteca que Martin Hubáček escribió y publicó en github. Después de terminar un poco con nuestro MK y el método seleccionado para almacenar secuencias RGB, obtenemos un LED que funciona.

Memoria flash


Imagina darte un corazón con una felicitación personal. Vienes, alegre, a casa, conéctalo a la computadora y, en lugar de "¡Te amo!", Te da "No se encontró el controlador de dispositivo necesario" o algo así. No es bueno

Por lo tanto, el corazón debe reconocerse como una unidad flash en cualquiera de los sistemas operativos comunes, sin requerir la instalación de controladores. Por lo tanto, utilizaremos la clase usb llamada "Dispositivo de almacenamiento masivo", ya que la Biblioteca de dispositivos USB STM32 nos proporciona una solución llave en mano. Basta! Listo ???? Ahora veamos.

Creamos un proyecto en STM32CubeMX, combinamos los métodos de lectura / escritura para memoria flash spi con las llamadas correspondientes en el módulo de almacenamiento masivo usb y encontramos dos problemas a la vez: la unidad flash USB no quiere ser removida de manera segura y se "ahoga" cuando intenta escribir algo más que "Hola Mundo "en el archivo README.txt.

El primer problema es fácil de resolver: debe implementar el procesamiento SCSI que falta del comando StartStopUnit. El segundo es más difícil de resolver. El tamaño del bloque del sistema de archivos (naturalmente, con solo 8 MB de espacio, usaremos Fat16) es de 512 bytes. La memoria solo se puede borrar en bloques de 4k. Tendremos que reservar uno de los bloques para el almacenamiento temporal (no podemos permitirnos 4kb de RAM con los 6kb disponibles). Es decir, para escribir 512 bytes, debe copiar 4 kb, borrar 4 kb y volver a copiarlos. Además, si el archivo es lo suficientemente grande, el sistema operativo quiere escribir en la unidad de disco de 64kB a la vez, y nuestro controlador no puede manejar una cantidad tan grande de datos en el momento adecuado, dado que la unidad flash utilizada tampoco es la más rápida. En generalMientras que el controlador escribe lentamente datos de 256 bytes a la vez (el tamaño de la página de memoria), el sistema operativo (al menos Fedora, en el que se probó todo esto) ya se las arregla para decidir que la unidad ha muerto.

Los entendidos probablemente indicarán una solución más elegante al problema, pero "iremos por el otro lado". La memoria flash se leerá a través de la interfaz del dispositivo de almacenamiento masivo y en este modo se posicionará como de solo lectura (al mismo tiempo, el corazón se puede "extraer" fácilmente de la computadora sin ninguna "extracción segura", pero teniendo miedo de estropear el sistema de archivos), lo escribiremos a través del puerto de comunicación virtual (también conocido como Clase de dispositivo de comunicación). A través de la misma interfaz, escribiremos nuestras secuencias RGB al final de la memoria MK.

El modo de arranque (almacenamiento masivo o cdc) se seleccionará al cargar presionando el botón (o no).
Apenas dicho que hecho (como siempre, la mayor parte del tiempo y el café se gastaron en estas dos palabras). Devolvemos la lectura-escritura a la interfaz MSC, porque se descubre que en modo de solo lectura macOs se niega a reconocer la unidad flash USB; no importa, aquí engañamos al sistema operativo y devolvemos "éxito" a cualquier solicitud de escritura sin hacer nada (nuevamente, una solución de la categoría de "aunque no elegante, pero barato y alegre"). El punto es pequeño: software para PC.

PC blanda


Como se decidió configurar y flashear a través de la interfaz cdc, simplemente no puede arrastrar y soltar archivos con el mouse y necesita una aplicación especial que pueda hacer esto. Su tarea principal: proporcionar al usuario la oportunidad de crear una imagen de disco, cargar archivos de usuario allí y escribir esta imagen en la memoria flash. La aplicación también debe proporcionar una interfaz para crear / leer / escribir secuencias RGB.

La aplicación debe ser multiplataforma, y ​​aquí la biblioteca Qt para crear una interfaz gráfica y ChaN FatFS para crear y administrar una imagen de disco nos ayudan. El intercambio de datos con el dispositivo a través del puerto com está disponible en Qt de las últimas versiones "listo para usar" (módulo QSerialPort), para las operaciones de imagen de disco usamos QTreeView con un modelo de elemento heredado de QabstractItemModel, en el que las operaciones de arrastrar y soltar se implementan adicionalmente (arrastrar y soltar, lo que usted diga) con un mouse "es conveniente y familiar cuando se trata de archivos / carpetas). Para crear secuencias RGB, puede usar QListWidget (para mostrar la secuencia de colores), la biblioteca QtColorWidgets (de Mattia Basaglia) para elegir colores y la clase QEasingCurve integrada en Qt para transiciones suaves (o viceversa espasmódicas) entre colores y crear un efecto de arco iris.

Resultado: la aplicación tiene dos pestañas:

1) “Almacenamiento” para archivos



2) “LED” para administrar secuencias RGB



Diálogo para crear secuencias RGB: El



diálogo funciona en tres modos:

a) RGB: le permite especificar transiciones entre dos colores especificados en notación RGB.
b) HSV - lo mismo, pero en notación HSV - el desbordamiento es más familiar para el ojo humano, en particular, el modo "HSV" + "Iterate-> HUE" le permite crear arcoíris.
c) Personalizado: este modo le permite configurar cada color de la secuencia manualmente. Es imposible hacer secuencias grandes como esta, pero es muy conveniente sacar tu corazón por un tiempo (establecer el color en "negro").

Y finalmente, la definición de nuestro dispositivo como una unidad flash en Windows / macOs / Linux (Gnome):







Conclusión


Y después de todo el trabajo realizado y el texto escrito, descubrí que no había tomado una sola foto normal del corazón mismo. Por lo tanto, estoy adjuntando la opción "cómo sucedió":





en realidad, se ve muy bien (especialmente con el grabado). ¡Ama a tus seres queridos!

Source: https://habr.com/ru/post/es401013/


All Articles