Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduinoflok!

Componenten en benodigdheden

Arduino Nano R3
× 1

Over dit project

De sneeuwvlok bestaat uit 30 LED's die zijn gegroepeerd in 17 onafhankelijke segmenten die afzonderlijk kunnen worden bestuurd door Arduino Nano-microcontroller. Elke LED-groep kan worden gedimd met PWM om een ​​aantal mooie animaties te creëren.

Gereedschap

Het enige wat je nodig hebt is een soldeerbout, soldeer en een tang.

Bouw

Selecteer eerst een patroon. Ik kies een mooi en eenvoudig sneeuwvlokkristal en print het op het formaat dat Arduino Nano in de zeshoekige kern van het kristal past.

De draagstructuur die ook als bedrading fungeert, is gemaakt van 0,8 mm koperen staven die aan elkaar zijn gesoldeerd met tin. Ik heb in totaal 2 meter van de hengel gebruikt. Waarom vrije vorm? Omdat ik dat altijd al wilde proberen en het is een test van je geduld en vaardigheid.

Eerst heb ik een kernzeshoek gemaakt door een enkele staaf te buigen en de uiteinden aan elkaar te solderen. Door nog 6 staven aan de bovenkant van de zeshoek toe te voegen, is de aardingsbedrading voltooid, alle kathodedraden van LED's moeten er nu aan worden gesoldeerd om een ​​sneeuwvlokpatroon te creëren. Het lastige was het toevoegen van de SMD-LED's, maar ik hielp mezelf met een mal gemaakt van karton en dubbelzijdig plakband.

Vervolgens was het tijd om de Arduino Nano-microcontroller onder de kernstructuur toe te voegen, met voldoende ruimte ertussen om 3 lagen koperen staafbedrading te passen die de microcontroller-pinnen verbindt met alle LED-anodedraden. Dit vergde enorm veel geduld. U moet niet alleen kortsluiting tussen de draden vermijden, maar ook een stroombegrenzende weerstand toevoegen om het er mooi uit te laten zien.

Leaf-LED's zijn elk afzonderlijk verbonden met de dichtstbijzijnde Arduino-uitgangspen. Branch-LED's zijn per twee gegroepeerd en verbonden met PWM-pinnen. Kern-LED's zijn ook gegroepeerd per twee en verbonden met de rest van de pinnen. Arduino NANO heeft slechts 18 uitgangspinnen (A6 en A7 zijn alleen invoer) en ik heb één pin nodig voor de aanraaksensor, waardoor ik nog maar 17 pinnen over had, dus de twee paar kern-LED's zijn met elkaar verbonden om een ​​groep van 4 te creëren. gebruik 220Ω-weerstanden om de stroom door elke pin te beperken tot ongeveer 8mA. Dat betekent in totaal 240 mA, wat weinig hoog is voor de ATmega328-chip, maar het werkt - naar verluidt is het veilige maximum 200 mA.

Aanraaksensor

Om met een sneeuwvlok te kunnen communiceren, heb ik nog een koperen staaf toegevoegd om een ​​capacitieve aanraaksensor te creëren. Ik vond een geweldige bibliotheek en tutorial van Paul Stofregenen. De aanraaksensor wordt gebruikt om te communiceren met de arduinoflake - verander animatie, zet aan/uit, schitter bij aanraking, noem maar op...

Laatste opmerking

Vergeet niet alle diodes te controleren voordat u gaat solderen, het zal behoorlijk moeilijk zijn om ze te vervangen als ze kapot zijn of in omgekeerde polariteit zijn aangesloten.

Code

Oorspronkelijk dacht ik dat ik alleen de branch-LED's zou kunnen dimmen die zijn aangesloten op hardware-PWM-pinnen. Maar gelukkig bestaat er een geweldige software-PWM-bibliotheek waarmee ik alle pinnen kon gebruiken alsof het hardware-PWM was. Deze opstelling creëerde eindeloze mogelijkheden voor animaties! Bekijk de onderstaande code met enkele van de eerste animaties.

Code

  • sneeuwvlok.ino
snowflake.inoArduino
Broncode
#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 animatie =0;long touchAt =0;void loop() { switch (animatie) { case 0:_fill(100); pauze; geval 1:glanzende animatie(); //fadingAnimation(); pauze; geval 2:circleAnimation(); pauze; geval 3:loopAnimation(); pauze; geval 4:vuurwerkanimatie(); vuurwerkAnimatie(); vuurwerkAnimatie(); vuurwerkAnimatie(); vuurwerkAnimatie(); vuurwerkAnimatie(); animatie ++; pauze; geval 5:smileAnimation(); pauze; standaard:animatie =0; pauze; } int touchValue =touchSensor.read(); if (touchAt + 2000  1000) { touchAt =millis(); // touch down, cold-down time-out is 2s animatie ++; _fill(0); }}void fireworkAnimation() { for (int i =0; i <4; i++) { SoftPWMSet(innerLedPins[i], 100); vertraging (100); } SoftPWMSet (innerLedPins [4], 100); for (int i =0; i <6; i++) { SoftPWMSet(middleLedPins[i], 255); } vertraging(50); for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 0); SoftPWMSet(edgeLedPins[i], 255); } vertraging(50); for (int i =0; i <6; i++) { SoftPWMSet(middleLedPins[i], 0); } vertraging(50); _fill (0);} ongeldige 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); vertraging (2000); SoftPWMSet (innerLedPins [1], 0); SoftPWMSet (innerLedPins [3], 0); vertraging (100); SoftPWMSet (innerLedPins [1], 100); SoftPWMSet (innerLedPins [3], 100); vertraging (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; // helder} circleState[i] +=circleStateAnimation[i]; } for (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; // helder} waveState[i] +=waveStateAnimation[i]; } for (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; // helder} shinyState[i] +=shinyStateAnimation[i]; SoftPWMSet(edgeLedPins[i], shinyState[i]); } glanzendCounter ++; if (shinyCounter> 10) { shinyCounter =0; for (byte r =willekeurig (1, 3); r> 0; r--) { willekeurig byteLed =willekeurig (0, 12); if (randomLed <6) { SoftPWMSet (innerLedPins [random (0, 6)], 255); } else { SoftPWMSet(middleLedPins[random(0, 6)], 255); } } } else { for (int i =0; i <6; i++) { SoftPWMSet(innerLedPins[i], 20); SoftPWMSet(middleLedPins[i], 20); } } delay (30);}byte fadingState[] ={0, 100, 0, 100, 0, 100};byte 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; // helder } fadingState [i] +=fadingStateAnimation [i]; SoftPWMSet(edgeLedPins[i], fadingState[i]); SoftPWMSet(middleLedPins[_nextIndex(i, 1)], fadingState[i]); SoftPWMSet(innerLedPins[i], 50); } delay (20);} ongeldig _fill (byte-waarde) { for (int i =0; i <6; i++) { SoftPWMSet (edgeLedPins [i], value); SoftPWMSet(middleLedPins[i], waarde); SoftPWMSet(innerLedPins[i], waarde); }}byte _prevIndex(korte index, bytestap) {index -=stap; terwijl (index <0) { index +=6; } retourindex;} byte _nextIndex (korte index, bytestap) { index +=stap; while (index> 5) { index -=6; } retourindex;}

Schema's


Productieproces

  1. Waar worden paspennen voor gebruikt?
  2. Waar zijn paspennen van gemaakt?
  3. 5 dingen om te overwegen bij het kiezen van paspennen
  4. Deegrol
  5. Bowlingspeld
  6. Veiligheidsspeld
  7. Ultra low-power systeem pinnen AI hoopt op TinyML
  8. Raspberry PI I/O Breakout-kabel en plugboardadapter
  9. Dynamische driehoekskunst
  10. DHT11-sensor met LED's en een piëzo-luidspreker
  11. BGA's – wat zijn ze?