Skip to content

Proyecto Vending Machine

Sofía Perales edited this page Dec 9, 2024 · 20 revisions

Conceptos generales máquina expendedora

  • Hacer una máquina expendedora con producotos distribuidos en un 2x2
  • Hacer un "lector de tarjetas" con un ultrasonidos
  • El ultrasonidos detecta si tiene un cliente cerca
  • Seleccionar el producto con un keypad
  • Que tenga feedback con una pantalla LCD, leds y un buzzer (plus)

Boceto de los componentes ✏️

  • Arduino Mega
  • Keypad
  • Display LCD
  • Ultrasonido
  • Alambre
  • Servo/Motor (360º)
  • Protoboard
  • Resistencias
  • Potenciometro (Brillo LCD)
  • Cables
  • Cartón/Chapa
  • Lámina de plástico transparente
  • LEDs

En este link podemos encontrar información más detallada de los componentes utilizados: componentes

Planos 2D de la máquina 📐

image

Planos 3D y cotas de las piezas

Ayundandonos de FreeCAD hemos creado el modelo 3D de la máquina expendedora.

maq

Ejemplo de las cotas que hemos hecho (el resto están en el proyecto de FreeCAD)

image

Esquema electrónica 💡

Hemos hecho un fritzing con el esquema de conexiones de la electrónica.

Electrónica

En la siguiente imagen se puede comprobar la conexión del keypad con el arduino para su funcionamiento:

Keypad

A la hora del montaje tuvimos que cambiar los pines para que la distribución de los pines coincideiese con la posición de los sensores y de la placa. El esquema final es el siguiente:

Captura desde 2024-12-03 21-48-58

Circuito eléctrico

Con la herramienta nueva que hemos aprendido, KiCad, hemos hecho una PCB del proyecto.

Este proyecto está diseñado para ser compatible con un Arduino UNO.

Lo único que no hemos podido incluir el ultrasonidos, ni el keypad porque no se encuentran en la aplicación.

En la siguiente imagen se puede ver mejor el esquema:

PCB


Funcionamiento de los componentes

Keypad

La disposición de los pines para la mayoría de los teclados de membrana se verá así:

image

(Donde R representa las filas y C las columnas)

Hemos conectado directamente mediante cables macho-macho el keypad con los pines digitales de nuestra arduino mega.


Diagrama de conexiones del keypad

image

Para poder utilizar el keypad hemos tenido que instalar la librería keypad.

image

Nos hemos ayudado de este código para poner en marcha el keypad: código keypad

Funcionamiento del keypad sin tener en cuenta el LCD display

  • Para elegir el producto hay que añadir un código. (Hemos definido los códigos A11, A12, B11, B12)
  • Comprobamos que el código que se ha introducido es correcto.
  • Una vez elegido el producto, para confirmar compra pulsamos '#'.

keypad-f

Display

Para la conexión del LCD y la puesta en marcha nos hemos ayudado de la siguiente página: Conexión LCD

Para regular el brillo de la pantalla hemos utilizado el siguiente potenciometro.

La patilla que tiene el tornillo la he conectado al pin 5V y el otro extremo al pin GND.

Para conectar el display en el arduino he seguido el siguiente esquema de conexiones:

  • VSS conectado a GND.
  • VDD conectado a 5V.
  • V0 conectado a la patilla central del potenciometro.
  • RS conectado al pin 8.
  • RW conectado a GND.
  • E conectado al pin 9.
  • D4 conectado al pin 32.
  • D5 conectado al pin 34.
  • D6 conectado al pin 36.
  • D7 conectado al pin 38.
  • A conectado a 5V atraves de una resistencia de 220 ohmios.
  • K conectado a GND.

Probando keypad y display


Servomotores

Para este apartado usaremos la librería "Servo.h" que regula el PWM de los servos y así el código queda más limpio como podemos ver.

// Configurar el servo para máxima velocidad en sentido antihorario
servos[i].writeMicroseconds(2000); // 2000 µs: Máxima velocidad en sentido antihorario

delay(2000); // Esperar 2 segundos para observar la rotación

// Detener el servo
servos[i].writeMicroseconds(1500); // 1500 µs: Detener el movimiento del servo

La conexíon de los pines como podemos observar en el esquema es sencillamente conectar cada servo a GND y 5V y al pin que controle el sevo motor en cuestión, en este caso:

  • Servo 1 conectado al pin 2
  • Servo 2 conectado al pin 3
  • Servo 3 conectado al pin 4
  • Servo 4 conectado al pin 5

Lo más complicado ha sido la eleccion del material para hacer los "muelles" donde se encuentra la comida de la máquina. Ya que si el material es demasiado fino es fácil unirlo al servo pero es demasiado flexible y no empuja la comida, mientras que si el material es demasiado grueso la conexión con el sevo se hace imposible.

Por ello hemos tenido dificultades y hemos probado:

  • Un alambre regular de 0,9mm, resultó facil unirlo al servo pero se dobla con facilidad y no es capaz de mover la comida
  • Alambre de 1,5mm, en este caso si ha resultado efectivo y además hemos unido estos alambres a los servos anclando un trozo de cartón al "muelle" y este trozo de carton al cabezal del servo con el alambre original

Imagen 1 Imagen 2

Sensor ultrasonidos HC-SR04


Hemos utilizado un sensor ultrasonidos para detectar si hay un cliente y para el método de pago con tarjeta.

Destacamos los pines del ultrasonidos:

const int TRIGGERPIN = 9;
const int ECHOPIN = 10;

El pin Trigger se define como output y el pin Echo como input.

pinMode(TRIGGERPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);

El pin Trigger envía un pulso y espera un tiempo para recibir el pulso de respuesta del pin Echo.

Para calcular la distancia entre el sensor y un objeto, aplicamos la siguiente fórmula: distance = time / 29 / 2.0; donde time es el pulso de respuesta del pin Echo. Dividimos time entre 29 porque 29 microsec = 1 cm. Por último, dividimos entre dos porque pulseIn mide el tiempo de ida y vuelta, y solo nos interesa la distancia de ida para calcular la distancia.

Código completo

El funcionamiento software de la máquia expendedora es en concepto sencillo, hemos planteado hacer una máquina de estados como se vé mas abajo con 5 estados:

  1. Waiting for client: En este estado la máquina simplemente lee el ultrasonidos hasta que tiene un cliente cerca
  2. Taking order: Durante esta fase recibimos datos del pedido con el keypad si el cliente se marcha, volvemos a waiting for client flecha roja si no pasamos el código completo si es correcto a la siguiente fase
  3. Charging: En esta fase el cliente debe "pagar" el producto acercando una tarjeta al ultrasonidos, una vez más hay una flecha roja si se marcha volvemos a waiting for client
  4. Processing order: Aquí sencillamente hacemos rotar el servo correspondiente al producto
  5. Idle: Finalmente esperamos un momento a que el cliente recoja su producto y volvemos a la fase de waiting client al acabar

Captura de pantalla 2024-12-03 205231

Antes de pasar al montaje quiero hacer una mención a cómo se comprueba si hay un cliente cerca y si este ha estado durante suficiente tiempo sin ser detectado como para reiniciar al primer estado

// This function returns a bool if the client is near true
// if the client goes away and is away for more than AWAY_CLIENT_TIME then return false
bool near_client(){
  int distance = get_distance();

  // if client isn't near and we detect it, if near return true, else false
  if(!client_near){
    client_near = distance <= NEAR_CLIENT_DIST;
  } else if (distance > NEAR_CLIENT_DIST){  // if we lost the client
    if(client_lost == 0){   // we just lost the client
      client_lost = millis(); // get the time of the lost
      client_near = true;
    } else {    // this isn't the first lost client loop
      if((millis() - client_lost) >= AWAY_CLIENT_TIME){ // if AWAY_CLIENT_TIME has passed since lost client
        client_lost = 0;  // restart the counter
        client_near = false;
      } else {    // no so long since we lost the client
        client_near = true;
      }
    }
  } else {  // if we detect near client again we restart 
    client_lost = 0;  // restart the counter
    client_near = true;
  }

  return client_near;
}

Proceso de montaje 🚧

Para empezar hemos cortado las piezas de la máquina.

Lo ha hecho nuestra compañera Sofía en la empresa en la que está de prácticas y gracias a ello hemos conseguido hacerla de chapa.

Para cortar la chapa con las dimensiones exactas, hemos hecho un boceto a papel con las medidas de cada parte y se lo hemos dado a taller para que se guiasen por los planos. Las distancias entre el LCD, el numpad y el ultrasonidos las calculamos en taller una vez estaba la caja hecha.


Una vez que tenemos el código completo y funcional pasamos a colocar los sensores dentro de la máquina.

Para ello hemos cortados varias piezas de cartón para poder apoyar la protoboard y el arduino mega como se puede observar en la foto.



Tras la colocación de los soportes de cartón hemos colocado el lcd, el ultrasonido y el keypad.



Una vez que hemos añadido y comprobado que funciona el montaje de los sensores pasamos a incorporar los servomotores.

Hemos cortado un trozo de cartón negro como "doble fondo" para que no se vean los cables de los servos.


(Probando dónde colocar los servos)


(Cortando piezas de cartón)


(Añadiendo los servos)


(Haciendo el fritzing)


Una vez que hemos cortado el doble fondo, podemos añadir los muelles.


Para poder pegar la lámina de plástico a la máquina hemos usado velcro. Lo hemos pegado en la máquina y los laterales del plástico.

Así podemos despagarla para rellenar la máquina o arreglar el circuito.

Producto final


Presupuesto 💵

Material Precio por unidad Unidades Precio total
Velcro con adhesivo 0.95€ 2 1.90€
Supertite adhesivo 1.15€ 1 1.15€
Lima para metal triangular 1.95€ 1 1.95€
Forro 45x5M Renolit 2.25€ 1 2.25€
Cartón pluma negro 4.25€ 2 8.50€
Servos 0.59€ 5 2.97€
Numpad 3.42€ 1 3.42€
Total 17.89€

Problemas que nos han surgido ⚠️

  • Al tener tantos cables en la protoboard (ya que no podemos conectar todos los cables direnctamente en el arduino), ha sido un poco lioso comprobar qué componente nos estaba dando problemas.

  • Hemos tenido problemas con añadir el LCD a todo el proyecto puesto que estabamos conectado algunos pines de forma incorrecta.

  • Elegir el grosor del alambre también ha sido un problema ya que si es demasiado fino es fácil unirlo al servo pero es demasiado flexible y no empuja la comida, mientras que si el material es demasiado grueso la conexión con el sevo se hace imposible.

  • Hicimos nuestro esquema de conexiones en fritzing pero tuvimos que modificarlo puesto que no estaban bien hechas las conexiones.

  • Al cortar las piezas de la máquina, no hubo mucha precisión y nos quedaron algunos huecos.

  • Para poder pulsar las teclas del keypad bien, necesitamos cortar unas piezas de cartón para que estuviera lo suficientemente rígido para pulsar las teclas.


Divide y venceras 🏆

Para llevar a cabo este proyecto, dividimos el trabajo en tres áreas principales para maximizar la eficiencia.

Cada miembro se especializó en una tarea, pero trabajamos juntos en la etapa de ensamblaje y pruebas finales.

Distribución de Tareas:

  • Keypad y LCD:

    • Programación de la interfaz para ingresar códigos y mostrar información en la pantalla.
    • Implementación de validaciones de códigos y retroalimentación en caso de error.
  • Servomotores:

    • Configuración de los motores para mover los productos.
    • Diseño y prueba de los "muelles" para asegurar que los productos caigan correctamente.
  • Ultrasonidos:

    • Integración del sensor para detectar la presencia de clientes y simular el lector de tarjetas.
    • Ajuste de la sensibilidad y calibración de distancias.

Funcionamiento 👍

1️⃣ Iniciamos la máquina expendedora.

2️⃣ El sensor ultrasonido se activa para buscar que haya persona cerca. Sino hay persona a menos de 7 cm seguimos esperando a que alguien llegue.

3️⃣ Una vez que detectamos persona, se inicia el proceso de compra.

4️⃣ Te pide que introduzcas un código del producto.

  • Si el código es correcto pasamos al siguiente paso.
  • Si el código es incorrecto, volvemos a pedir código.

5️⃣ Tras elegir el producto mostramos el precio.

6️⃣ Una vez que se muestra el precio tienes que pasar la "tarjeta" por el ultrasonido para hacer la compra (hay que acercar mucho la "tarjeta" para que detecte persona y también que se está pagando).

7️⃣ Tras realizar la compra, los servomotores se activan para mover el producto y que caiga.

8️⃣ Una vez ha caido el producto se puede coger y se muestra un mensaje al acabar el proceso.

9️⃣ Se vuelve a empezar el paso 1.

(Si en algún momento de la compra se deja de detectar a persona, se reinicia el funcionamiento al primer paso.)


Demostración de funcionamiento 📹

Alt text


Conclusiones

  • Hemos aprendido a conectar y configurar diversos componentes como el keypad, la pantalla LCD, los servomotores y el sensor ultrasónico, comprendiendo cómo trabajan juntos para lograr el objetivo del proyecto.

  • El uso de herramientas como Fritzing y KiCad nos ayudó a organizar y visualizar las conexiones electrónicas de manera más clara y profesional.

  • La colaboración durante las fases de integración y pruebas finales fue clave para el éxito del proyecto.

Hemos "sufrido un poco" con la inestabilidad de las conexiones pero hemos disfrutado del proceso y de ver nuestra idea hecha realidad y bien funcional.


Tareas

  • Recoger en el laboratorio los componentes que vamos a utilizar.
  • Comprar componentes que no tienen en el laboratorio.
  • Código Keypad y display LCD.
  • Código ultrasonidos.
  • Código servomotores.
  • Cortar piezas de la máquina.
  • Juntar el funcionamiento de cada componente.
  • Montar las piezas
  • Comprobar el funcionamiento general de la máquina
  • Presentar 😄

Fin

Autores