Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

¡Arduinoflake!

Componentes y suministros

Arduino Nano R3
× 1

Acerca de este proyecto

El copo de nieve consta de 30 LED agrupados en 17 segmentos independientes que se pueden controlar por separado mediante el microcontrolador Arduino Nano. Cada uno de los grupos de LED se puede atenuar con PWM para crear hermosas animaciones.

Herramientas

Todo lo que necesitará es soldador, soldadura y alicates.

Construcción

En primer lugar, seleccione algún patrón. Elijo un bonito y simple cristal de copo de nieve y lo imprimo al tamaño adecuado para que quepa Arduino Nano dentro del hexágono - núcleo del cristal.

La estructura de soporte, que también actúa como cableado, se crea a partir de varillas de latón de 0,8 mm soldadas con estaño. He usado 2 m de la caña en total. ¿Por qué el formato libre? Porque siempre quise intentarlo y es una prueba de tu paciencia y habilidad.

Primero creé un núcleo hexagonal doblando una sola varilla y soldé los extremos. Al agregar otras 6 varillas a la parte superior del hexágono, el cableado de tierra está completo, todos los cables del cátodo de los LED ahora deben soldarse para crear un patrón de copo de nieve. La parte complicada fue agregar los LED SMD, pero me ayudé con una plantilla creada a partir de un cartón y una cinta de doble cara.

A continuación, llegó el momento de agregar el microcontrolador Arduino Nano debajo de la estructura del núcleo, dejando suficiente espacio en el medio para colocar 3 capas de cables de varilla de latón que conectarán los pines del microcontrolador a todos los cables del ánodo LED. Esto requirió una gran cantidad de paciencia. No solo necesita evitar un cortocircuito entre los cables, sino que también debe agregar una resistencia limitadora de corriente y hacer que se vea bien.

Los LED de hoja se conectan por separado cada uno al pin de salida de Arduino más cercano. Los LED de rama se agrupan de dos y se conectan a los pines PWM. Los LED centrales también se agrupan en dos y se conectan al resto de los pines. Arduino NANO tiene solo 18 pines de salida (A6 y A7 son solo de entrada) y necesito un pin para el sensor táctil, eso me dejó con solo 17 pines, por lo que los dos pares de LED centrales están conectados entre sí para crear un grupo de 4. I Estoy usando resistencias de 220 Ω para limitar la corriente que fluye a través de cada pin a alrededor de 8 mA. Eso significa 240 mA en total, que es un poco alto para el chip ATmega328, pero funciona; se dice que el máximo seguro es 200 mA.

Sensor táctil

Para poder interactuar con un copo de nieve, agregué otra varilla de latón para crear un sensor táctil capacitivo. Encontré una gran biblioteca y un tutorial de Paul Stoffregen. El sensor táctil se usa para interactuar con el arduinoflake:cambiar la animación, encender / apagar, brillar cuando se toca, lo que sea ...

Nota final

No olvide comprobar todos los diodos antes de soldar, será bastante difícil cambiarlos si están rotos o conectados en polaridad invertida.

Código

Originalmente pensé que solo podría atenuar los LED de rama que están conectados a los pines PWM de hardware. Pero afortunadamente existe una increíble biblioteca de software PWM que me permitió usar todos los pines como si fueran hardware PWM. ¡Esta configuración creó infinitas posibilidades para las animaciones! Consulte el código adjunto a continuación con algunas de las primeras animaciones.

Código

  • snowflake.ino
copo de nieve.ino Arduino
Código fuente
 #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); configuración vacía () {Serial.begin (115200); SoftPWMBegin ();} animación de bytes =0; touchAt largo =0; bucle vacío () {cambiar (animación) {caso 0:_fill (100); descanso; caso 1:shinyAnimation (); // fadingAnimation (); descanso; caso 2:circleAnimation (); descanso; caso 3:loopAnimation (); descanso; caso 4:fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); fireworkAnimation (); animación ++; descanso; caso 5:smileAnimation (); descanso; predeterminado:animación =0; descanso; } int touchValue =touchSensor.read (); if (touchAt + 2000  1000) {touchAt =millis (); // aterrizar, el tiempo de espera en frío es 2s animation ++; _fill (0); }} void fireworkAnimation () {for (int i =0; i <4; i ++) {SoftPWMSet (innerLedPins [i], 100); retraso (100); } SoftPWMSet (innerLedPins [4], 100); para (int i =0; i <6; i ++) {SoftPWMSet (middleLedPins [i], 255); } retraso (50); para (int i =0; i <6; i ++) {SoftPWMSet (innerLedPins [i], 0); SoftPWMSet (edgeLedPins [i], 255); } retraso (50); para (int i =0; i <6; i ++) {SoftPWMSet (middleLedPins [i], 0); } retraso (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); retraso (2000); SoftPWMSet (innerLedPins [1], 0); SoftPWMSet (innerLedPins [3], 0); retraso (100); SoftPWMSet (innerLedPins [1], 100); SoftPWMSet (innerLedPins [3], 100); retraso (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; // atenuar} else if (circleState [i] <=10) {circleStateAnimation [i] =1; // brillante} circleState [i] + =circleStateAnimation [i]; } para (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; // brillante} waveState [i] + =waveStateAnimation [i]; } para (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; // atenuar} else if (shinyState [i] <=0) {shinyStateAnimation [i] =1; // brillante} shinyState [i] + =shinyStateAnimation [i]; SoftPWMSet (edgeLedPins [i], shinyState [i]); } shinyCounter ++; if (contador brillante> 10) {contador brillante =0; para (byte r =aleatorio (1, 3); r> 0; r--) {byte randomLed =aleatorio (0, 12); if (randomLed <6) {SoftPWMSet (innerLedPins [random (0, 6)], 255); } else {SoftPWMSet (middleLedPins [aleatorio (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; // brillante} fadingState [i] + =fadingStateAnimation [i]; SoftPWMSet (edgeLedPins [i], fadingState [i]); SoftPWMSet (middleLedPins [_nextIndex (i, 1)], fadingState [i]); SoftPWMSet (innerLedPins [i], 50); } delay (20);} void _fill (valor de byte) {for (int i =0; i <6; i ++) {SoftPWMSet (edgeLedPins [i], value); SoftPWMSet (middleLedPins [i], valor); SoftPWMSet (innerLedPins [i], valor); }} byte _prevIndex (índice corto, paso de byte) {índice - =paso; while (índice <0) {índice + =6; } índice de retorno;} byte _nextIndex (índice corto, paso de byte) {índice + =paso; while (índice> 5) {índice - =6; } índice de retorno;} 

Esquemas


Proceso de manufactura

  1. ¿Para qué se utilizan los pasadores?
  2. ¿De qué están hechos los pasadores?
  3. 5 aspectos a tener en cuenta al elegir pasadores
  4. Rodillo
  5. Pin de bolos
  6. Pin de seguridad
  7. Pines del sistema de ultra bajo consumo que AI espera en TinyML
  8. Raspberry PI I / O Breakout cable y adaptador de placa de conexiones
  9. Arte del triángulo dinámico
  10. Sensor DHT11 con LED y altavoz piezoeléctrico
  11. BGA:¿qué son?