Table des matières:
- Étape 1: Modulation de largeur d'impulsion pour mélanger les couleurs
- Étape 2: Parler aux registres à décalage et aux LED
- Étape 3: Schéma
- Étape 4: code source C++
- Étape 5: Gadget terminé
- Étape 6: Application: Moniteur de charge CPU pour Linux à l'aide de Perl
- Étape 7: Application: Parler à d'autres modules à l'aide d'I²C
- Étape 8: Application: "Game Cube":-)
- Étape 9: Affichage d'images / animations sur la matrice - Quick Hack
- Étape 10: Contrôle interactif des animations stockées
- Étape 11: Affichage de la vidéo en direct
- Étape 12: Plus de lumière presque gratuitement
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Cet affichage est basé sur une matrice de LED RVB 8x8. À des fins de test, il a été connecté à une carte Arduino standard (Diecimila) à l'aide de 4 registres à décalage. Après l'avoir fait fonctionner, je l'ai permatisé sur un PCB fabriqué. Les registres à décalage ont une largeur de 8 bits et sont facilement interfacés avec le protocole SPI. La modulation de largeur d'impulsion est utilisée pour mélanger les couleurs, nous y reviendrons plus tard. Une partie de la RAM du MCU est utilisée comme framebuffer pour contenir l'image. La RAM vidéo est analysée par une routine d'interruption en arrière-plan, de sorte que l'utilisateur peut faire d'autres choses utiles comme parler à un PC, lire des boutons et des potentiomètres. Plus d'informations sur "Arduino": www.arduino.cc
Étape 1: Modulation de largeur d'impulsion pour mélanger les couleurs
Modu de largeur d'impulsion - QUOI ? La modulation de largeur d'impulsion allume et éteint l'alimentation d'un appareil électrique assez rapidement. La puissance utilisable résulte de la moyenne mathématique de la fonction d'onde carrée prise sur l'intervalle d'une période. Plus la fonction reste longtemps en position ON, plus vous obtenez de puissance. PWM a le même effet sur la luminosité des LED qu'un gradateur sur les lampes AC. La tâche à venir est de contrôler individuellement la luminosité de 64 LED RGB (= 192 LED simples !) spectre de couleurs. De préférence, il ne devrait pas y avoir de scintillement ou d'autres effets perturbateurs. La perception non linéaire de la luminosité présentée par l'œil humain ne sera pas prise en compte ici (par exemple, la différence entre 10 % et 20 % de luminosité semble "plus grande" qu'entre 90 % et 100 %). L'image (1) illustre le principe de fonctionnement de l'algorithme PWM. Disons que le code reçoit une valeur de 7 pour la luminosité de la LED (0, 0). De plus, il sait qu'il y a un maximum de N étapes de luminosité. Le code exécute N boucles pour tous les niveaux de luminosité possibles et toutes les boucles nécessaires pour desservir chaque LED de toutes les rangées. Si le compteur de boucle x dans la boucle de luminosité est inférieur à 7, la LED est allumée. S'il est supérieur à 7, la LED est éteinte. En faisant cela très rapidement pour toutes les LED, les niveaux de luminosité et les couleurs de base (RVB), chaque LED peut être ajustée individuellement pour afficher la couleur souhaitée. Des mesures avec un oscilloscope ont montré que le code de rafraîchissement de l'affichage prend environ 50% de temps CPU. Le reste peut être utilisé pour faire une communication série avec un PC, lire des boutons, parler à un lecteur RFID, envoyer I2données C vers d'autres modules…
Étape 2: Parler aux registres à décalage et aux LED
Un registre à décalage est un appareil qui permet de charger des données en série et une sortie parallèle. L'opération inverse est également possible avec la puce appropriée. Il existe un bon tutoriel sur les registres à décalage sur le site arduino. Les LED sont pilotées par des registres à décalage 8 bits du type 74HC595. Chaque port peut fournir ou absorber environ 25 mA de courant. Le courant total par puce absorbée ou sourcée ne doit pas dépasser 70 mA. Ces jetons sont extrêmement bon marché, alors ne payez pas plus de 40 cents par pièce. Comme les LED ont une caractéristique courant/tension exponentielle, il faut des résistances de limitation de courant. En utilisant la loi d'Ohm: R = (V - Vf) / IR = résistance de limitation, V = 5 V, Vf = tension directe de la LED, I = courant souhaité LED rouges ont une tension directe d'environ 1,8 V, une plage bleue et verte de 2,5 V à 3,5 V. Utilisez un simple multimètre pour le déterminer. Pour une reproduction correcte des couleurs, il faut prendre en compte quelques éléments: la sensibilité spectrale de l'œil humain (rouge/bleu: mauvais, vert: bon), l'efficacité de la LED à une certaine longueur d'onde et courant. En pratique, il suffit de prendre 3 potentiomètres et de les ajuster jusqu'à ce que la LED affiche une lumière blanche appropriée. Bien entendu, le courant LED maximum ne doit pas être dépassé. Ce qui est également important ici, c'est que le registre à décalage pilotant les lignes doit fournir du courant à 3x8 LED, il vaut donc mieux ne pas pousser le courant trop haut. J'ai réussi avec des résistances de limitation de 270Ohm pour toutes les LED, mais cela dépend bien sûr de la marque de la matrice de LED. Les registres à décalage sont interfacés avec le SPI série. SPI = Serial Peripheral Interface (Image (1)). Opposé aux ports série sur PC (asynchrone, pas de signal d'horloge), SPI a besoin d'une ligne d'horloge (SRCLK). Ensuite, il y a une ligne de signal indiquant à l'appareil lorsque les données sont valides (chip select / latch / RCLK). Enfin, il y a deux lignes de données, l'une est appelée MOSI (master out slave in), l'autre est appelée MISO (master in slave out). SPI est utilisé pour interfacer des circuits intégrés, tout comme je2C. Ce projet nécessite MOSI, SRCLK et RCLK. De plus, la ligne de validation (G) est également utilisée. Un cycle SPI est démarré en tirant la ligne RCLK vers LOW (Image (2)). Le MCU envoie ses données sur la ligne MOSI. Son état logique est échantillonné par le registre à décalage sur le front montant de la ligne SRCLK. Le cycle est terminé en ramenant la ligne RCLK à HAUT. Maintenant, les données sont disponibles aux sorties.
Étape 3: Schéma
L'image (1) montre comment les registres à décalage sont câblés. Ils sont connectés en guirlande, de sorte que les données peuvent être déplacées dans cette chaîne et également à travers elle. Par conséquent, il est facile d'ajouter plus de registres à décalage.
L'image (2) montre le reste du schéma avec le MCU, les connecteurs, le quartz… Le fichier PDF joint contient l'ensemble des travaux, idéal pour l'impression.
Étape 4: code source C++
En C/C++, il faut généralement prototyper des fonctions avant de les coder.#include int main(void);void do_something(void);int main(void) { do_something();}void do_something(void) { /* comment */ } L'IDE Arduino ne nécessite pas cette étape, car les prototypes de fonctions sont générés automatiquement. Par conséquent, les prototypes de fonction n'apparaîtront pas dans le code affiché ici. Image (1): fonction setup() Image (2): fonction spi_transfer() utilisant le SPI matériel de la puce ATmega168 (fonctionne plus rapidement) Image (3): code framebuffer utilisant une interruption de débordement timer1. Morceaux de code qui ont un aspect légèrement cryptique pour les débutants, par exemple while(!(SPSR & (1<<SPIF))) {} utilise directement les registres du MCU. Cet exemple en mots: " tant que le bit SPIF dans le registre SPSR n'est pas défini, ne faites rien ". Je veux juste souligner que pour les projets standard, il n'est vraiment pas nécessaire de traiter ces choses si étroitement liées au matériel. Les débutants ne devraient pas être effrayés par cela.
Étape 5: Gadget terminé
Après avoir résolu tous les problèmes et exécuté le code, il me suffisait de créer un schéma de circuit imprimé et de l'envoyer à une fabuleuse maison. Il a l'air tellement plus propre:-) Image (1): carte contrôleur entièrement remplie Image (2): face avant du PCB nuImage (2): face arrière. Ces ports contiennent les lignes série RX, TX, le I2Lignes C, lignes d'E/S numériques et 7 lignes ADC. Ceci est destiné à empiler les boucliers à l'arrière de la carte. L'espacement est adapté à l'utilisation de perfboard (0,1 pouce). Le chargeur de démarrage peut être flashé à l'aide de l'en-tête ICSP (fonctionne avec USBtinyISP d'adafruit). Dès que cela est fait, utilisez simplement un adaptateur série FTDI USB/TTL standard ou similaire. J'ai également ajouté un cavalier de désactivation de la réinitialisation automatique. J'ai également concocté un petit script Perl (voir mon blog), qui permet une réinitialisation automatique avec des câbles FTDI qui ne fonctionne généralement pas immédiatement (ligne RTS vs. DTR). Cela fonctionne sur Linux, peut-être sur MAC. Des circuits imprimés et quelques KIT de bricolage sont disponibles sur mon blog. Soudure CMS requise ! Voir les fichiers PDF pour les instructions de construction et les sources pour les matrices LED.
Étape 6: Application: Moniteur de charge CPU pour Linux à l'aide de Perl
Il s'agit d'un moniteur de charge très basique avec un tracé d'historique. Il est basé sur un script Perl qui rassemble la "moyenne de charge" du système toutes les 1s à l'aide d'iostat. Les données sont stockées dans un tableau qui est décalé à chaque mise à jour. De nouvelles données sont ajoutées en haut de la liste, l'entrée la plus ancienne est supprimée. Des informations plus détaillées et des téléchargements (code…) sont disponibles sur mon blog.
Étape 7: Application: Parler à d'autres modules à l'aide d'I²C
Ceci n'est qu'une preuve de principe et de loin la solution la plus simple pour ce travail.2C permet d'adresser directement jusqu'à 127 cartes "esclaves". Ici, la carte de droite dans la vidéo est le "maître" (qui initie tous les transferts), la carte de gauche est l'esclave (en attente de données). je2C a besoin de 2 lignes de signaux et des lignes électriques habituelles (+, -, SDA, SCL). Comme il s'agit d'un bus, tous les appareils y sont connectés en parallèle.
Étape 8: Application: "Game Cube":-)
Juste une idée bizarre. Celui-ci s'intègre également dans l'enceinte en bois indiquée sur la page d'introduction. Il a 5 boutons à l'arrière qui pourraient être utilisés pour jouer à un jeu simple. LA FIN ?
Étape 9: Affichage d'images / animations sur la matrice - Quick Hack
Il n'y a donc que 8x8 pixels et quelques couleurs disponibles. Utilisez d'abord quelque chose comme Gimp pour réduire votre image préférée à exactement 8x8 pixels et enregistrez-la au format brut ".ppm" (pas ASCII). PPM est facile à lire et à traiter dans un script Perl. L'utilisation d'ImageMagick et de l'outil de ligne de commande "convert" ne fonctionnera pas correctement. Téléchargez le nouveau code arduino, puis utilisez le script Perl pour le télécharger sur le contrôleur. Le scintillement n'est qu'un décalage entre le rafraîchissement des LED et la fréquence d'images de ma caméra. Après avoir mis à jour un peu le code, il s'exécute assez rapidement. Toutes les images sont transférées en direct sur une série comme vous les voyez. Des animations plus longues peuvent être stockées dans une EEPROM externe comme c'est le cas dans diverses cartes spoke-pov.
Étape 10: Contrôle interactif des animations stockées
Pourquoi laisser le microcontrôleur s'amuser ? Le culte Arduino est tout au sujet de l'informatique physique et de l'interaction, alors ajoutez simplement un potentiomètre et prenez le contrôle ! L'utilisation de l'une des 8 entrées du convertisseur analogique-numérique rend cela très simple.
Étape 11: Affichage de la vidéo en direct
L'utilisation d'un script Perl et de quelques modules permet de montrer assez facilement des vidéos quasi live sur les systèmes X11. Il a été codé sur Linux et peut également fonctionner sur les MAC. Cela fonctionne comme ceci:- obtenez la position du curseur de la souris- capturez une boîte de NxN pixel centrée sur le curseur- redimensionnez l'image à 8x8 pixels- envoyez-la à la carte LED- répéter
Étape 12: Plus de lumière presque gratuitement
Avec seulement deux étapes, la luminosité peut être augmentée un peu. Remplacez les résistances 270Ω par celles 169Ω et superposez un autre registre à décalage 74HC595 sur IC5.