We pump Ikea: comment transformer la musique légère en Big Brother


introduction


Ikea est un magasin curieux. Même si vous y êtes entré avec l'intention d'acheter une chose spécifique et de ne pas être distrait par tout le reste de la camelote, vous sortirez en achetant trois fois plus que nécessaire. Pour nous les pirates, cet effet est particulièrement évident dans le département Ikea avec des câbles d'alimentation ou des batteries.

Pour moi, le dernier cas d'une telle folie s'est produit aux Pays-Bas. J'étais sur un voyage prévu, prévoyant de passer seulement quelques semaines dans le pays. Cependant, c'était au tout début de 2020 et la catastrophe de COVID-19 ... J'ai dû rester loin de mon laboratoire beaucoup plus longtemps.

Et quand j'ai vu la gamme de produits électroniques de Frekevens chez Ikea , je n'ai pas pu m'en empêcher et j'ai tout acheté.

Pour ceux qui ne le savent pas: la ligne Ikea Frekvens devrait devenir un analogue moderne de l'ensemble Hi-Fi old-school plus l'ensemble de musique léger hexagonal, qui semble être dans les maisons de la moitié des adolescents des années 90. Dans ce cas, la gamme d'appareils connectés les uns aux autres se compose d'un haut-parleur Bluetooth pour la sortie audio et d'un projecteur LED (complété par diverses buses) qui scintillent au rythme de la musique, ainsi qu'un affichage à cube LED pouvant afficher des animations qui se déplacent également dans la musique. Ikea se targue que cette ligne a été développée en collaboration avec Teenage Engineering, connue pour sa série Pocket Operator de synthétiseurs portables "jouets".


Comme le montre la vidéo promotionnelle Ikea, l'achat final de dizaines d'appareils devrait ressembler à un carnaval scintillant insupportable, ce que mon adolescent de 15 ans ne voudrait pas organiser dans sa chambre.

J'étais particulièrement intéressé par l'affichage LED cube: c'est un appareil intégré de haute qualité qui fonctionne sur le secteur. Sur le panneau avant se trouve une matrice de 16 lignes et 16 colonnes de LED blanches très lumineuses, soit un total de 256 LED. Les animations intégrées à l'appareil étaient assez simples, mais elles m'ont amené à l'idée que le fer peut réellement contrôler chaque LED individuellement. Cependant, pour cette raison, la petite boîte était assez chère: ma poche était vide d'environ 40 euros. Pour ce montant, vous obtenez une boîte avec des LED et un câble d'alimentation. Comme il est supposé que vous devez acheter ce produit avec d'autres produits Frekvens, vous recevez également des éléments de connexion supplémentaires: un câble d'alimentation d'extension pour une alimentation de bout en bout du secteur aux autres boîtiers,ainsi qu'un ensemble de vis et de tampons en plastique avec lesquels vous pouvez fixer mécaniquement le boîtier les uns aux autres.

Dès que je suis rentré chez moi, j'ai connecté l'appareil et ... pour être honnête, j'ai été un peu déçu de ce qu'ils ont fait avec le fer à repasser. L'appareil avait plusieurs animations qui pouvaient être sélectionnées en appuyant sur un bouton à l'arrière du boîtier; un petit microphone est installé dans le boîtier - chaque fois qu'il reconnaît le bruit, le cadre de l'animation change. Les animations ne sont pas très intéressantes: elles ne comportent que quatre à cinq images, et les images elles-mêmes sont uniquement en noir et blanc, sans nuances de gris. Si vous êtes curieux, j'ai enregistré une courte vidéo avec toutes les animations.

Évidemment, cela ne me convenait pas. Piratons l'appareil - voyons ce qui le fait fonctionner et est-il possible de rendre son comportement un peu plus intéressant.

Autopsie


Pour démonter Frekvens, un tournevis pour une fente en forme de croix et, éventuellement, un couteau suffiront. Vous aurez également besoin d'une bonne part de persévérance, car l'appareil n'est pas facile à démonter: la conception est compliquée et certains éléments sont remplis de silicone, probablement pour se débarrasser des vibrations et simplifier la fabrication.


Le démontage de l'affaire Frekvens commence par derrière. Le boîtier a des trous de vis sur tous les côtés, à l'exception de l'avant; grâce au jeu de vis et de couvercles du kit de l'appareil, il peut être connecté à d'autres gadgets Frekvens. Cependant, les trous arrière pour les vis sont un peu plus profonds et sous eux se trouvent des vis qui fixent le boîtier.


Après avoir retiré le couvercle arrière, nous voyons que tous les trous de vis ont des inserts métalliques filetés dans lesquels les vis peuvent être vissées. Hou la la! Cela devrait fournir aux trous une marge de sécurité suffisante. Il est possible que cela complique grandement la fabrication ou le démontage; ce dernier est compliqué par le fait que nous devons d'abord couper les gouttes de composé de silicone durci.


Les inserts sont en fait fixés avec d'autres inserts en plastique; ils doivent d'abord être supprimés.

Je n'ai pas d'autres photos du processus de démontage, mais après cette étape, vous verrez quatre vis qui doivent être dévissées, puis le processus se poursuit comme auparavant. Comprenez quelle pièce en plastique retient tout le reste, coupez le composé de silicone, retirez les attaches en plastique. Continuez jusqu'à ce que vous puissiez retirer la carte de circuit imprimé.


Le voici: l'envers de la carte de circuit imprimé. Comme il s'est avéré, il est assemblé à partir de deux cartes de circuits imprimés: la blanche a deux côtés - à l'arrière il y a tous les pilotes de LED (et une autre carte y est attachée), et à l'avant il y a les LED elles-mêmes.

Le circuit imprimé blanc est plutôt bien conçu: au lieu d'une matrice de LED, il y a 16 pilotes de LED SCT2024travaillant à partir d'un courant continu. Ces pilotes de LED ont 16 canaux, c'est-à-dire que chaque LED est directement contrôlée. Les pilotes de LED peuvent uniquement allumer ou éteindre complètement les LED; les pilotes eux-mêmes n'ont pas de support natif en niveaux de gris. En fait, ils effectuent un décalage de registre en utilisant des sorties contrôlées par le courant, et ils commutent tous séquentiellement; L'interface de connexion PCB verte se compose de son bus de synchronisation et de ses données, d'une ligne d'activation par enclenchement, d'une ligne de sortie, d'une mise à la terre et d'une alimentation.

Sur ce tableau vert se trouve le petit cerveau de l'appareil: un microcontrôleur, dont l'article est introuvable sur Google, et un amplificateur opérationnel pour le microphone. Fait intéressant, il y a des indices que l'appareil devrait avoir plus de fonctionnalités: il y a probablement une place pour I2C EEPROM 24Cxx et un indice que dans le projet d'origine, il y avait un récepteur IR sur le panneau avant. Peut-être était-il supposé que l'appareil serait livré avec une télécommande qui vous permet de créer vos propres modèles? Cela peut expliquer que les animations existantes semblent si ennuyeuses.


Sur le devant du tableau blanc se trouvent toutes les LED. Un minuscule microphone plat lui est également soudé. Au début, je pensais qu'il était soudé au tableau vert et dépassait par le trou du tableau blanc, mais en fait, il est tout simplement plat.


Tous les autres appareils électroniques sont situés à l'arrière de la carte. Il ne suffit pas là-bas: seulement une alimentation sous la marque Ikea, délivrant 4 V. Sous l'alimentation, il y a une petite carte de circuit imprimé sur laquelle il y a deux commutateurs tactiles pour les boutons à l'arrière du boîtier.

Donc, si nous voulons «optimiser» la conception, nous avons alors une faiblesse évidente: il vaut mieux remplacer une petite carte verte par un processeur avec quelque chose de plus puissant.

Nous modifions le fer


J'ai pensé qu'il serait possible de remplacer l'équipement par une ESP-Cam. Il s'agit d'une carte très bon marché (10 euros environ) avec une puce ESP32 WiFi / BT, plusieurs mégaoctets de PSRAM et un module de caméra. Je ne suis pas très intéressé par la musique légère, je voulais que l'appareil réponde à quelque chose de visuel. Comme il y avait déjà un trou à l'avant pour le récepteur, j'ai pensé que je pouvais l'utiliser sous la caméra. Je devrai également percer un trou dans le tableau blanc où se trouve le microphone; heureusement, outre ces pistes de microphone désormais inutiles, cela ne détruira qu'une seule piste de la LED. J'ai percé un trou et restauré la piste. En remettant temporairement la carte en place et en allumant le cube, je me suis assuré que toutes les LED fonctionnent toujours.


Maintenant, j'avais une planche avec un trou percé, et je ne pouvais que connecter et connecter mécaniquement l'ESP-Cam. Les concepteurs ont aimablement indiqué le but de tous les tampons sur la sérigraphie du tableau vert, donc je devais presque ne rien deviner. Étant donné que l'alimentation ne fournit que 4 V, je l'ai connectée directement à l'entrée 3,3 V de la puce ESP-CAM. Je devais le faire, car lorsque je l'ai connecté à la broche Vin 5V, la puce ne voulait pas démarrer ... Très probablement, le régulateur LDO a une chute de tension légèrement élevée. Pour en revenir, je pense maintenant que cela valait la peine d'essayer de connecter la diode en série avec une source 4 V pour obtenir 3,3-3,4 V, mais ma solution a fonctionné; ESP32 est assez sans prétention.


Soudant tous les connecteurs, j'ai quand même dû m'occuper de la mécanique. C'était un projet «rapide et sale», et j'avais déjà soudé les connecteurs ESP-Cam auparavant, donc pour aligner la caméra avec le trou, vous pourriez le faire avec plusieurs joints et beaucoup d'époxy.


Après cette opération, le dernier problème est resté: les LED à côté de la caméra ont brillé sur sa fenêtre de cadre, provoquant toutes sortes d'artefacts étranges. Tout d'abord, pour les éliminer, j'ai découpé une petite lunette dans une bande d'aluminium pour protéger l'appareil photo de la lumière directe.


La deuxième étape a été l'application de peinture acrylique. Il s'agit d'un insert en plastique sur lequel se trouvent tous les diffuseurs, à travers lequel les LED brillent. J'ai déjà agrandi le trou qu'il avait pour le microphone afin de créer une fenêtre de cadre plus large pour la caméra, mais cela a conduit à un autre problème - le trou était trop visible et trop de lumière diffuse tombait sur la caméra. Une tache de peinture acrylique noire a plutôt bien fonctionné sur les deux points; la caméra recevait encore beaucoup de lumière des LED, mais maintenant elle ne l'inondait pas complètement.

Ainsi, la transplantation cérébrale est terminée et le corps est prêt pour l'assemblage. Vous pouvez démarrer le logiciel.

Logiciel


Passons au logiciel. Tout d'abord, nous devons prendre le contrôle des pilotes LED. Ce n'est pas difficile: les signaux du pilote sont presque directement cohérents avec l'interface périphérique SPI de la puce ESP32: le pad CLK sur la carte se connecte à l'interface CLK périphérique SPI, le pad DA sur la carte se connecte au MOSI du signal SPI. Cela vous permettra de synchroniser 256 bits avec une chaîne de pilotes de LED: chaque bit synchronisé contrôle l'allumage ou l'extinction de la LED correspondante. De plus, il y a une entrée LAK. Si le signal est faible, la LED conserve sa valeur précédente, indépendamment de ce qui a été transféré aux registres à décalage; si le signal est élevé, alors ils basculent tous simultanément sur les valeurs qui sont actuellement dans le registre à décalage. Enfin, il existe une entrée EN qui allume ou éteint toutes les LED;Je ne l'ai pas connecté à GPIO et j'allume toujours les LED par programmation.

Ainsi, je peux maintenant allumer et éteindre des LED individuelles, obtenant un affichage en noir et blanc. Cependant, j'ai besoin d'autre chose. Avec une puissance de calcul suffisante, l'écran devrait également être capable d'afficher des nuances de gris - pour cela, il vous suffit d'allumer / éteindre les LED plus rapidement que l'œil ne le voit.

Pour implémenter cela avec une seule LED, j'utilise généralement PWM, mais dans le cas de 256 LED, cela occupera une partie importante du processeur ESP32. Au lieu de cela, j'ai décidé d'utiliser la modulation de code binaire (également appelée modulation d'angle de bit). Il s'agit d'une technique qui vous permet d'obtenir des nuances de gris avec moins de puissance CPU. Je l'ai déjà utilisé avec succès dans d' autres projets , j'étais donc sûr que cela fonctionnerait.


Et ça a marché. J'ai également ajouté une table de conversion pour convertir la luminosité CIE en PWM , car l'œil répond essentiellement à la luminosité des LED de manière non linéaire; La table de recherche résout ce problème. Au final, j'ai réussi à obtenir une quantité suffisante de nuances de gris et une mise à l'échelle linéaire de la luminosité optique en fonction de la valeur de pixel que j'ai définie.

La mise en œuvre du projet de caméra n'a pas été difficile: il existe un composant ESP-IDF qui peut être ajouté au projet; il se chargera de configurer la caméra et d'échanger des données avec elle, il vous suffit de spécifier les paramètres dont vous avez besoin, puis de demander le bitmap que la caméra voit. La seule chose que je ne pouvais pas utiliser dans le réglage standard était que l'alignement automatique et l'exposition automatique étaient activés par défaut, ce qui interférait à peu près avec ma façon de contrôler les LED: selon la partie de la séquence de modulation du code binaire que l'image a été créée, la caméra a plutôt augmenté ou diminué de façon aléatoire l'alignement et l'exposition. J'ai résolu le problème en commutant l'appareil photo sur l'alignement manuel et la vitesse d'obturation; le code lui-même examine l'image et détermine si ces paramètres nécessitent une compensation.Grâce à un tel traitement manuel, j'ai également réussi à exclure les pixels qui regardaient directement les LED afin de les supprimer complètement de l'équation. Cela a également grandement aidé à obtenir une image stable.

J'ai maintenant un appareil photo et une toile 16x16 dans des tons de gris. Que dois-je en faire? J'ai eu une idée: à l'époque des tout premiers ordinateurs Macintosh, il y avait une extension populaire qui n'ajoutait que quelques yeux de dessin animé à la barre de menus. Ces yeux suivaient simplement le curseur. (Une variante de ce thème pour Linux / Unix appelée "xeyes" existe toujours.) Et si j'essaie de le répéter dans la vraie vie?


Pour commencer, j'avais besoin de quelques images des yeux. Je ne pensais pas que je pouvais dessiner quelque chose de valable, alors j'ai décidé d'utiliser mes propres yeux comme images de base; regarder une courte vidéo dans laquelle je regarde et clignote dans toutes les directions. Il convient de noter qu'en raison de la situation actuelle, je disposais de très peu d'outils professionnels: je m'allonge par terre pour maximiser l'éclairage tombant des lampes fluorescentes au plafond et obtenir une image lisible; Toute la vidéo a été tournée sur le smartphone que je tiens dans mes mains.

Comme les données initiales étaient plutôt bâclées, j'ai dû travailler dur sur le post-traitement. J'ai commencé par découper un fragment qui était approximativement autour de mon œil droit. J'ai ensuite converti chaque image de la vidéo en une image et supprimé toutes les images redondantes; à la fin, j'avais une bonne sélection d'images de moi regardant dans des directions différentes, ainsi que quelques images avec un clin d'œil. Cependant, puisque j'ai utilisé un téléphone portable pour l'enregistrement, la vidéo s'est avérée un peu tremblante et les images ont sauté. Pour résoudre ce problème, j'ai transmis un ensemble d'images via le programme de collage d' images Huginqui est généralement utilisé pour les panoramas et les images HDR; à la sortie, j'ai obtenu des photos idéalement centrées sur cette partie de mon visage. Maintenant, je ne pouvais que marquer dans quelle direction je regardais et si je clignais des yeux. J'ai fait cela en convertissant d'abord toutes les images en nuances de gris puis en les téléchargeant sur Gimp . Dans chaque image, j'ai utilisé un point rouge pour indiquer l'emplacement du centre de la pupille, plus un point rouge dans le coin gauche ou droit pour indiquer si je cligne des yeux, et si je cligne des yeux, alors mon œil est à moitié ouvert ou fermé.


Après avoir marqué chaque image de cette manière, il est devenu très simple d'écrire un script pour obtenir l'emplacement de la pupille, ainsi que l'état de clignotement. Le script a également mis à l'échelle les images en 16 x 16 et les a enregistrées sous forme de données binaires brutes, prêtes à être écrites dans le micrologiciel du module ESP-CAM. En fin de compte, j'ai obtenu un ensemble d'images et un index de l'endroit où se trouve la pupille et dans quel état de cligner les yeux.

L'ESP-Cam a un composant de bibliothèque de caméras assez facile à utiliser pour l'ESP-IDF, donc obtenir des images était facile. J'ai configuré la capture d'images 120x160 dans des tons de gris, car elles sont les plus faciles à traiter, et je n'ai pas eu besoin de beaucoup de résolution, car le résultat final devrait être affiché sur un écran 16x16. Cependant, j'ai toujours eu un problème matériel: la caméra est encore trop proche des LED.


Au début, j'ai essayé de le résoudre par calibrage: au démarrage de l'appareil, il prend deux photos: une avec une LED proche de l'objectif de la caméra, et une seule avec une LED située loin de la caméra. En soustrayant une image d'une autre, vous pouvez comprendre quels pixels sont affectés par les LED. Ces pixels sont stockés dans le masque; les pixels marqués dans le masque sont ensuite ignorés. L'image ci-dessus montre deux plans et un masque.

Avec une image plus nette, je pouvais passer à la reconnaissance de mouvement. Je l'ai implémenté en récupérant une image de la caméra et en soustrayant l'image précédente de celle-ci. Ensuite, j'ai pu calculer la quantité de mouvement en additionnant tous les pixels résultants. De plus, il a été possible de calculer l'emplacement de la concentration de mouvement en prenant la moyenne des coordonnées de tous les pixels pondérée par la différence d'images dans ce pixel. En fin de compte, la magie du filtrage est effectuée de manière à ce que l'appareil ne ressemble pas à un jack Russell Terrier atteint de TDAH: pour attirer son attention, les objets doivent se déplacer plus uniformément ou se déplacer assez loin.

Il n'y avait qu'un seul problème: quand il faisait très sombre, l'algorithme de reconnaissance de mouvement travaillait parfois sur la réflexion des LED sur des objets brillants dans la pièce: si l'œil clignait des yeux, alors faites attention à sa propre réflexion. Ce n'est pas tout à fait ce que je voulais, j'ai donc contourné ce problème en rendant l'algorithme de reconnaissance de mouvement «aveugle» lors du changement d'image sur les LED; j'ai donc arrêté ce comportement. De plus, c'est aussi un peu plus réaliste: lorsque vous clignez des yeux, vous ne pouvez pas voir.

Le firmware dispose de plusieurs modes de débogage qui illustrent l'ensemble du processus. Voici une courte vidéo illustrant cela:


Conclusion


Alors maintenant j'ai un appareil qui me suit ... pas vraiment utile, je suis d'accord. Mais c'était intéressant pour moi de le créer, et si jamais je trouve quelque chose de plus utile qui peut être implémenté sur un écran LED 16x16, alors je peux le faire, car j'ai déjà un code de contrôle. En parlant de code: vous pouvez télécharger gratuitement mon résultat brut à partir d'ici . J'espère que vous avez apprécié et faites attention.


All Articles