Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduinoflake!

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1

Über dieses Projekt

Die Schneeflocke besteht aus 30 LEDs, die in 17 unabhängige Segmente gruppiert sind, die separat vom Arduino Nano-Mikrocontroller gesteuert werden können. Jede der LED-Gruppen kann mit PWM gedimmt werden, um einige schöne Animationen zu erstellen.

Werkzeuge

Alles, was Sie brauchen, ist Lötkolben, Lötzinn und eine Zange.

Bau

Wählen Sie zunächst ein Muster aus. Ich wähle einen schönen und einfachen Schneeflockenkristall aus und drucke ihn auf die Größe, um Arduino Nano in den Sechseck-Kern des Kristalls zu passen.

Die Trägerstruktur, die auch als Verdrahtung dient, besteht aus 0,8 mm Messingstäben, die mit Zinn verlötet sind. Ich habe insgesamt 2m der Rute verbraucht. Warum Freiform? Denn das wollte ich schon immer mal ausprobieren und es ist ein Test für deine Geduld und dein Geschick.

Zuerst habe ich ein Kernsechskant erstellt, indem ich einen einzelnen Stab gebogen und die Enden zusammengelötet habe. Durch Hinzufügen weiterer 6 Stäbe an den Oberseiten des Sechsecks ist die Masseverdrahtung abgeschlossen, alle Kathodenleitungen der LEDs müssen nun daran gelötet werden, um ein Schneeflockenmuster zu erzeugen. Der knifflige Teil war das Hinzufügen der SMD-LEDs, aber ich half mir mit einer Schablone aus Pappe und doppelseitigem Klebeband.

Als nächstes war es an der Zeit, den Arduino Nano-Mikrocontroller unter der Kernstruktur hinzuzufügen und genügend Platz dazwischen zu lassen, um 3 Lagen Messingstabverdrahtungen zu passen, die die Mikrocontroller-Pins mit allen LED-Anodenleitungen verbinden. Dies erforderte eine enorme Geduld. Sie müssen nicht nur einen Kurzschluss zwischen den Drähten vermeiden, sondern auch einen Strombegrenzungswiderstand hinzufügen und ihn schön aussehen lassen.

Blatt-LEDs sind jeweils separat mit dem nächsten Arduino-Ausgangspin verbunden. Zweig-LEDs sind zu zweit gruppiert und mit PWM-Pins verbunden. Core-LEDs werden ebenfalls zu zweit gruppiert und mit den restlichen Pins verbunden. Arduino NANO hat nur 18 Ausgangspins (A6 und A7 sind nur Eingänge) und ich brauche einen Pin für den Berührungssensor, der mir nur 17 Pins übrig ließ, sodass die beiden Paare von Kern-LEDs miteinander verbunden sind, um eine Gruppe von 4 zu bilden Ich verwende 220-Ω-Widerstände, um den durch jeden Pin fließenden Strom auf etwa 8 mA zu begrenzen. Das bedeutet insgesamt 240 mA, was für den ATmega328-Chip etwas hoch ist, aber es funktioniert - das sichere Maximum soll 200 mA betragen.

Berührungssensor

Um mit einer Schneeflocke interagieren zu können, habe ich einen weiteren Messingstab hinzugefügt, um einen kapazitiven Berührungssensor zu erstellen. Ich habe eine tolle Bibliothek und ein Tutorial von Paul Stoffregen gefunden. Der Berührungssensor wird verwendet, um mit der Arduinoflake zu interagieren - Animation ändern, ein- / ausschalten, bei Berührung funkeln, was auch immer ...

Abschließende Anmerkung

Vergessen Sie nicht, alle Dioden vor dem Löten zu überprüfen, es wird ziemlich schwierig sein, sie auszutauschen, wenn sie defekt oder verpolt angeschlossen sind.

Code

Ursprünglich dachte ich, dass ich nur die Zweig-LEDs dimmen kann, die an Hardware-PWM-Pins angeschlossen sind. Aber zum Glück gibt es eine großartige Software-PWM-Bibliothek, die es mir ermöglicht, alle Pins wie Hardware-PWM zu verwenden. Dieses Setup bietet endlose Möglichkeiten für Animationen! Sehen Sie sich den unten angehängten Code mit einigen der ersten Animationen an.

Code

  • schneeflocke.ino
schneeflocke.inoArduino
Quellcode
#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); brechen; Fall 1:ShinyAnimation(); // verblassenAnimation (); brechen; Fall 2:circleAnimation(); brechen; Fall 3:loopAnimation(); brechen; Fall 4:FeuerwerkAnimation(); FeuerwerkAnimation(); FeuerwerkAnimation(); FeuerwerkAnimation(); FeuerwerkAnimation(); FeuerwerkAnimation(); Animation ++; brechen; Fall 5:smileAnimation(); brechen; Standard:Animation =0; brechen; } int touchValue =touchSensor.read(); if (touchAt + 2000  1000) { touchAt =millis (); // Aufsetzen, Zeitüberschreitung beim Abkühlen beträgt 2s Animation ++; _fill(0); }}void fireworkAnimation() { for (int i =0; i <4; i++) { SoftPWMSet (innerLedPins[i], 100); Verzögerung (100); } SoftPWMSet(innerLedPins[4], 100); for (int i =0; i <6; i++) { SoftPWMSet (middleLedPins[i], 255); } Verzögerung (50); for (int i =0; i <6; i++) { SoftPWMSet (innerLedPins[i], 0); SoftPWMSet(edgeLedPins[i], 255); } Verzögerung (50); for (int i =0; i <6; i++) { SoftPWMSet (middleLedPins[i], 0); } Verzögerung (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); Verzögerung (2000); SoftPWMSet (innerLedPins[1], 0); SoftPWMSet(innerLedPins[3], 0); Verzögerung (100); SoftPWMSet(innerLedPins[1], 100); SoftPWMSet(innerLedPins[3], 100); Verzögerung (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; // hell } 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; // hell } 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); } Verzögerung (100);} Byte slowOnCounter =0; Byte slowOnState =150;void slowOnAnimation () { Byte randomLed =random (0, 18); if (randomLed <6) { SoftPWMSet (innerLedPins [randomLed], slowOnState); aufrechtzuerhalten. Sonst if (randomLed <12) { SoftPWMSet (middleLedPins [randomLed - 6], slowOnState); aufrechtzuerhalten. Else { SoftPWMSet (edgeLedPins [randomLed - 12], slowOnState); } slowOnCounter ++; if (slowOnCounter>=50) { slowOnCounter =0; slowOnState =(slowOnState ==150 ? 0 :150); } Verzögerung (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; // hell } ShinyState[i] +=ShinyStateAnimation[i]; SoftPWMSet(edgeLedPins[i], ShinyState[i]); } ShinyCounter ++; if (shinyCounter> 10) { ShinyCounter =0; for (Byte r =random(1, 3); r> 0; r--) { byte randomLed =random (0, 12); if (randomLed <6) { SoftPWMSet (innerLedPins [random (0, 6)], 255); aufrechtzuerhalten. Else { SoftPWMSet (middleLedPins [zufällig (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; // hell} 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], Wert); SoftPWMSet(innerLedPins[i], Wert); }}Byte _prevIndex (kurzer Index, Byteschritt) { Index -=Schritt; während (Index <0) { Index + =6; } Index zurückgeben;} Byte _nextIndex (kurzer Index, Byte-Schritt) { Index + =Schritt; während (Index> 5) { Index -=6; } Index zurückgeben;}

Schaltpläne


Herstellungsprozess

  1. Wofür werden Passstifte verwendet?
  2. Woraus bestehen Passstifte?
  3. 5 Dinge, die Sie bei der Auswahl von Passstiften beachten sollten
  4. Nudelholz
  5. Bowling-Pin
  6. Sicherheitsnadel
  7. Ultra-Low-Power-System fixiert KI-Hoffnungen auf TinyML
  8. Raspberry PI I/O Breakout-Kabel und Plugboard-Adapter
  9. Dynamische Dreieckskunst
  10. BGAs – was sind sie?