Cadeau du bien-aimé pour le 14 février d'un ingénieur en électronique
Lecteur de salutations GT. Pour moi, en tant que personne technique et pas très romantique, choisir un cadeau pour toute occasion est une douleur incroyable. Tout serait simple si ma bien-aimée pouvait donner la RAM à un ordinateur portable ou une diapositive de processeurs, mais elle n'a jamais été une technicienne.Mais depuis: Un cadeau n'est pas aussi cher que l'attention coûte cher - nous allons essayer d'investir dans le temps. Je présente à votre attention "Heart v1.0"
L'idée de base de l'appareil a été inventée collectivement avec mon équipe pour le «sapin de Noël v1.0». En bref, un ensemble de fonctions:- félicitations gravées sur le cœur- alimenté par le chargeur du téléphone (connecteur microUSB)- rétroéclairage RVB avec la possibilité d'enregistrer des profils clignotants qui peuvent être commutés par un bouton- mode veilleuse- mémoire intégrée pour l'enregistrement des salutations. Lorsqu'il est connecté à un PC, il est défini comme un lecteur flash.Après avoir discuté / se réjouissant de la fonctionnalité inhérente, nous avons décidé de le faire - personne ne soupçonnait alors le temps que le cœur nécessiterait ...Le fer
Comme il s'est avéré - la partie la plus simple du cœur. La première étape a été d'élaborer un schéma de structure de l'appareil: des
détails ont été tirés de ceux qui se trouvaient dans notre entrepôt, et ont également été utilisés plus d'une fois dans les appareils. Selon le schéma, nous pouvons dire: le MK le moins cher avec USB à bord STM32F042F6P6, un simple LDO - XC6206P332MR, une mémoire SPI 32 Mbps W25Q32FVSSIG (2 pièces ont été placées sur la carte, mais finalement elles ont soudé une), LED WS2812 contrôlée par RGB28.Diagramme schématique: Le
minimum de détails et l'erreur de calcul la plus importante est l'espoir que le WS2812 fonctionnera normalement à partir du niveau 3,3V (Slavik! Oui, je l'ai fait cent fois ... beaucoup l'ont dit).La planche a été faite de la largeur minimale, afin de la cacher autant que possible sous le bord du cœur. La couleur est blanche. Le résultat obtenu sur la figure.
Feil
Rappelez-vous, j'ai mentionné l'espoir timide que le WS2812 fonctionnera à partir de 3,3 V? Ce ne sera donc pas !!! Plus précisément, tout semblait fonctionner comme avant le début de l'échange via USB. Dans le même temps, le canal bleu a commencé à échouer. Nous avons cherché un problème dans le logiciel pendant longtemps, pensant qu'il n'y avait pas assez de ressources processeur, mais nous avons ensuite tiré la jambe PB1 à 5 V via une résistance de 1 kΩ et tout a fonctionné clairement. Dans le même temps, le niveau de log.1 est devenu environ 4,3 V. Je comprends que ce n'est pas bon, mais il n'y avait pas d'autre choix. Le conseil s'est avéré être une "ferme collective" plutôt élégante:
Soft MK
Pour faciliter la programmation MK, il a été décidé d'utiliser la bibliothèque STM HAL, car presque tout est déjà là, il vous suffit d'ajouter de la logique et de connecter tous ses modules entre eux. En partie, STM32CubeMX nous a aidés à cela - la génération de la plupart du code peut lui être attribuée. Cependant, ici tout le monde décide par lui-même - le code généré devra encore être substantiellement corrigé, et la taille du firmware devra être payée - la bibliothèque HAL n'est pas compacte.Néanmoins, 32 Ko sont disponibles dans notre microcontrôleur, le micrologiciel prendra un peu plus de la moitié, il est donc logique de stocker dans les séquences de mémoire restantes de trois octets (RVB), qui sont transmises tour à tour à l'entrée LED. Appuyez sur le bouton pour faire défiler les séquences enregistrées dans le flash MK.Ici, nous sommes confrontés au premier problème: la LED WS2812 est très exigeante sur la période et la durée des impulsions, tandis que le temps d'impulsion (0,4-0,8 μs) est suffisamment court pour un processeur fonctionnant à 48 MHz. En outre, nous devons tenir compte du fait qu'en plus de contrôler la LED, notre microcircuit devra également assurer la communication avec un PC via USB et lire / écrire la mémoire flash.Heureusement, cette diode est assez populaire et plusieurs méthodes de mise en œuvre de son protocole sont décrites sur Internet, notamment sur les microcontrôleurs STM. Nous avons choisi, peut-être, l'un des plus difficiles en termes d'implémentation, mais aussi en même temps le plus efficace en termes de temps CPU - DMA + timer. Le DMA écrit directement sur le port GPIO, la minuterie contrôle les canaux DMA. Étant donné que DMA écrit sur l'ensemble du port en même temps, il ne fonctionnera pas pour utiliser d'autres broches de port en sortie. C'est pourquoi la broche PB1 a été sélectionnée pour contrôler la LED. Idéologiquement, tout est simple, mais je devrais bricoler à peu près l'implémentation sans la merveilleuse bibliothèque que Martin Hubáček a écrite et publiée sur github. Après un peu de finition sous notre MK et la méthode sélectionnée de stockage des séquences RVB, nous obtenons une LED fonctionnelle.Mémoire flash
Imaginez vous donner un cœur avec une félicitation personnelle. Vous venez, joyeux, à la maison, connectez-le à l'ordinateur et, au lieu de «Love!», Vous donne «Le pilote de périphérique nécessaire n'a pas été trouvé» ou quelque chose comme ça. Ce n'est pas bon.Par conséquent, le cœur doit être reconnu comme un lecteur flash dans l'un des systèmes d'exploitation courants, sans nécessiter l'installation de pilotes. Par conséquent, nous utiliserons la classe USB appelée «périphérique de stockage de masse», car la bibliothèque de périphériques USB STM32 nous fournit une solution clé en main. Arrête ça! Prêt ???? Voyons maintenant.Nous créons un projet dans STM32CubeMX, combinons les méthodes de lecture / écriture pour la mémoire flash spi avec les appels correspondants dans le module de stockage de masse USB et trouvons deux problèmes à la fois: le lecteur flash USB ne veut pas être retiré en toute sécurité et "s'étouffe" en essayant d'écrire quelque chose de plus que "Bonjour World ”dans le fichier README.txt.Le premier problème est facile à résoudre - vous devez implémenter le traitement SCSI manquant de la commande StartStopUnit. La seconde est plus difficile à résoudre. La taille des blocs du système de fichiers (naturellement, n'ayant que 8 Mo d'espace, nous utiliserons Fat16) est de 512 octets. La mémoire ne peut être effacée que par blocs de 4k. Nous devrons réserver l'un des blocs pour le stockage temporaire (nous ne pouvons pas nous permettre 4 Ko de RAM avec les 6 Ko disponibles). Autrement dit, pour écrire 512 octets, vous devez copier 4 Ko, effacer 4 Ko et les recopier. De plus, si le fichier est suffisamment volumineux, le système d'exploitation veut écrire sur le disque 64 Ko à la fois, et notre contrôleur n'est pas en mesure de gérer une telle quantité de données pour lui au bon moment, étant donné que le lecteur flash utilisé n'est pas non plus le plus rapide. En généraltandis que le contrôleur écrit lentement des données 256 octets à la fois (la taille de la page de mémoire), le système d'exploitation (au moins Fedora, sur lequel tout cela a été testé) parvient déjà à décider que le lecteur est mort le brave.Les connaisseurs indiqueront probablement une solution plus élégante au problème, mais "nous irons dans l'autre sens". La mémoire flash sera lue via l'interface du périphérique de stockage de masse et dans ce mode, elle se positionnera en lecture seule (en même temps, le cœur peut être facilement «retiré» de l'ordinateur sans aucune «extraction sûre», mais en ayant peur de gâcher le système de fichiers), nous l'écrirons via un port de communication virtuel (alias Communication Device Class). Grâce à la même interface, nous écrirons nos séquences RVB à la fin de la mémoire MK.Le mode de démarrage (stockage de masse ou cdc) sera sélectionné lors du chargement en appuyant sur le bouton (ou non).Aussitôt dit, aussitôt fait (comme toujours, la plupart du temps et le café était consacré à ces deux mots). Nous renvoyons la lecture-écriture à l'interface MSC, car il est découvert qu'en mode lecture seule, macOs refuse de reconnaître le lecteur flash USB - peu importe, ici nous trichons le système d'exploitation et retournerons le «succès» à toute demande d'écriture sans rien faire (encore une fois, une solution de la catégorie «bien que pas élégant, mais bon marché et gai»). Le point est petit - un logiciel pour PC.PC souple
Comme il a été décidé de configurer et de flasher via l'interface cdc, vous ne pouvez tout simplement pas faire glisser et déposer des fichiers avec la souris et vous avez besoin d'une application spéciale qui pourra le faire. Sa tâche principale: donner à l'utilisateur la possibilité de créer une image disque, d'y télécharger des fichiers utilisateur et d'écrire cette image dans la mémoire flash. L'application doit également fournir une interface pour créer / lire / écrire des séquences RVB.L'application doit être multiplateforme, et ici la bibliothèque Qt pour créer une interface graphique et ChaN FatFS pour créer et gérer une image disque viennent à notre aide. L'échange de données avec l'appareil via le port com est disponible dans Qt des dernières versions «prêtes à l'emploi» (module QSerialPort), pour les opérations d'image disque, nous utilisons QTreeView avec un modèle d'élément hérité de QabstractItemModel, dans lequel les opérations de glisser-déposer sont également implémentées (glisser-déposer, quoi que vous disiez) avec une souris "est pratique et familier en ce qui concerne les fichiers / dossiers). Pour créer des séquences RVB, vous pouvez utiliser QListWidget (pour afficher la séquence de couleurs), la bibliothèque QtColorWidgets (par Mattia Basaglia) pour choisir les couleurs et la classe QEasingCurve intégrée à Qt pour des transitions fluides (ou inversement spasmodiques) entre les couleurs et créer un effet arc-en-ciel.Résultat: l'application a deux onglets:1) «Stockage» pour les fichiers
2) «LED» pour gérer les séquences RVB
Dialogue pour créer des séquences RVB: Le
dialogue fonctionne en trois modes:a) RVB - vous permet de spécifier des transitions entre deux couleurs spécifiées en notation RVB.b) HSV - la même chose, mais en notation HSV - le débordement est plus familier à l'œil humain, en particulier, le mode "HSV" + "Itérer-> HUE" vous permet de créer des arcs-en-ciel.c) Personnalisé - ce mode vous permet de définir manuellement chaque couleur de la séquence. Il est impossible de faire de grandes séquences comme celle-ci, mais il est très pratique d'éteindre votre cœur pendant un certain temps (en définissant la couleur sur "noir").Et enfin, la définition de notre appareil comme un lecteur flash sous Windows / macOs / Linux (Gnome):


Conclusion
Et après tout le travail effectué et le texte écrit, j'ai constaté que je n'avais pas pris une seule photo normale du cœur lui-même. Par conséquent, je joins l'option «comment ça s'est passé»:
en réalité, cela a fière allure (surtout avec la gravure). Aimez vos proches !!! Source: https://habr.com/ru/post/fr401013/
All Articles