Table des matières:

Chapeau LED fantaisie : 5 étapes (avec photos)
Chapeau LED fantaisie : 5 étapes (avec photos)

Vidéo: Chapeau LED fantaisie : 5 étapes (avec photos)

Vidéo: Chapeau LED fantaisie : 5 étapes (avec photos)
Vidéo: Elle Était Coincée Donc Ce Policier L'aide 2024, Novembre
Anonim
Image
Image
Chapeau LED fantaisie
Chapeau LED fantaisie

J'ai toujours voulu faire un projet Arduino, mais je n'ai jamais eu de bonnes idées pour un projet jusqu'à ce que ma famille soit invitée à une soirée chapeau chic. Avec un délai de deux semaines, j'étais curieux de savoir si je pouvais à la fois planifier et exécuter un chapeau d'animation LED sensible au mouvement. Il s'avère que je pourrais ! Je suis probablement allé un peu trop loin, mais le projet total a coûté environ 80 $. Avec de l'expérimentation et un peu de codage, vous pourriez le faire pour moins cher.

Le but avec le chapeau était le suivant:

  1. Faites déplacer un ensemble de lumières du centre du devant du chapeau à l'arrière, une lumière de chaque côté
  2. Modifiez la vitesse de déplacement de la lumière dictée par l'inclinaison du chapeau d'avant en arrière
  3. Permettre aux lumières de s'inverser lorsque la bande du chapeau a été inclinée vers le bas (c'est-à-dire imiter l'effet de la gravité sur les lumières)
  4. Changer de couleur en fonction de l'inclinaison du chapeau de gauche à droite
  5. Détectez les chocs et affichez un effet spécial
  6. Sentez le porteur tourner et affichez un effet spécial
  7. Ayez-le complètement contenu dans le chapeau

Étape 1: Pièces nécessaires

Pièces nécessaires
Pièces nécessaires
Pièces nécessaires
Pièces nécessaires
Pièces nécessaires
Pièces nécessaires

J'ai utilisé les principaux composants suivants (liens Amazon non affiliés inclus):

  • Microcontrôleur Teensy LC - Je l'ai choisi par rapport à un Arduino ordinaire en raison de sa petite taille et de sa connexion spéciale pour contrôler mes LED, ainsi que d'une solide bibliothèque et d'un support communautaire.
  • Capteur de position basé sur Bosch BNO055 - honnêtement l'un des premiers sur lesquels j'ai trouvé de la documentation. Il existe des options beaucoup moins chères, mais une fois que vous avez compris le Bosch, il fait beaucoup pour vous que vous auriez autrement à faire dans le code
  • Bande LED adressable WS2812 - J'ai choisi une longueur de 1 mètre avec 144 LED par mètre. Avoir cette densité aide la lumière à ressembler davantage à un mouvement, plutôt que des éléments individuels s'illuminant en séquence.

Et les composants mineurs suivants:

  • Un chapeau - n'importe quel chapeau avec un bandeau fera l'affaire. Il s'agit d'un chapeau à 6 $ d'un magasin local. S'il y a une couture à l'arrière, il sera plus facile de faire passer le câblage. Faites attention si la bande du chapeau est collée, car cela causera également des difficultés supplémentaires. Celui-ci est cousu le long du haut, mais le bas se relève facilement.
  • Résistances de 4,7K ohms
  • 3x boîtier de piles AAA - l'utilisation de 3 piles AAA produit une tension exactement dans la plage souhaitée par l'électronique, ce qui simplifie les choses. AAA s'intègre plus facilement dans un chapeau que AA et a toujours une excellente autonomie.
  • Fil de petit calibre - J'ai utilisé du fil solide que j'avais posé à partir d'un projet LED précédent.
  • Fer à souder et soudure
  • Du spandex qui correspond à la couleur intérieure du chapeau, et du fil

Suggéré, mais facultatif:

  • Connecteurs rapides pour les fils de la batterie
  • Outil Helping Hands, ces choses sont très petites et difficiles à souder

Étape 2: Modifier le chapeau

Modifier le chapeau
Modifier le chapeau
Modifier le chapeau
Modifier le chapeau
Modifier le chapeau
Modifier le chapeau
Modifier le chapeau
Modifier le chapeau

Vous aurez besoin d'une place dans le chapeau pour monter l'électronique et d'une place pour la batterie. Ma femme travaille professionnellement avec les vêtements, alors je lui ai demandé des conseils et de l'aide. Nous avons fini par créer deux poches avec du spandex. La première poche plus petite vers l'avant est pointue comme le chapeau lui-même, de sorte que lorsque l'électronique est installée, le capteur de position est assez bien maintenu en place, mais peut être facilement retiré si nécessaire. La deuxième poche vers l'arrière sert à maintenir la batterie en place.

Les poches étaient cousues avec du fil assorti à la couleur du chapeau, tout le long de la ligne de couronne. Selon le style de chapeau et les matériaux, il est fabriqué en YMMV avec cette technique.

Nous avons également découvert que la bande du chapeau se repliait sur elle-même d'un côté et qu'elle était entièrement cousue au chapeau à cet endroit. Nous avons dû retirer la couture d'origine afin de faire passer les LED sous la bande. Pendant la construction, il a été maintenu en place avec des épingles, puis cousu avec du fil assorti une fois terminé.

Enfin, nous avons ouvert la couture à l'arrière du chapeau où il est recouvert par la bande. Nous avons placé le faisceau de câbles fourni avec les LED à travers cette couture et aligné la première LED de la bande pour qu'elle soit juste sur la couture. Nous avons ensuite enroulé les LED autour du chapeau et coupé la bande pour que la dernière LED soit juste à côté de la première. La bande LED peut être maintenue en place juste avec la bande de chapeau, mais en fonction de votre bande et de votre matériel, vous devrez peut-être fixer les LED en cousant ou en collant.

Étape 3: câblez-le

Câblez-le
Câblez-le

La carte Teensy et les LED fonctionneront avec n'importe où de 3,3 V à 5 V pour l'alimentation. C'est pourquoi j'ai choisi d'utiliser 3 piles AAA, la tension de sortie de 4,5 V est bien dans cette plage et elles ont une autonomie suffisante pour la façon dont j'ai programmé les LED pour qu'elles fonctionnent. Vous devriez pouvoir obtenir plus de 8 heures d'autonomie.

Câblage de l'alimentation

J'ai câblé les fils positifs et négatifs du boîtier de la batterie et des LED ensemble, puis j'ai soudé sur le Teensy aux endroits appropriés. Le positif de la batterie doit être connecté à la broche en haut à droite du Teensy dans le schéma (étiqueté Vin sur la carte), et le négatif peut être câblé à n'importe quelle broche étiquetée GND. Idéalement, il y en a un directement sur le côté opposé du tableau, ou juste à côté de la broche Vin. Le schéma de brochage complet de la carte se trouve au bas de cette page. Et dans certains cas, une copie papier est incluse lors de la commande du tableau.

Si vous prévoyez d'exécuter du code qui n'a que quelques LED allumées à la fois, vous pouvez alimenter les LED à partir du Teensy lui-même, en utilisant une sortie 3.3v et GND, cependant si vous essayez de tirer trop de puissance, vous pouvez endommager la planche. Donc, pour vous donner le plus d'options, il est préférable de câbler les LED directement à votre source de batterie.

Câblage des LED

J'ai choisi le Teensy LC pour ce projet car il a une broche qui facilite beaucoup le câblage des LED adressables. Au bas de la carte, la broche qui est la deuxième à partir de la gauche reflète la broche n ° 17, mais a également 3,3 V dessus. C'est ce qu'on appelle un pull-up, et sur d'autres cartes, vous devrez câbler une résistance pour fournir cette tension. Dans le cas du Teensy LC, vous pouvez simplement câbler de cette broche directement au fil de données de vos LED.

Câblage du capteur de position

Certaines des cartes BNO055 disponibles sont beaucoup plus strictes en tension et ne nécessitent que 3,3 V. Pour cette raison, j'ai câblé le Vin sur la carte BNO055 à partir de la sortie 3,3v dédiée sur le Teensy, qui est la 3ème broche en bas à droite. Vous pouvez ensuite connecter le GND du BNO055 à n'importe quel GND du Teensy.

Le capteur de position BNO055 utilise I2c pour parler au Teensy. I2c nécessite des pull-ups, j'ai donc câblé deux résistances de 4,7 K ohms d'une sortie 3,3 V sur le Teensy aux broches 18 et 19. J'ai ensuite câblé la broche 19 à la broche SCL de la carte BNO055 et 18 à la broche SDA.

Conseils/astuces de câblage

Pour réaliser ce projet, j'ai utilisé du fil solide plutôt que toronné. L'un des avantages du fil solide est de souder sur des cartes prototypes comme celles-ci. Vous pouvez dénuder un fil, le plier à 90 degrés et l'insérer par le bas de l'une des bornes, de sorte que l'extrémité coupée du fil dépasse de votre carte. Vous n'avez alors besoin que d'une petite quantité de soudure pour le maintenir à la borne, et vous pouvez facilement couper l'excédent.

Le fil solide peut être plus difficile à travailler car il a tendance à vouloir rester tel qu'il est plié. Cependant pour ce projet c'était un avantage. J'ai coupé et façonné mes fils de manière à ce que l'orientation du capteur de position soit cohérente lorsque j'ai inséré et retiré l'électronique du chapeau pour le peaufiner et la programmation.

Étape 4: Programmation

Maintenant que tout est assemblé, vous aurez besoin d'un outil de programmation compatible Arduino. J'ai utilisé l'IDE Arduino actuel (fonctionne avec Linux, Mac et PC). Vous aurez également besoin du logiciel Teensyduino pour s'interfacer avec la carte Teensy. Ce projet utilise fortement la bibliothèque FastLED pour effectuer la programmation de la couleur et de la position des LED.

Étalonnage

La première chose que vous voudrez faire est d'aller sur l'excellent référentiel GitHub de Kris Winer pour le BNO055 et de télécharger son croquis BNO_055_Nano_Basic_AHRS_t3.ino. Installez ce code avec le moniteur série en cours d'exécution et il vous dira si la carte BNO055 se met correctement en ligne et réussit ses auto-tests. Il vous guidera également dans l'étalonnage du BNO055, ce qui vous donnera des résultats plus cohérents plus tard.

Premiers pas avec le croquis Fancy LED

Le code du chapeau Fancy LED est spécifiquement joint, ainsi que sur mon référentiel GitHub. Je prévois d'apporter plus de modifications au code et celles-ci seront publiées sur le dépôt GitHub. Le fichier ici reflète le code lorsque ce Instructable a été publié. Après avoir téléchargé et ouvert le croquis, vous devrez modifier quelques éléments. La plupart des valeurs importantes à modifier se trouvent tout en haut sous la forme d'instructions #define:

Ligne 24: #define NUM_LEDS 89 - remplacez-la par le nombre réel de LED sur votre bande LED

Ligne 28: #define SERIAL_DEBUG false - vous voudrez probablement rendre cela vrai, afin que vous puissiez voir la sortie sur le moniteur série

Code de détection de position

La détection de position et la plupart de vos ajustements commencent à la ligne 742 et passent par 802. Nous obtenons les données de tangage, de roulis et de lacet du capteur de position et les utilisons pour définir des valeurs. Selon la façon dont vos appareils électroniques sont montés, vous devrez peut-être les changer. Si vous montez le capteur de position avec la puce vers le haut du chapeau et la flèche à côté de X imprimée sur la carte pointée vers l'avant du chapeau, vous devriez voir ce qui suit:

  • Pitch hoche la tête
  • Le rouleau incline la tête, par ex. touche ton oreille contre ton épaule
  • Le lacet est dans quelle direction. vous faites face (Nord, Ouest, etc.).

Si votre planche est montée dans une orientation différente, vous devrez permuter Pitch/Roll/Yaw pour qu'elle se comporte comme vous le souhaitez.

Pour ajuster les paramètres du rouleau, vous pouvez modifier les valeurs #define suivantes:

  • ROLLOFFSET: avec votre chapeau stable et le plus centré possible, si le Roll n'est pas à 0, changez-le par la différence. C'est à dire. si vous voyez Rouler à -20 lorsque votre chapeau est centré, faites ce 20.
  • ROLLMAX: la valeur maximale à utiliser pour la mesure de roulis. Le plus facile à trouver en portant le chapeau et en déplaçant votre oreille droite vers votre épaule droite. Vous aurez besoin d'un long câble USB pour le faire tout en utilisant le moniteur série.
  • ROLLMIN: la valeur la plus basse à utiliser pour la mesure du roulis, lorsque vous inclinez la tête vers la gauche

De même, pour le pas:

  • MAXPITCH - la valeur maximale lorsque vous regardez vers le haut
  • MINPITCH - la valeur minimale lorsque vous regardez vers le bas
  • PITCHCENTER - la valeur de hauteur lorsque vous regardez droit devant

Si vous définissez SERIALDEBUG sur true en haut du fichier, vous devriez voir les valeurs actuelles de la sortie Roll/Pitch/Yaw sur le moniteur série pour aider à ajuster ces valeurs.

Autres paramètres que vous pouvez modifier

  • MAX_LED_DELAY 35 - le plus lent que la particule LED peut se déplacer. C'est en millisecondes. C'est le délai entre le passage d'une LED à la suivante dans la chaîne.
  • MIN_LED_DELAY 10 - le jeûne que la particule LED peut déplacer. Comme ci-dessus, il est en millisecondes.

Conclusion

Si vous êtes allé aussi loin, vous devriez avoir un chapeau LED entièrement fonctionnel et amusant ! Si vous voulez en faire plus, la page suivante contient des informations avancées sur la modification des paramètres et la réalisation de vos propres tâches. ainsi que quelques explications sur ce que fait le reste de mon code.

Étape 5: avancée et facultative: à l'intérieur du code

Détection d'impact et de rotation

La détection d'impact/rotation est effectuée à l'aide des fonctions de capteur à G élevé du BNO055. Vous pouvez en modifier la sensibilité avec les lignes suivantes dans initBNO055():

  • Ligne #316: BNO055_ACC_HG_DURATION - combien de temps l'événement doit durer
  • Ligne #317: BNO055_ACC_HG_THRESH - quelle doit être la force de l'impact
  • Ligne #319: BNO055_GYR_HR_Z_SET - seuil de vitesse de rotation
  • Ligne #320: BNO055_GYR_DUR_Z - combien de temps la rotation doit même durer

Les deux valeurs sont binaires à 8 bits, actuellement l'impact est défini sur B1100000, soit 192 sur 255.

Lorsqu'un impact ou une vrille est détecté, le BNO055 définit une valeur que le code recherche juste au début de la boucle:

// Détecte toute interruption déclenchée, c'est-à-dire en raison d'un octet G élevé intStatus = readByte(BNO055_ADDRESS, BNO055_INT_STATUS); if(intStatus > 8) { impact(); } else if(intStatus > 0) { spin(); }

Recherchez la ligne void impact() ci-dessus dans le code pour modifier le comportement à l'impact, ou void spin() pour modifier le comportement de rotation.

Aides

J'ai créé une fonction d'aide simple (void setAllLeds()) pour régler rapidement toutes les LED sur une seule couleur. On l'utilise pour les éteindre tous:

setAllLeds(CRGB::Black);

Ou vous pouvez choisir n'importe quelle couleur reconnue par la bibliothèque FastLED:

setAllLeds(CRGB::Red);

Il existe également une fonction fadeAllLeds() qui atténue toutes les LED de 25%.

La classe particule

Afin de simplifier considérablement le câblage, je voulais utiliser une seule chaîne de LED, mais les faire se comporter comme plusieurs chaînes. Comme c'était mon premier essai, je voulais que ce soit aussi simple que possible, donc je traite la chaîne comme deux, avec la ou les LED du milieu étant là, le split serait. Comme nous pouvons avoir un nombre pair ou un nombre impair, nous devons en tenir compte. Je commence par quelques variables globales:

/* * Variable et conteneurs pour LED */ LED CRGB[NUM_LEDS]; statique non signé int curLedDelay = MAX_LED_DELAY; int statique centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2;static bool oddLeds = 0; static bool particuleDir = 1; static bool speedDir = 1;unsigned long dirCount; hueCount long non signé;

Et du code dans setup():

if(NUM_LEDS % 2 == 1) { impairLeds = 1; maxLedPos = NUM_LEDS/2; } else { impairLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Si nous avons des nombres impairs, nous voulons utiliser le point 1/2 comme milieu, sinon nous voulons le point 1/2 - 1. C'est facile à voir avec 10 ou 11 LED:

  • 11 LED: 11/2 avec des nombres entiers doit être évalué à 5. et les ordinateurs comptent à partir de 0. Ainsi, 0 - 4 est la moitié, 6 - 10 est l'autre moitié et 5 est entre eux. Nous traitons le n°5 dans ce cas comme s'il faisait partie des deux, c'est-à-dire qu'il est n°1 pour les deux chaînes virtuelles de LED
  • 10 LED: 10/2 vaut 5. Mais comme les ordinateurs comptent à partir de 0, nous devons en supprimer une. Ensuite, nous avons 0 - 4 pour une moitié et 5 - 9 pour l'autre. #1 pour la première chaîne virtuelle sera 4, et #1 pour la deuxième chaîne virtuelle sera #5.

Ensuite, dans notre code de particules, nous devons compter de notre position globale aux positions réelles sur la chaîne de LED:

if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Le code a également des conditions où la particule peut changer de direction, nous devons donc également en tenir compte:

if(particleDir) { if((currPos == NUM_LEDS/2) && oddLeds){ currPos = 0; } else if((currPos == NUM_LEDS/2 - 1) && (!oddLeds)){ currPos = 0; } else { currPos++; } } else { if((currPos == 0) && oddLeds){ currPos = centerLed; } else if((currPos == 0) && (!oddLeds)){ currPos = centerLed - 1; } else { currPos--; } }

Nous utilisons donc la direction voulue (particleDir) pour calculer quelle LED doit être allumée ensuite, mais nous devons également considérer si nous avons atteint soit l'extrémité réelle de la chaîne de LED, soit notre point central, qui sert également de fin pour chacune des chaînes virtuelles.

Une fois que nous avons compris tout cela, nous allumons la lumière suivante si nécessaire:

if(particleDir) { if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; } } else { if(oddLeds) { Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else { Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; } } leds[Pos1] = CHSV(currHue, 255, 255); leds[Pos2] = CHSV(currHue, 255, 255); FastLED.show();}

Pourquoi en faire une classe ? En l'état, c'est assez simple et n'a pas vraiment besoin d'être dans une classe. Cependant, j'ai des plans futurs pour mettre à jour le code pour permettre à plus d'une particule de se produire à la fois, et en faire fonctionner certaines à l'envers tandis que d'autres vont de l'avant. Je pense qu'il existe de très bonnes possibilités de détection de spin en utilisant plusieurs particules.

Conseillé: