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

PuzzleBox

Componentes y suministros

Arduino MKR IoT Bundle
× 1

Aplicaciones y servicios en línea

Blynk

Acerca de este proyecto

Nota:este tutorial podría estar desactualizado, vaya aquí para una versión más actual.

Mantener sus objetos valiosos lejos de miradas indiscretas puede ser difícil a veces, a menos que los ponga en una caja fuerte grande o algo similar ... pero ¿quién tiene espacio para eso?

En su lugar, cree su propia caja de rompecabezas con los componentes del paquete MKR IoT y algo de cartón. No podemos garantizar la seguridad de sus pertenencias, pero al menos será un elemento de disuasión divertido para los posibles ladrones.

Por supuesto, le recomendamos que guarde dulces allí ... no objetos de valor reales.

En pocas palabras

Para abrir la caja, que se mantiene cerrada con un servomotor, tendrás que girar los potenciómetros hasta obtener la combinación correcta. La combinación se puede configurar a través de la aplicación en línea Blynk. Un LED lo ayudará a adivinar, brindándole retroalimentación de color:cuanto más cerca esté, más cálido será el color.

Cuando se adivina la combinación correcta, el zumbador comenzará a reproducir una canción mientras que el servo abrirá la caja.

Para crear nuestra caja de rompecabezas, necesitaremos los siguientes componentes:

  • Timbre
  • LED RGB
  • 3 potenciómetros
  • Pantalla LCD
  • Servomotor

Objetivos de aprendizaje

  • Presentamos la plataforma de Internet Blynk
  • Cableado y uso de la pantalla LCD
  • Jugar al tema de Star Wars con el timbre

¿Quiere saber más?

Este tutorial es parte de una serie de experimentos que lo familiarizarán con MKR1000 e IoT. Todos los experimentos se pueden construir utilizando los componentes incluidos en el MKR IoT Bundle.

  • Almohada Te Amo
  • Caja de rompecabezas
  • El gato de Pavlov
  • El empollón
  • Comunicador de planta

Presentamos a Blynk

Blynk es una aplicación móvil popular para Internet de las cosas, que nos permite controlar fácilmente nuestro Arduino conectado a Internet desde cualquier lugar, en cualquier momento.

Se fundó en Kickstarter y rápidamente se convirtió en una de las aplicaciones más utilizadas en este campo, gracias tanto a su increíble documentación como a su simplicidad.

Introducción a Blynk

Crear un nuevo proyecto es realmente fácil, solo siga estos sencillos pasos o eche un vistazo al inicio oficial de Blynk.

Una vez que haya creado correctamente un nuevo proyecto, también debería recibir por correo el Token de autenticación. Es un identificador único que se necesita para conectar su hardware a su teléfono inteligente. Cada nuevo proyecto que cree tendrá su propio token de autenticación.

Para conectar Arduino a la aplicación, necesitaremos instalar la biblioteca Blynk. Si está utilizando Arduino Web Editor, la biblioteca se descargará automáticamente cuando la incluya en el boceto; de lo contrario, puede descargarla desde el administrador de la biblioteca.

Ahora estamos listos para empezar. Cargar este boceto y juega con los controles deslizantes para ver el resultado:

  #include  #include  const char * ssid =SECRET_SSID; // el SSID de su red (nombre) const char * contraseña =SECRET_PSWD; // su contraseña de red char auth [] =SECRET_TOKEN; // su token API de Blynk // Variables para almacenar el valor de combinación // Establezca la combinación inicial en (1 1 1) int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1; // Funciones de Blynk para recuperar valores BLYNK_WRITE (V1) {SliderValueOne =param.asInt (); // asignando valor entrante desde el pin V1 a una variable} BLYNK_WRITE (V2) {SliderValueTwo =param.asInt (); // asignando valor entrante desde el pin V1 a una variable} BLYNK_WRITE (V3) {SliderValueThree =param.asInt (); // asignando valor entrante desde el pin V1 a una variable} void setup () {Serial.begin (9600); Blynk.begin (auth, ssid, contraseña); // iniciar las funcionalidades de Blynk y conectarse a WiFi} void loop () {// Variambles para almacenar temporalmente la combinación int Temp_Slider_One_value =SliderValueOne; int Temp_Slider_Two_value =SliderValueTwo; int Temp_Slider_Three_value =SliderValueThree; Blynk.run (); // sondear nuevos valores de combinación desde la aplicación en línea // comprobar si los valores de combinación han cambiado e imprimirlos en la consola si (Temp_Slider_One_value! =SliderValueOne || Temp_Slider_Two_value! =SliderValueTwo || Temp_Slider_Three_value! =SliderValueThree) {New Serial.print combinación:"); Serial.print (SliderValueOne); Serial.print (""); Serial.print (SliderValueTwo); Serial.print (""); Serial.println (SliderValueThree); }}  

Uso de la pantalla LCD

¡Es hora de conectar la pantalla!

La pantalla LCD es fácil de usar pero requiere muchos cables, así que esté preparado para demostrar su paciencia.

Tenga en cuenta que estamos utilizando una fuente de alimentación de 5 V y una resistencia de 220 ohmios.

El brillo se puede regular cambiando el valor de salida del pin analógico 3 de 0 a 255, siendo 0 el valor máximo.

  analogWrite (A3, 0);  

Ahora podemos cargar el boceto de ejemplo y ver si todo funciona bien.

  // incluye el código de la biblioteca:#include  // inicializa la biblioteca asociando cualquier pin de interfaz LCD necesario // con el número de pin arduino al que está conectado const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); configuración vacía () {analogWrite (A3, 0); // Establecer el brillo a su valor máximo // configurar el número de columnas y filas de la pantalla LCD:lcd.begin (16, 2); // Imprime un mensaje en la pantalla LCD. lcd.print ("¡hola, mundo!"); } void loop () {// coloca el cursor en la columna 0, línea 1 // (nota:la línea 1 es la segunda fila, ya que el conteo comienza con 0):lcd.setCursor (0, 1); // imprime el número de segundos desde el reinicio:lcd.print (millis () / 1000); }  

Agregar potenciómetros

Para leer el valor de los potenciómetros solo necesitaremos un analogRead () en el pin correcto. Los estamos conectando al pin analógico 0, 1, 2.

Tenga en cuenta que el valor de un potenciómetro va de 0 a 1023, lo que hace que la combinación sea imposible de adivinar. Para mapear esos valores de 0 a 9 usaremos el map () función,

  int PotOne =map (analogRead (A0), 0, 1023, 0, 9);  

Puede utilizar este código de ejemplo para imprimir en la pantalla LCD los valores de los potenciómetros.

  #include  // Pines de la pantalla LCD const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); configuración vacía () {analogWrite (A3, 0); // establece el brillo de la pantalla LCD en el valor máximo Serial.begin (9600); lcd. comienzo (16, 2); // comienza la pantalla LCD con 16 columnas y 2 filas} void loop () {int PotOne =map (analogRead (A0), 0, 1023, 0, 9); int PotTwo =mapa (analogRead (A1), 0, 1023, 0, 9); int PotThree =mapa (analogRead (A2), 0, 1023, 0, 9); lcd.setCursor (0, 0); lcd.print (PotOne); lcd.setCursor (2, 0); lcd.print (PotTwo); lcd.setCursor (4, 0); lcd.print (PotThree); }  

Agrega el LED RGB

Usaremos el LED RGB como retroalimentación para ayudar a las personas a adivinar la combinación, cuanto más se acerquen al valor correcto, más cálido será el color del LED, que abarca desde azul, aguamarina, amarillo y rojo.

¡Puede usar este boceto de ejemplo para ver el RGB en acción!

  // Pines LED RGB int redPin =6; int greenPin =8; int bluePin =7; configuración vacía () {pinMode (redPin, SALIDA); pinMode (greenPin, SALIDA); pinMode (bluePin, SALIDA); Serial.begin (9600); } bucle vacío () {setColor (0, 0, 255); // retraso azul (1000); setColor (0, 255, 255); // aqua delay (1000); setColor (255, 255, 0); // retraso amarillo (1000); setColor (255, 0, 0); // Retraso rojo (1000); } // Enviar valores RGB a los pines LED void setColor (int red, int green, int blue) {analogWrite (redPin, red); analogWrite (greenPin, verde); analogWrite (bluePin, azul); }  

Conéctelo a Blynk

Ahora estamos listos para armar las cosas:conecte la placa a Blynk, el potenciómetro a la pantalla LCD y haga que el LED parpadee en verde cuando la combinación sea correcta.

  • Tenga en cuenta que usaremos la función giveColorFeedback () para configurar el color del LED cuando el valor absoluto de cada potenciómetro está más cerca de un cierto umbral de la combinación correcta.
  void giveColorFeedback (int PotOne, int PotTwo, int PotThree) {...}  
  • También usaremos estas variables para almacenar los valores enviados desde la aplicación y, por lo tanto, la combinación.
  int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1;  

Tenga en cuenta que el valor inicial se establece en 1, solo cambiará si modifica los valores de los controles deslizantes en la aplicación. Si restablece la placa, la combinación volverá al valor predeterminado.

  • Una variable booleana bool start =true; se utiliza para detectar cuándo ya se ha adivinado la combinación, para evitar volver a abrir la caja en cada bucle.

Sube este boceto de ejemplo para verlo en acción:

  #include  #include  #include  #include  // Pines LED RGB int redPin =6; int greenPin =8; int bluePin =7; const char * ssid =SECRET_SSID; // el SSID de su red (nombre) const char * contraseña =SECRET_PSWD; // su contraseña de red char auth [] =SECRET_TOKEN; // su token API de Blynk // Pines de la pantalla LCD const int rs =12, en =11, d4 =2, d5 =3, d6 =4, d7 =5; inicio bool =verdadero; // Variables para almacenar el valor de la combinación // Establecer la combinación inicial en (1 1 1) int SliderValueOne =1; int SliderValueTwo =1; int SliderValueThree =1; // Funciones de Blynk para recuperar valores BLYNK_WRITE (V1) {SliderValueOne =param.asInt (); // asignando valor entrante desde el pin V1 a una variable} BLYNK_WRITE (V2) {SliderValueTwo =param.asInt (); // asignando valor entrante desde el pin V1 a una variable} BLYNK_WRITE (V3) {SliderValueThree =param.asInt (); // asignando valor entrante desde el pin V1 a una variable} LiquidCrystal lcd (rs, en, d4, d5, d6, d7); configuración vacía () {pinMode (redPin, SALIDA); pinMode (greenPin, SALIDA); pinMode (bluePin, SALIDA); analogWrite (A3, 0); // establece el brillo de la pantalla LCD en el valor máximo Serial.begin (9600); lcd. comienzo (16, 2); // comienza la pantalla LCD con 16 columnas y 2 filas Blynk.begin (auth, ssid, password); // iniciar las funcionalidades de Blynk} void loop () {// Variambles para almacenar temporalmente la combinación int Temp_Slider_One_value =SliderValueOne; int Temp_Slider_Two_value =SliderValueTwo; int Temp_Slider_Three_value =SliderValueThree; Blynk.run (); // sondear nuevos valores de combinación desde la aplicación en línea // comprobar si los valores de combinación han cambiado e imprimirlos en la consola si (Temp_Slider_One_value! =SliderValueOne || Temp_Slider_Two_value! =SliderValueTwo || Temp_Slider_Three_value! =SliderValueThree) {New Serial.print combinación:"); Serial.print (SliderValueOne); Serial.print (""); Serial.print (SliderValueTwo); Serial.print (""); Serial.println (SliderValueThree); } int PotOne =map (analogRead (A0), 0, 1023, 0, 9); int PotTwo =mapa (analogRead (A1), 0, 1023, 0, 9); int PotThree =mapa (analogRead (A2), 0, 1023, 0, 9); lcd.setCursor (0, 0); lcd.print (PotOne); lcd.setCursor (2, 0); lcd.print (PotTwo); lcd.setCursor (4, 0); lcd.print (PotThree); if (inicio) {giveColorFeedback (PotOne, PotTwo, PotThree); if (PotOne ==SliderValueOne &&PotTwo ==SliderValueTwo &&PotThree ==SliderValueThree) {blinkGreenLed (); inicio =falso; }} if (! start) {if (PotOne ==0 &&PotTwo ==0 &&PotThree ==0) {start =true; }}} // Proporcione comentarios basados ​​en qué tan cerca está el potenciómetro del valor de combinación // Cuanto más cerca está, más cálido es el color del LED void giveColorFeedback (int PotOne, int PotTwo, int PotThree) {if (abs (PotOne - SliderValueOne) <=1 &&abs (PotTwo - SliderValueTwo) <=1 &&abs (PotThree - SliderValueThree) <=1) {// Red setColor (255, 0, 0); } else if (abs (PotOne - SliderValueOne) <=3 &&abs (PotTwo - SliderValueTwo) <=3 &&abs (PotThree - SliderValueThree) <=3) {// setColor amarillo (255, 255, 0); } else if (abs (PotOne - SliderValueOne) <=4 &&abs (PotTwo - SliderValueTwo) <=4 &&abs (PotThree - SliderValueThree) <=4) {// aqua setColor (0, 255, 255); } else {// azul setColor (0, 0, 255); }} void blinkGreenLed () {for (int a =0; a <2; a ++) {for (int b =0; b <=255; b + =5) {setColor (0, b, 0); retraso (5); } para (int b =255; b> =0; b - =5) {setColor (0, b, 0); retraso (5); }} para (int b =0; b <=255; b + =5) {setColor (0, b, 0); retraso (5); }} // Enviar valores RGB a los pines LED void setColor (int red, int green, int blue) {analogWrite (redPin, red); analogWrite (greenPin, verde); analogWrite (bluePin, azul); }  

Agrega el zumbador

Usaremos el timbre para tocar una melodía cuando se abra la caja. Más precisamente, tocaremos el tema musical de Star Wars!

Conectar el timbre es simple:

Sube este código de ejemplo y escucha:

  const int c =261; const int d =294; const int e =329; const int f =349; const int g =391; const int gS =415; const int a =440; const int aS =455; const int b =466; const int cH =523; const int cSH =554; const int dH =587; const int dSH =622; const int eH =659; const int fH =698; const int fSH =740; const int gH =784; const int gSH =830; const int aH =880; int contador =0; #definir buzzerPin 1 void setup () {pinMode (buzzerPin, SALIDA); Serial.begin (9600); } bucle vacío () {play_jingle (); retraso (3000); } void play_jingle () {bip (a, 500); bip (a, 500); bip (a, 500); bip (f, 350); pitido (cH, 150); bip (a, 500); bip (f, 350); pitido (cH, 150); bip (a, 650); retraso (500); pitido (eH, 500); pitido (eH, 500); pitido (eH, 500); bip (fH, 350); pitido (cH, 150); pitido (gS, 500); bip (f, 350); pitido (cH, 150); bip (a, 650); retraso (500); } void beep (int note, int duration) {// Reproduce el tono en buzzerPin tone (buzzerPin, nota, duración); // Detener el tono en buzzerPin noTone (buzzerPin); retraso (50); // Incremento contador contador ++; }  

Agregue el servomotor

El servomotor es la cerradura de nuestra caja, necesitaremos que gire 90 grados cuando la combinación sea la correcta, para que la caja se abra.

La conexión del servo solo requiere tres cables.

Para girarlo 90 grados usaremos las siguientes funciones:

  #include  int pos =0; // variable para almacenar la posición del servo Servo myservo; // crea un objeto servo para controlar un servo void setup () {myservo.attach (9); // conecta el servo en el pin 9 al objeto servo myservo.write (pos); // coloca el servo en la posición 0} void loop () {open_the_box (); retraso (2000); close_the_box (); retraso (2000); } void open_the_box () {for (pos =0; pos <=90; pos + =1) {// va de 0 grados a 90 grados myservo.write (pos); // le dice al servo que vaya a la posición en la variable 'pos' delay (15); // espera 15ms para que el servo alcance la posición}} void close_the_box () {for (pos =90; pos> =0; pos - =1) {// va de 90 grados a 0 grados myservo.write (pos); // le dice al servo que vaya a la posición en la variable 'pos' delay (15); // espera 15ms a que el servo alcance la posición}}  

Tenga en cuenta que para volver a girar el servo y cerrar la caja, todo lo que tendrá que hacer es poner todos los potenciómetros a 0.

Construye tu caja de rompecabezas

No sería una caja sin una caja, así que descargue el archivo del caso a continuación y utilícelo como guía para crear el suyo propio.

Tenga en cuenta que usamos un cartón de 2 mm.

Código

Bosquejo completo

Piezas y carcasas personalizadas

Cartón de 2 mm box_E5j7tnFdNC.dxf

Esquemas


Proceso de manufactura

  1. Componentes del circuito
  2. Circuito integrado
  3. SensorTag a Blynk usando Node-RED
  4. Dados digitales Arduino
  5. Sensor de temperatura múltiple
  6. Controlador de juego Arduino
  7. MotionSense
  8. MOSMusic
  9. ¿Qué es la microelectrónica?
  10. Componentes de la máquina de perforación
  11. Componentes del motor de combustión interna