Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Arduinoflake !

Composants et fournitures

Arduino Nano R3
× 1

À propos de ce projet

Le flocon de neige se compose de 30 LED regroupées en 17 segments indépendants qui peuvent être contrôlés séparément par le microcontrôleur Arduino Nano. Chacun des groupes de LED peut être atténué avec PWM pour créer de belles animations.

Outils

Tout ce dont vous aurez besoin est du fer à souder, de la soudure et des pinces.

Bâtiment

Tout d'abord, sélectionnez un motif. Je choisis un joli et simple cristal de flocon de neige et l'imprime à la taille adaptée à l'Arduino Nano à l'intérieur de l'hexagone - noyau du cristal.

La structure de support qui sert également de câblage est créée à partir de tiges de laiton de 0,8 mm soudées avec de l'étain. J'ai utilisé 2m de tige au total. Pourquoi la forme libre ? Parce que j'ai toujours voulu essayer ça et c'est un test de votre patience et de vos compétences.

J'ai d'abord créé un noyau hexagonal en pliant une seule tige et en soudant les extrémités ensemble. En ajoutant 6 autres tiges au sommet de l'hexagone, le câblage de masse est terminé, tous les fils cathodiques des LED doivent maintenant y être soudés pour créer un motif de flocon de neige. La partie délicate a été d'ajouter les LED SMD mais je me suis servi d'un gabarit créé à partir d'un carton et d'un scotch double face.

Ensuite, il était temps d'ajouter le microcontrôleur Arduino Nano sous la structure centrale en laissant suffisamment d'espace entre les 3 couches de câblages en laiton qui connecteront les broches du microcontrôleur à tous les fils d'anode LED. Cela a demandé une énorme patience. Non seulement vous devez éviter un court-circuit entre les fils, mais aussi ajouter une résistance de limitation de courant et lui donner une belle apparence.

Les LED Leaf sont connectées séparément chacune à la broche de sortie de l'Arduino la plus proche. Les LED de branche sont regroupées par deux et connectées à des broches PWM. Les LED de base sont également regroupées par deux et connectées au reste des broches. Arduino NANO n'a que 18 broches de sortie (A6 et A7 sont des entrées uniquement) et j'ai besoin d'une broche pour le capteur tactile, ce qui ne m'a laissé que 17 broches, donc les deux paires de LED principales sont connectées ensemble pour créer un groupe de 4. Je J'utilise des résistances de 220 Ω pour limiter le courant circulant dans chaque broche à environ 8 mA. Cela signifie 240mA au total, ce qui est peu élevé pour la puce ATmega328 mais cela fonctionne - le maximum de sécurité est dit de 200mA.

Capteur tactile

Pour pouvoir interagir avec un flocon de neige, j'ai ajouté une autre tige en laiton pour créer un capteur tactile capacitif. J'ai trouvé une excellente bibliothèque et un tutoriel de Paul Stoffregen. Le capteur tactile est utilisé pour interagir avec l'arduinoflake - changer l'animation, allumer/éteindre, scintiller au toucher, nommez-le...

Remarque finale

N'oubliez pas de vérifier toutes les diodes avant de souder, il sera assez difficile de les échanger si elles sont cassées ou connectées en polarité inversée.

Code

À l'origine, je pensais que je ne pourrais assombrir que les LED de branche connectées aux broches PWM matérielles. Mais heureusement, il existe une bibliothèque logicielle PWM impressionnante qui m'a permis d'utiliser toutes les broches comme s'il s'agissait de PWM matériel. Cette configuration a créé des possibilités infinies pour les animations ! Découvrez le code ci-joint avec quelques-unes des premières animations.

Code

  • flocon de neige.ino
flocon de neige.inoArduino
Code source
#include "SoftPWM.h"#include byte edgeLedPins[] ={13, A4, A5, 2, 8, 12};byte middleLedPins[] ={10, 6, 3, 5, 9, 11};byte innerLedPins[] ={A2, A3, A1, 4, 7, A1};ADCTouchSensor touchSensor =ADCTouchSensor(A0, 1); void setup() { Serial.begin(115200); SoftPWMBegin();}byte animation =0;long touchAt =0;void loop() { switch (animation) { case 0:_fill(100); Pause; cas 1 :shinyAnimation(); //fadingAnimation(); Pause; cas 2 :circleAnimation(); Pause; cas 3 :loopAnimation(); Pause; cas 4:fireworkAnimation(); feud'artificeAnimation(); feud'artificeAnimation(); feud'artificeAnimation(); feud'artificeAnimation(); feud'artificeAnimation(); animation ++; Pause; cas 5 :smileAnimation(); Pause; par défaut :animation =0; Pause; } int touchValue =touchSensor.read(); if (touchAt + 2000  1000) { touchAt =millis(); // toucher le sol, le délai d'attente à froid est une animation de 2 s ++; _fill(0); }}void fireworkAnimation() { pour (int i =0; i <4; i++) { SoftPWMSet(innerLedPins[i], 100); retard (100); } SoftPWMSet(innerLedPins[4], 100); pour (int i =0; i <6; i++) { SoftPWMSet(middleLedPins[i], 255); } retard (50); for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 0); SoftPWMSet(edgeLedPins[i], 255); } retard (50); for (int i =0; i <6; i++) { SoftPWMSet(middleLedPins[i], 0); } retard (50); _fill(0);}void smileAnimation() { SoftPWMSet(innerLedPins[1], 100); SoftPWMSet(innerLedPins[3], 100); SoftPWMSet(middleLedPins[0], 255); SoftPWMSet(middleLedPins[5], 255); SoftPWMSet(edgeLedPins[2], 255); SoftPWMSet(edgeLedPins[3], 255); retard (2000); SoftPWMSet(innerLedPins[1], 0); SoftPWMSet(innerLedPins[3], 0); retard (100); SoftPWMSet(innerLedPins[1], 100); SoftPWMSet(innerLedPins[3], 100); retard (100); SoftPWMSet(innerLedPins[1], 0); SoftPWMSet(innerLedPins[3], 0); delay(100);}byte circleState[] ={100, 55, 10};byte circleStateAnimation[] ={1, 1, 1};void circleAnimation() { for (int i =0; i <3; i++) { if (circleState[i]>=100) { circleStateAnimation[i] =-1; // dim } else if (circleState[i] <=10) { circleStateAnimation[i] =1; // lumineux } circleState[i] +=circleStateAnimation[i]; } pour (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], circleState[0]); SoftPWMSet(middleLedPins[i], circleState[1]); SoftPWMSet(edgeLedPins[i], circleState[2]); } delay(5);}byte waveState[] ={100, 55, 10, 10, 55, 100};byte waveStateAnimation[] ={1, 1, 1, -1, -1, -1};void waveAnimation () { for (int i =0; i <6; i++) { if (waveState[i]>=100) { waveStateAnimation[i] =-1; // dim } else if (waveState[i] <=10) { waveStateAnimation[i] =1; // lumineux } waveState[i] +=waveStateAnimation[i]; } pour (int i =0; i <6; i+=2) { SoftPWMSet(innerLedPins[i], waveState[0]); SoftPWMSet(middleLedPins[i], waveState[1]); SoftPWMSet(edgeLedPins[i], waveState[2]); SoftPWMSet(innerLedPins[i + 1], waveState[3]); SoftPWMSet(middleLedPins[i + 1], waveState[4]); SoftPWMSet(edgeLedPins[i + 1], waveState[5]); } delay(10);}byte loopCounter =0;byte loopState =150;void loopAnimation() { SoftPWMSet(innerLedPins[loopCounter], loopState); SoftPWMSet(middleLedPins[loopCounter], loopState); SoftPWMSet(edgeLedPins[loopCounter], loopState); loopCounter =_nextIndex(loopCounter, 1); if (loopCounter ==0) { loopState =(loopState ==150 ? 0 :150); } delay(100);}byte slowOnCounter =0;byte slowOnState =150;void slowOnAnimation() { byte randomLed =random(0, 18); if (randomLed <6) { SoftPWMSet(innerLedPins[randomLed], slowOnState); } else if (randomLed <12) { SoftPWMSet(middleLedPins[randomLed - 6], slowOnState); } else { SoftPWMSet(edgeLedPins[randomLed - 12], slowOnState); } slowOnCounter ++; if (slowOnCounter>=50) { slowOnCounter =0; slowOnState =(slowOnState ==150 ? 0 :150); } delay(50);}byte shinyState[] ={0, 100, 0, 100, 0, 100};byte shinyStateAnimation[] ={1, 1, 1, 1, 1, 1};byte shinyCounter =0; void shinyAnimation() { for (int i =0; i <6; i++) { if (shinyState[i]>=100) { shinyStateAnimation[i] =-1; // dim } else if (shinyState[i] <=0) { shinyStateAnimation[i] =1; // brillant } shinyState[i] +=shinyStateAnimation[i]; SoftPWMSet(edgeLedPins[i], shinyState[i]); } shinyCounter ++; if (ShinyCounter> 10) { shinyCounter =0; for (octet r =aléatoire (1, 3) ; r> 0 ; r--) { octet randomLed =aléatoire (0, 12); if (randomLed <6) { SoftPWMSet(innerLedPins[random(0, 6)], 255); } else { SoftPWMSet(middleLedPins[random(0, 6)], 255); } } } else { pour (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 20); SoftPWMSet(middleLedPins[i], 20); } } délai(30);}octet fadingState[] ={0, 100, 0, 100, 0, 100};octet fadingStateAnimation[] ={1, 1, 1, 1, 1, 1};void fadingAnimation() { for (int i =0; i <6; i++) { if (fadingState[i]>=100) { fadingStateAnimation[i] =-1; // dim } else if (fadingState[i] <=0) { fadingStateAnimation[i] =1; // lumineux } fadingState[i] +=fadingStateAnimation[i]; SoftPWMSet(edgeLedPins[i], fadingState[i]); SoftPWMSet(middleLedPins[_nextIndex(i, 1)], fadingState[i]); SoftPWMSet(innerLedPins[i], 50); } delay(20);}void _fill(byte value) { for (int i =0; i <6; i++) { SoftPWMSet(edgeLedPins[i], value); SoftPWMSet(middleLedPins[i], valeur); SoftPWMSet(innerLedPins[i], valeur); }}byte _prevIndex(short index, byte step) { index -=step; while (index <0) { index +=6; } return index;}byte _nextIndex(short index, byte step) { index +=step; while (index> 5) { index -=6; } indice de retour ;}

Schémas


Processus de fabrication

  1. A quoi servent les goujons ?
  2. De quoi sont faites les goupilles?
  3. 5 éléments à prendre en compte lors du choix des goupilles
  4. Rolling Pin
  5. Épingle de bowling
  6. Épingle de sécurité
  7. Le système à ultra faible consommation épingle les espoirs de l'IA sur TinyML
  8. Câble de dérivation d'E/S Raspberry PI et adaptateur de carte de connexion
  9. Les BGA – Que sont-ils ?