Repository navigation
Proyecto Vending Machine
- 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)
- 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

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

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

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

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

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:

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:

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

(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

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

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 '#'.

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
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 servoLa 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
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.
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:
- Waiting for client: En este estado la máquina simplemente lee el ultrasonidos hasta que tiene un cliente cerca
- 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
- 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
- Processing order: Aquí sencillamente hacemos rotar el servo correspondiente al producto
- Idle: Finalmente esperamos un momento a que el cliente recoja su producto y volvemos a la fase de waiting client al acabar

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;
}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
| 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€ |
-
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.
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.
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.)
-
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.
- 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 😄
-
Elisa Jazmín Matos Juárez: https://github.com/Elisajmj
-
Sofía Perales: https://github.com/sperales2020
-
Santiago Prieto Núñez: https://github.com/sprieton
