Nous affichons un cadre photo numérique sur Internet
Probablement, en regardant le cadre photo numérique, beaucoup se sont demandé s'il était possible d'afficher leurs propres informations qui varient dans le temps? Depuis que je suis propriétaire du cadre photo depuis plusieurs années, une telle idée m'est venue à l'esprit - le cadre serait parfait pour afficher les prévisions météorologiques et les informations de la «maison intelligente». Sur la façon de mettre en œuvre une telle fonctionnalité, sans interférer avec la conception du cadre - lire sous le chat.Méthodes d'implémentation
Le moyen le plus simple de contrôler l'image affichée sur le cadre photo numérique est simplement de changer les images pré-préparées stockées dans sa mémoire de la manière nécessaire. Voici un exemple d' implémentation de cette méthode. De toute évidence, cette méthode n'est pas très flexible - vous pouvez afficher un seul nombre variable, et le processus de modification de ce nombre sera assez lent.Ainsi, à condition qu'il soit impossible de démonter le cadre, il ne reste plus qu'à utiliser ses interfaces de mémoire externe - SPI (pour travailler avec la carte SD) et USB. Il suffit de fabriquer un appareil qui simule un lecteur externe, de le connecter au châssis - et il demandera lui-même des images à un tel appareil. L'utilisation d'un microcontrôleur pour émuler une carte SD est assez difficile, et le facteur de forme de la carte elle-même est assez difficile à répéter. On pourrait utiliser une carte SD WiFi prête à l'emploi, mais toutes ces cartes que je connais étaient trop chères (> 40 $, ce qui est proche du coût du cadre lui-même).Utiliser l'USB pour résoudre ce problème est plus approprié - ce n'est pas un problème de trouver un microcontrôleur productif avec prise en charge USB; la connexion au châssis est réalisée par un connecteur standard. De plus, il y avait déjà une publication sur Habrédédié à l'émulation d'une clé USB à l'aide du microcontrôleur stm32. Les commentaires sur cet article ont discuté de la possibilité de transférer des données à changement dynamique par cette méthode. En raison de la mise en cache des données du système d'exploitation lors de la lecture d'un fichier, cela n'a aucun sens de changer le contenu des fichiers émulés - le système d'exploitation ne les demandera tout simplement pas, car il ne pourra pas découvrir qu'ils ont changé. Cependant, les cadres photo ne mettent pas les fichiers en cache (ils n'ont tout simplement pas la bonne quantité de RAM)! Vous pouvez le vérifier en connectant n'importe quelle clé USB au cadre photo, avec une LED clignotante lors de la lecture des fichiers - elle clignotera constamment lors de la lecture des fichiers. Par conséquent, j'ai décidé d'utiliser cette méthode particulière.Partie logiciel
J'avais déjà la carte de débogage STM32F4DISCOVERY, j'ai donc décidé de vérifier le fonctionnement de la bibliothèque emfat proposée dans l'article ci-dessus. Il n'y a eu aucun problème avec Windows 7, mais le cadre photo n'a pas pu détecter les fichiers sur le disque «virtuel». Comme il s'est avéré plus tard, la tablette Android n'a pas non plus détecté le lecteur. Un autre ordinateur Ubuntu a détecté un périphérique USB mais n'a pas pu monter le lecteur.J'ai dû m'attaquer plus profondément au problème. En fin de compte, malgré le fait que Windows ait détecté le lecteur et puisse y lire des fichiers, TestDisk n'a pas pu déterminer le système de fichiers sur celui-ci:
Petit à petit, en étudiant les résultats des données brutes fournies par TestDisk, ainsi qu'en fouillant dans le code source de ce programme, j'ai réalisé que l'un des critères selon lesquels TestDisk détermine le système de fichiers utilisé est la taille du disque. Dans emfat, la taille du disque émulé dépend de la quantité de données qu'il contient. Ainsi, s'il y a un ou plusieurs petits fichiers sur le disque, la taille du disque ne dépassera pas 16 Mo. Dans le même temps, FAT32 impose des restrictions sur la taille minimale du volume - au moins 65527 grappes. Étant donné que dans «emfat», un cluster occupe 4096 octets, alors pour la conformité FAT32, la taille du disque doit être de 65527 * 4096 ~ 268 Mo. En réalité, ce n'est pas le cas, ce qui provoque des erreurs dans la détermination du type de système de fichiers. Une tentative d'augmenter la capacité du disque en augmentant le volume du fichier émulé à 400 Mo n'a pas fonctionné - peut-être que quelque chose d'autre ne convenait pas.J'ai donc décidé de refaire "emfat" pour émuler le système de fichiers FAT16.En fin de compte, cela a réussi et le lecteur a commencé à être correctement détecté par tous les appareils:
il convient de noter que FAT16 a également une limitation de la taille du disque - au moins 4087 clusters, soit 16 Mo dans ce cas. Pour remplir cette condition, il est nécessaire de créer un fichier virtuel de 20 Mo dans emfat.La vérification avec le cadre photo s'est bien passée - le cadre a correctement affiché l'image de test stockée dans la mémoire flash du contrôleur. L'étape suivante consiste à afficher des images personnalisées. La façon la plus simple d'émuler des fichiers BMP est qu'ils ont une structure assez simple, l'image peut être 256 couleurs, c'est-à-dire il y a un octet par pixel. Mais seulement dans ce cas, vous avez besoin de 480 Ko de RAM pour stocker une image de taille 800 * 600. Le microcontrôleur n'a pas une telle capacité de mémoire, ce qui signifie qu'il ne reste qu'une seule option - pour former l'image à la volée. Le principe de fonctionnement est le suivant - dans le cas où le périphérique hôte demande des données à partir d'un fichier du lecteur, emfat appelle la fonction de rappel correspondant à ce fichier. Le numéro du secteur à partir duquel les données sont demandées et le pointeur par lequel ces données doivent être écrites sont transférés vers cette fonction. Connaître le numéro de secteur,vous pouvez déterminer quelle partie de l'image est demandée et la former.Au cours des expériences, un fait désagréable a été découvert: Windows peut demander des données à des secteurs en panne. La raison pour laquelle cela est fait n'est pas claire, mais cela complique la formation de l'image à la volée, car il est nécessaire mais de calculer le numéro de secteur - quelle donnée est actuellement demandée. Un autre problème est que les lignes dans les fichiers BMP vont de bas en haut, ce qui complique encore le calcul de la position.Pour afficher le texte, j'ai utilisé la bibliothèque mcufont . Il est pratique car il vous permet d'utiliser des polices compressées, ce qui réduit considérablement l'utilisation de la mémoire Flash. Puisque j'ai utilisé des polices suffisamment grandes, cette fonctionnalité est très importante.Cette bibliothèque écrit directement l'image générée dans la mémoire, donc pour que la bibliothèque fonctionne, vous devez allouer un tableau séparé dans la RAM.J'ai également implémenté le rendu des images de la mémoire du contrôleur. Toutes les images, comme le texte, sont affichées en noir et blanc, grâce à quoi des informations sur 8 pixels peuvent être stockées dans un octet de l'image. Afin de convertir des images ordinaires en une vue adaptée à la connexion à un projet, le programme LCD Assistant a été utilisé .Par conséquent, une image de la forme suivante est formée sur le lecteur USB connecté:Après que le programme a été testé sur STM32F4DISCOVERY, j'ai fabriqué l'appareil lui-même, qui est un microcontrôleur avec un module WiFi connecté à l'ESP8266. Parmi ceux qui convenaient, je n'avais que le contrôleur STM32F107RCT7.Le circuit de l'appareil résultant s'est avéré assez simple: mais en raison des restrictions sur la taille de la carte - 17x36 mm (j'avais prévu de l'installer dans le boîtier fini) et de la grande taille du contrôleur, la carte de circuit imprimé n'était pas la plus facile à fabriquer - double face, avec des pièces montées des deux côtés. En même temps, certaines lignes électriques devaient être réalisées avec un fil. Vue de la carte résultante (lors du débogage avec le module ESP-01):
Avec les tailles de carte indiquées, le module WiFi ESP-03 était le plus adapté. Voici à quoi ressemble la carte résultante avec le module déjà installé: Et du côté du contrôleur: Au cours des expériences, il s'est avéré que la sensibilité de l'antenne en céramique n'était clairement pas suffisante - le module à peine connecté au routeur. Après avoir connecté un morceau de fil de 31 mm à la broche WIFI_ANT, la sensibilité s'est nettement améliorée et est devenue similaire à la sensibilité de l'ESP-01. L'endroit où le cadre photo est installé en permanence est à quelques mètres du routeur, et l'antenne native du module fonctionne également normalement, il n'y a donc pas d'antenne supplémentaire sur la photo.
Comme l'ESP8266 était assez chaud en fonctionnement constant, j'ai décidé de l'allumer uniquement lors des demandes d'informations. La gestion de l'alimentation peut être effectuée à l'aide de la sortie du module CH_PD. Régler cette broche sur 0 fait passer l'ESP8266 en mode basse consommation.Afin de rendre plus pratique le test du fonctionnement de l'ESP8266, j'ai écrit un firmware séparé pour le microcontrôleur qui implémente le pont USB-UART. C'est à travers lui que le module est configuré pour fonctionner avec le routeur, de sorte qu'après la mise sous tension, l'ESP8266 s'y connecte automatiquement.Le principe de fonctionnement de l'appareil résultant est assez simple - toutes les 10 minutes, le contrôleur essaie de demander des données au serveur, et s'il réussit, il met à jour les données météorologiques. Les données sur la température actuelle et les prévisions pour 3 jours à l'avance sont extraites du site openweathermap.org, les informations sur la température extérieure et intérieure du balcon proviennent du serveur majordomo. Dans le même temps, le cadre photo demande une image toutes les 6 secondes, tout en affichant les informations actuelles. Étant donné que les deux processus peuvent se produire simultanément, le DMA est utilisé pour recevoir des données de l'ESP8266.Par conséquent, l'image suivante s'affiche sur le cadre photo: Code source du projet: github.com/iliasam/USB_Photoframe
Source: https://habr.com/ru/post/fr384177/
All Articles