Mostramos un marco de fotos digital en Internet
Probablemente muchos, al mirar el marco de fotos digital, pensaron si es posible mostrar su propia información que varía con el tiempo. Como he sido propietario del marco de fotos durante varios años, se me ocurrió una idea así: el marco sería perfecto para mostrar pronósticos del tiempo e información de la "casa inteligente". Sobre cómo implementar dicha funcionalidad sin interferir con el diseño del marco, lea debajo del gato.Métodos de implementación
La forma más fácil de controlar la imagen que se muestra en el marco de fotos digital es simplemente cambiar las imágenes preparadas previamente almacenadas en su memoria de la manera correcta. Aquí hay un ejemplo de implementación de este método. Obviamente, este método no es muy flexible: puede mostrar un solo número variable y el proceso de cambiar este número será bastante lento.Por lo tanto, siempre que sea imposible desmontar el marco, solo queda usar sus interfaces de memoria externa: SPI (para trabajar con la tarjeta SD) y USB. Es suficiente hacer un dispositivo que simule una unidad externa, conectarlo al marco, y él mismo solicitará imágenes de dicho dispositivo. Usar un microcontrolador para emular una tarjeta SD es bastante difícil, y el factor de forma de la tarjeta en sí es bastante difícil de repetir. Se podría usar una tarjeta SD WiFi ya preparada, pero todas esas tarjetas que conozco eran demasiado caras (> $ 40, lo que está cerca del costo del marco en sí).El uso de USB para resolver este problema es más adecuado: no es un problema encontrar un microcontrolador productivo con soporte USB; La conexión al marco se realiza mediante un conector estándar. Además, ya había una publicación sobre Habrédedicado a emular una unidad USB utilizando el microcontrolador stm32. Los comentarios sobre este artículo discutieron la posibilidad de transferir datos que cambian dinámicamente por este método. Debido al almacenamiento en caché de datos del sistema operativo al leer un archivo, no tiene sentido cambiar el contenido de los archivos emulados; el sistema operativo simplemente no los solicitará, ya que no podrá descubrir que han cambiado. Sin embargo, los marcos de fotos no almacenan en caché los archivos (¡simplemente no tienen la cantidad correcta de RAM)! Puede verificar esto conectando cualquier unidad flash USB al marco de fotos, con un LED parpadeando al leer archivos; parpadeará constantemente al leer los archivos. Por lo tanto, decidí usar este método en particular.Parte de software
Ya tenía la placa de depuración STM32F4DISCOVERY, así que decidí verificar el funcionamiento de la biblioteca emfat propuesta en el artículo anterior. No hubo problemas con Windows 7, pero el marco de fotos no pudo detectar los archivos en el disco "virtual". Como resultó más tarde, la tableta Android tampoco detectó la unidad. Otra computadora Ubuntu detectó un dispositivo USB pero no pudo montar la unidad.Tuve que abordar el problema más profundamente. Al final resultó que, a pesar del hecho de que Windows detectó el disco y podía leer archivos de él, TestDisk no pudo determinar el sistema de archivos en él:
Poco a poco, al estudiar los resultados de los datos brutos proporcionados por TestDisk, así como a profundizar en el código fuente de este programa, me di cuenta de que uno de los criterios por los cuales TestDisk determina el sistema de archivos utilizado es el tamaño del disco. En emfat, el tamaño del disco emulado depende de la cantidad de datos que contiene. Por lo tanto, si hay uno o varios archivos pequeños en el disco, el tamaño del disco no excederá los 16 MB. Al mismo tiempo, FAT32 impone restricciones en el tamaño de volumen mínimo: al menos 65527 clústeres. Teniendo en cuenta que en "emfat" un clúster ocupa 4096 bytes, entonces, para cumplir con FAT32, el tamaño del disco debe ser 65527 * 4096 ~ 268Mb. En realidad, esto no es así, lo que causa errores al determinar el tipo de sistema de archivos. Un intento de aumentar la capacidad del disco al aumentar el volumen del archivo emulado a 400 MB no funcionó, quizás algo más no encajaba allí.Así que decidí rehacer "emfat" para emular el sistema de archivos FAT16.En última instancia, esto tuvo éxito, y la unidad comenzó a ser detectada correctamente por todos los dispositivos:
Vale la pena señalar que FAT16 también tiene una limitación en el tamaño del disco: al menos 4087 grupos, es decir, 16 MB en este caso. Para cumplir con esta condición, es necesario crear un archivo virtual de 20 MB en emfat.La verificación con el marco de la foto salió bien: el marco mostró con éxito la imagen de prueba almacenada en la memoria Flash del controlador. El siguiente paso es mostrar imágenes personalizadas. La forma más fácil de emular archivos BMP es que tienen una estructura bastante simple, la imagen puede ser de 256 colores, es decir Hay un byte por píxel. Pero solo en este caso, necesita 480 KB de RAM para almacenar una imagen de tamaño 800 * 600. El microcontrolador no tiene esa capacidad de memoria, lo que significa que solo queda una opción: formar la imagen sobre la marcha. El principio de funcionamiento es el siguiente: en el caso de que el dispositivo host solicite datos de un archivo desde la unidad, emfat llama a la función de devolución de llamada correspondiente a este archivo. El número del sector desde el que se solicitan los datos y el puntero por el cual se deben escribir estos datos se transfieren a esta función. Conociendo el número de sector,puede determinar qué parte de la imagen se solicita y formarla.Durante los experimentos, se descubrió un hecho desagradable: Windows puede solicitar datos de sectores fuera de servicio. No está claro por qué se hace esto, pero esto complica la formación de la imagen sobre la marcha, ya que es necesario, pero para calcular el número de sector, qué datos se solicitan en este momento. Otro problema es que las líneas en los archivos BMP van de abajo hacia arriba, lo que complica aún más el cálculo de la posición.Para mostrar el texto, utilicé la biblioteca mcufont . Es conveniente porque le permite usar fuentes comprimidas, lo que reduce significativamente el uso de la memoria Flash. Como utilicé fuentes lo suficientemente grandes, esta característica es bastante importante.Esta biblioteca escribe directamente la imagen generada en la memoria, por lo que para que la biblioteca funcione, debe asignar una matriz separada en la RAM.También implementé la representación de imágenes desde la memoria del controlador. Todas las imágenes, como el texto, se muestran en blanco y negro, debido a lo cual se puede almacenar información sobre 8 píxeles en un byte de la imagen. Para convertir las imágenes ordinarias en una vista adecuada para conectarse a un proyecto, se utilizó el programa LCD Assistant .Como resultado, se forma una imagen de la siguiente forma en la unidad USB conectada:Después de probar el programa en STM32F4DISCOVERY, hice el dispositivo en sí, que es un microcontrolador con un módulo WiFi conectado al ESP8266. De los adecuados, solo tenía el controlador STM32F107RCT7.El circuito del dispositivo resultante resultó ser bastante simple: pero debido a las restricciones en el tamaño de la placa (17x36 mm (planeé instalarlo en la carcasa terminada) y el gran tamaño del controlador, la placa de circuito impreso no era la más fácil de fabricar, de doble cara, con piezas montadas en ambos lados. Al mismo tiempo, algunas líneas eléctricas tuvieron que hacerse con un cable. Vista de la placa resultante (durante la depuración con el módulo ESP-01):
Con los tamaños de placa indicados, el módulo WiFi ESP-03 fue el más adecuado. Así es como se ve la placa resultante con el módulo ya instalado: y desde el lado del controlador: durante los experimentos, resultó que la sensibilidad de la antena de cerámica claramente no era suficiente: el módulo apenas estaba conectado al enrutador. Después de conectar un cable de 31 mm al pin WIFI_ANT, la sensibilidad mejoró notablemente y se volvió similar a la sensibilidad del ESP-01. El lugar donde el marco de fotos está instalado permanentemente está a pocos metros del enrutador, y la antena nativa del módulo también funciona normalmente, por lo que no hay antena adicional en la foto.
Como el ESP8266 estaba bastante caliente durante el funcionamiento constante, decidí encenderlo solo durante las solicitudes de información. La administración de energía se puede hacer usando la salida del módulo CH_PD. Establecer este pin a 0 hace que el ESP8266 entre en modo de bajo consumo.Para que sea más conveniente probar el funcionamiento del ESP8266, escribí un firmware separado para el microcontrolador que implementa el puente USB-UART. Es a través de él que el módulo está configurado para funcionar con el enrutador, de modo que después de encenderlo, el ESP8266 se conecta automáticamente a él.El principio de funcionamiento del dispositivo resultante es bastante simple: cada 10 minutos, el controlador intenta solicitar datos del servidor y, si tiene éxito, actualiza los datos meteorológicos. Los datos sobre la temperatura actual y el pronóstico con 3 días de anticipación se toman del sitio web openweathermap.org, la información sobre la temperatura exterior e interior del balcón se toma del servidor de majordomo. Al mismo tiempo, el marco de fotos solicita una imagen cada 6 segundos, mientras muestra la información actual. Dado que ambos procesos pueden ocurrir simultáneamente, DMA se utiliza para recibir datos del ESP8266.Como resultado, se muestra la siguiente imagen en el marco de la foto: Código fuente del proyecto: github.com/iliasam/USB_Photoframe
Source: https://habr.com/ru/post/es384177/
All Articles