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

Máquina expendedora de bricolaje - Proyecto de mecatrónica basado en Arduino

En este proyecto aprenderemos cómo hacer una máquina expendedora de bricolaje basada en Arduino. Te mostraré todo el proceso de construcción, desde cortar y ensamblar las placas de MDF hasta conectar todas las partes electrónicas y escribir el código Arduino.

Puede ver el siguiente video o leer el tutorial escrito a continuación.

Resumen

La máquina expendedora cuenta con cuatro unidades de descarga controladas mediante cuatro servomotores de rotación continua, un sistema transportador controlado mediante motores paso a paso, una pantalla LCD, cuatro botones para seleccionar un artículo y un detector de monedas.

Quizás estés pensando ahora que el transportador de artículos no es tan útil para esta máquina expendedora, y sí, probablemente tengas razón. Pero mi idea aquí fue hacer este proyecto más interesante o un poco más complejo para que puedas aprender más cosas nuevas. Creo que esta idea de proyecto puede ser excelente para estudiantes de electrónica o mecatrónica que estén considerando construir uno como su proyecto de último año, así como para cualquier entusiasta de Arduino.

Construyendo la máquina expendedora

Empecé cortando a medida el tablero MDF de 8 mm.

Previamente hice un modelo 3D de la máquina de donde obtuve todas las medidas.

Puede buscar y descargar este modelo 3D, así como explorarlo en su navegador en Thangs.

Para cortar el MDF utilicé una sierra circular. En realidad, este es un banco de trabajo casero con una sierra circular, un enrutador y una sierra de calar, hecho por mi socia Marija y hay un video de bricolaje en su canal de YouTube Creativity Hero.

Después de cortar todos los paneles con la sierra circular, continué haciendo las aberturas en algunos de los paneles con la sierra de vaivén invertida.

En realidad, incluso se puede usar una sierra de calar para el paso anterior en caso de que no tenga una sierra circular. También usé la sierra caladora para cortar las partes más pequeñas que tenían varios cortes. Sin embargo, tenga en cuenta que se trata de máquinas peligrosas, por lo que debe tener mucho cuidado al utilizarlas.

Una vez que tuve todas las piezas de MDF listas, comencé a ensamblarlas usando un poco de pegamento para madera y tornillos. Para sujetar los paneles utilicé abrazaderas de ángulo de 90 grados. Usando un taladro inalámbrico, primero hice agujeros guía, luego hice avellanados y atornillé los tornillos de 3 mm en su lugar. Usé el mismo método para ensamblar todos los paneles y para algunos de ellos también usé algunas abrazaderas F.

Sistema de rieles

Llegados a este punto del montaje seguiré con la realización del sistema de raíles. Para ello estoy usando tubos de aluminio que corté a medida con una sierra de mano para metal. El diámetro del tubo para el riel horizontal es de 16 mm, mientras que para el riel vertical el diámetro es de 20 mm. En una tabla de madera maciza de 18 mm, hice ranuras para los tubos con una broca Forstner y luego coloqué los tubos en ellas.

El riel horizontal está formado por dos tubos de 27 cm de largo, mientras que el riel vertical está formado por tres tubos de 45 cm de largo.

A continuación están los controles deslizantes y así es como los hice. Usé tablero de madera de 21 x 21 cm sobre el que hice agujeros de 8 mm.

Luego inserté varillas roscadas de 8 mm a través de estos agujeros y usando arandelas y tuercas fijé los rodamientos de 22 mm. En cuanto al deslizador horizontal, utilicé el mismo método pero con rodamientos más pequeños de 16 mm de diámetro exterior.

Después de insertar el control deslizante entre los rieles del tubo, noté que estaba un poco flojo. Para resolver este problema tuve que reducir la distancia entre los dos rieles. Así que primero expandí las ranuras de los tubos, luego hice ranuras perpendiculares a través de los tubos y, finalmente, con una varilla roscada sujeté los dos rieles de los tubos más cerca uno del otro. Después de esto, los controles deslizantes ya no estaban sueltos y funcionaban correctamente.

Sin embargo, en este punto tuve que desmontar los rieles para poder agregarle los demás elementos. Primero agregué un perno de 5 mm en el lado izquierdo de los rieles en el que colocaré una polea para la correa de distribución horizontal, así como dos cojinetes más que se deslizarán en el riel vertical izquierdo.

En el otro lado derecho del riel tuve que colocar el motor paso a paso para el movimiento horizontal. Primero fijé el motor en una placa de MDF de 8 mm, luego le añadí una pieza de madera de soporte y también le aseguré la parte ranurada. Finalmente fijé todo este conjunto en el deslizador vertical usando un pegamento para madera y dos tornillos.

A continuación, continué agregando el contenedor en el control deslizante horizontal. Para ello utilicé unas pequeñas piezas de madera que uní con cola para madera. Una vez que terminé con esto, estaba listo para ensamblar el sistema de rieles. Usé un poco de epoxi en las ranuras de los rieles y agregué una tabla de madera adicional al costado de los rieles para hacer que todo el sistema de rieles sea más rígido.

En el siguiente paso, inserté el ensamblaje entre los rieles verticales y también los aseguré en su lugar. El resultado final de los deslizadores y el sistema de rieles funcionó excelente.

Continué con la instalación de la correa de distribución horizontal. Medí la longitud que necesitaba, la corté a la medida y la aseguré al deslizador con una brida. En cuanto al control deslizante vertical, coloqué el motor paso a paso en la parte superior de la máquina con un trozo de MDF y algunos pernos. En la parte inferior, coloqué la polea y de manera similar instalé la correa de distribución.

Unidades de descarga

A continuación, pasé a la unidad de descarga de artículos. Hice una bobina helicoidal con alambre de metal de 3 mm envolviéndolo alrededor de una lata de pintura en aerosol de 7 cm de diámetro.

Después de eso, usando una pistola de pegamento, lo aseguré a un servomotor de rotación continua.

Panel frontal

El siguiente es el panel de la puerta frontal que adjunté a la máquina expendedora usando bisagras simples, y para bloquearlo usé un pestillo de puerta magnético. Luego usé un acrílico de garrapatas de 5 mm para cubrir la gran abertura frontal, mientras que para la abertura más pequeña del lado derecho usé una placa de aluminio muy estaño. Aquí hice 4 agujeros para los botones, así como aberturas para las monedas y la pantalla LCD. Usé un taladro y una sierra para metales para hacerlos. Una vez que coloqué las piezas electrónicas en la placa de aluminio, las coloqué en el panel de la puerta delantera con pernos de 5 mm.

Para posicionar el portamonedas en su posición inicial instalé dos micro interruptores y para las monedas pegué una guía que guiará la moneda para que se deslice hasta el fondo de la máquina.

El detector de monedas es un sensor de proximidad infrarrojo simple, por lo que cuando una moneda pase cerca de él, el sensor nos dará una respuesta positiva.

Esquema del circuito

Luego viene la parte divertida, conectar todos los componentes electrónicos a la placa Arduino. Aquí está el esquema del circuito completo para este proyecto de máquina expendedora de bricolaje.

Entonces necesitamos una fuente de alimentación de 12V, con al menos 2 amperios. Necesitamos los 12V para los dos motores paso a paso, así como las tiras de luces LED que luego colocaré en la puerta principal. Sin embargo, para todos los demás componentes necesitamos 5 V, por lo que utilicé un convertidor reductor para reducir los 12 V a 5 V. Los servomotores de rotación continua DS04-NFC se alimentan con 5 V y se controlan a través de señales PWM provenientes de la placa Arduino, mientras que los motores paso a paso se controlan a través de los controladores A4988. Los cuatro botones y los dos microinterruptores están conectados a tierra y a los pines digitales de Arduino, por lo que al usar las resistencias internas de la placa Arduino podemos detectar fácilmente cuándo se presionan.

Puede obtener los componentes necesarios para este tutorial de Arduino desde los siguientes enlaces:

  • Convertidor reductor CC-CC LM2596 …………..
  • 16×2 LCD ……………………………………………………..
  • Servomotor continuo de 360 ​​grados...
  • Motor paso a paso NEMA 17 ……………………….
  • Controlador de motor paso a paso A4988 ……………….
  • Sensor de proximidad IR ………………………………..
  • Botones ………………………………………………………….
  • Microinterruptor de límite ………………………………….
  • Placa Arduino …………………………………………

Conecté los componentes electrónicos usando algunos cables de salto. Se volvió un poco desordenado con tantos cables, pero todo funcionó correctamente. Al final coloqué dos tiras de luces LED en el panel de la puerta para iluminar el interior de la máquina expendedora.

Código Arduino

Lo que queda ahora es programar el Arduino y aquí está el código que hice para este proyecto. Debajo de esto hay una descripción del código.

/*     DIY Vending Machine - Arduino based Mechatronics Project

    by Dejan Nedelkovski, www.HowToMechatronics.com

*/

#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Servo.h>

LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
Servo servo1, servo2, servo3, servo4;   // DS04-NFC motors

// Stepper motors pins
#define dirPinVertical 0
#define stepPinVertical 1
#define dirPinHorizontal 2
#define stepPinHorizontal 3

#define coinDetector 9

#define button1 13
#define button2 12
#define button3 11
#define button4 10

#define microSwitchV 15
#define microSwitchH 14

int buttonPressed;

void setup() {
  lcd.begin(16, 2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display

  servo1.attach(4);
  servo2.attach(5);
  servo3.attach(6);
  servo4.attach(7);

  pinMode(dirPinVertical, OUTPUT);
  pinMode(stepPinVertical, OUTPUT);
  pinMode(dirPinHorizontal, OUTPUT);
  pinMode(stepPinHorizontal, OUTPUT);

  pinMode(coinDetector, INPUT);

  // Activating the digital pins pull up resistors
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);

  pinMode(microSwitchV, INPUT_PULLUP);
  pinMode(microSwitchH, INPUT_PULLUP);

  // Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}
void loop() {
  // Print "Insert a coin!" on the LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Insert a coin!");
  
  // Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }
  
  delay(10);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Select your item");
  lcd.setCursor(0, 1);
  lcd.print(" 1, 2, 3 or 4?");
  
  // Wait until a button is pressed
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      break;
    }
  }
  
  // Print "Delivering..." 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Delivering...");
  
  // Depending on the pressed button, move the carrier to that position and discharge the selected item 
  switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
      
     case 2:
      // Move the container to location 2
      moveUp(4900);
      delay(200);
      // Rotate the helix, push the selected item
      servo2.writeMicroseconds(2000); // rotate
      delay(950);
      servo2.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(4900);
      break;

      case 3:
      // Move the container to location 3
      moveUp(2200); 
      delay(200);
      moveLeft(1700);
      delay(300);
      // Rotate the helix, push the selected item
      servo3.writeMicroseconds(2000); // rotate
      delay(950);
      servo3.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(2200);
      break;

      case 4:
      // Move the container to location 4
      moveUp(2200); // Move verticaly 4800 steps
      delay(200);
      // Rotate the helix, push the selected item
      servo4.writeMicroseconds(2000); // rotate
      delay(950);
      servo4.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(2200);
      break;
  }
  
  lcd.clear(); // Clears the display
  lcd.setCursor(0, 0);
  lcd.print("Item delivered!"); // Prints on the LCD
  delay(2000);
}

// == Custom functions ==

void moveUp (int steps) {
  digitalWrite(dirPinVertical, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}
void moveDown (int steps) {
  digitalWrite(dirPinVertical, HIGH);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}
void moveLeft (int steps) {
  digitalWrite(dirPinHorizontal, HIGH);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}
void moveRight (int steps) {
  digitalWrite(dirPinHorizontal, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}Code language: Arduino (arduino)

Explicación del código fuente

Primero, debemos incluir las bibliotecas Servo y LiquidCrystal, definir los pines de la pantalla LCD, los cuatro servomotores, los pines de los motores paso a paso, el detector de monedas, así como los cuatro botones y los dos microinterruptores.

En la sección de configuración, configuramos los modos de pin para cada uno de los pines mencionados anteriormente. Podemos notar que para los botones y los pines de los micro interruptores activamos las resistencias pull up internas. Esto significa que el nivel lógico en estos pines será ALTO todo el tiempo, y una vez que los presionemos, el nivel lógico caerá a BAJO.

Antes de ingresar al bucle principal, también configuramos el transportador en su posición inicial, que está definida por los dos microinterruptores. Entonces, con el ciclo while seguimos moviendo el transportador a su posición inicial y una vez que se presionen los dos microinterruptores, los motores se detendrán y se moverán a la posición inicial deseada.

// Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }Code language: Arduino (arduino)

En el programa principal, comience imprimiendo en la pantalla LCD el mensaje "Inserte una moneda". Entonces nos quedamos atrapados en el bucle while. Una vez que inserte una moneda y pase cerca del sensor de proximidad, el estado lógico en el pin del detector de monedas caerá a BAJO y, en ese caso, saldremos del ciclo while usando la instrucción break.

// Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }Code language: Arduino (arduino)

Luego imprimimos el mensaje "Seleccione su artículo" y nos quedamos atascados en otro bucle while.

// Wait until a button is pressed
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      break;
    }
  }Code language: Arduino (arduino)

Este ciclo while espera a que presionemos cualquiera de los cuatro botones, y una vez que lo hacemos salimos de él e imprimimos el mensaje "Delivering".

Ahora, dependiendo del botón presionado, ejecutamos uno de los casos en la declaración de cambio. En caso de que hayamos presionado el primer botón, el transportista comenzará a moverse hacia arriba utilizando la función "moveUp()" personalizada.

switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
}Code language: Arduino (arduino)

Si echamos un vistazo a esta función, podemos ver que simplemente configura el motor paso a paso para que se mueva en una dirección particular y realiza la cantidad de pasos que ingresamos como argumento.

void moveUp (int steps) {
  digitalWrite(dirPinVertical, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}Code language: Arduino (arduino)

Podemos notar aquí que configuré el controlador paso a paso A4988 para que funcionara en una resolución de un cuarto de paso, y con algunas degustaciones llegué a la conclusión de que necesitaba 4900 pasos para que el operador llegara a la posición superior. De manera similar movemos el transportador hacia la izquierda hasta llegar a la ubicación número 1.

Acto seguido giramos el motor de rotación continua durante 950 milisegundos para que la bobina helicoidal haga un ciclo completo.

// Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stopCode language: Arduino (arduino)

Tenga en cuenta aquí que estos valores a veces pueden variar y depende del motor en sí. Usando las funciones personalizadas moveRight() y moveDown(), llevamos el transportador de vuelta a la posición inicial. De la misma forma podemos descargar cualquiera de los cuatro elementos.

Al final simplemente imprimimos el mensaje "Artículo entregado".

Es así de simple, y espero que hayas disfrutado este video y hayas aprendido algo nuevo. No dude en hacer cualquier pregunta en la sección de comentarios a continuación y consulte mi colección de proyectos Arduino.


Proceso de manufactura

  1. Máquina expendedora
  2. Haga una máquina de escribir para hacer tareas caseras en casa
  3. Consola de edición de Photoshop DIY con Arduino Nano RP 2040
  4. Hacer Monitor Ambilight usando Arduino
  5. Máquina de LEVITACIÓN ULTRASÓNICA usando ARDUINO
  6. Voltímetro de bricolaje con Arduino y un teléfono inteligente
  7. DIY Sensor infrarrojo de latidos del corazón con Arduino
  8. Tech-TicTacToe
  9. Voltímetro de bricolaje con Arduino y una pantalla Nokia 5110
  10. Reloj digital en Arduino usando una máquina de estados finitos
  11. Máquina CNC