Construye una Máquina Expendedora Inteligente con Arduino: Guía Mecatrónica DIY Completa
En este proyecto aprenderemos a hacer una máquina expendedora DIY basada en Arduino. Te muestro todo el proceso: corte y ensamblaje de tableros MDF, conexión de electrónica y programación Arduino. Ver video o leer tutorial abajo. La máquina tiene 4 unidades dispensadoras con servos de rotación continua, sistema de transporte (carrier) con motores paso a paso, LCD, 4 botones para selección y detector de monedas. El transportador quizás no sea tan útil en una expendedora real, pero mi idea era hacer el proyecto más interesante/complejo para aprender más. Ideal para estudiantes de electrónica/mecatrónica como proyecto final o entusiastas Arduino. Empecé cortando tablero MDF 8mm a medida. Medidas de modelo 3D previo. Modelo 3D descargable en Thangs. Corte con sierra circular (banco de trabajo casero con sierra circular, router y sierra caladora, de mi pareja Marija - canal Creativity Hero). Tras cortar paneles, hice aberturas en algunos con sierra caladora invertida. También para piezas pequeñas con múltiples cortes. ¡Cuidado: máquinas peligrosas! Ensamblé paneles con cola madera y tornillos 3mm. Sargentos 90°, taladro para guías, avellanado. Algunos paneles con sargentos F. Tubos aluminio cortados con sierra metal. Horizontal: 16mm diámetro, 2x 27cm. Vertical: 20mm, 3x 45cm. Ranuras en tablones 18mm con broca Forstner. Deslizadores: tabla 21x21cm, agujeros 8mm, varillas roscadas 8mm, arandelas, tuercas, cojinetes 22mm. Deslizador horizontal: mismo método, cojinetes 16mm. Al insertar deslizador vi holgura. Solución: reducir distancia entre raíles. Amplié ranuras, hice ranuras perpendiculares en tubos, varilla roscada para acercar raíles. Deslizadores firmes y funcionando. Desmonté raíles para añadir elementos: tornillo 5mm lado izquierdo para polea correa horizontal + 2 cojinetes para raíl vertical izquierdo. Lado derecho: motor paso a paso horizontal. Motor en tabla MDF 8mm, pieza soporte, parte ranurada, todo pegado y atornillado a deslizador vertical. Contenedor en deslizador horizontal: piezas madera pequeñas encoladas. Listo para ensamblar sistema raíles. Epoxi en ranuras, tabla lateral extra para rigidez. Inserté conjunto entre raíles verticales y asegurés. Resultado: deslizadores y raíles funcionando excelentemente. Correa dentada horizontal: medí, corté, brida al deslizador. Motor vertical arriba en MDF con tornillos. Polea abajo, correa similar. Bobina helicoidal de alambre 3mm enrollado en lata spray 7cm diámetro. Fijada a servo rotación continua con pistola silicona. Puerta con bisagras, cierre magnético. Acrílico 5mm en abertura grande, chapa aluminio fina en abertura pequeña (derecha). 4 agujeros botones, aberturas monedas y LCD. Taladro y sierra arco. Electrónica en chapa, atornillada a puerta (tornillos 5mm). 2 micro interruptores para posición inicial del transportador. Guía para monedas (pegamento) que las lleva al fondo. Detector moneda: sensor proximidad IR (detecta moneda al pasar). Fuente 12V 2A+ (para 2 steppers + tira LED puerta). Buck converter LM2596 12V→5V para resto. 4 servos DS04-NFC rotación continua 5V PWM desde Arduino. 2 steppers con drivers A4988. 4 botones + 2 micro switches a GND y pines digitales Arduino (pull-up interno). Conexiones con jumpers (un lío pero funciona). Tiras LED en puerta para iluminar interior. Código del proyecto con descripción abajo. Incluimos librerías Servo y LiquidCrystal, definimos pines LCD, 4 servos, pines steppers, detector moneda, 4 botones, 2 micro switches. Setup: modos de pines. Botones y micro switches con pull-up interno (HIGH en reposo, LOW al pulsar). Antes del loop principal, posicionamos carrier en inicio definido por micro switches (bucles while hasta pulsar). Loop principal: imprime "Insert a coin". Bucle while espera moneda (detector IR → LOW). Sale con break. Imprime "Select your item". Otro while espera botón. Imprime "Delivering". Switch según botón: mueve carrier con funciones Función Driver A4988 en 1/4 paso (quarter step). 4900 steps = posición superior (ajustado por prueba). Similar para otros movimientos. Servo rotación continua: Funciones ¡Simple! Espero que lo disfrutaras y aprendieras. Preguntas en comentarios y revisa mi colección Proyectos Arduino.Resumen

Construcción de la Máquina Expendedora




Sistema de Raíles








Unidades Dispensadoras


Panel Frontal


Esquema Eléctrico

Componentes

Código Arduino
/* DIY Vending Machine - Arduino Mechatronics Project */
#include <LiquidCrystal.h> #include <Servo.h>
LiquidCrystal lcd(27, 26, 25, 24, 23, 22);
Servo servo1, servo2, servo3, servo4; // DS04-NFC
#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);
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);
pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP); pinMode(button4, INPUT_PULLUP);
pinMode(microSwitchV, INPUT_PULLUP); pinMode(microSwitchH, INPUT_PULLUP);
// Posición inicial vertical
digitalWrite(dirPinVertical, HIGH);
while (true) {
if (digitalRead(microSwitchV) == LOW) { moveUp(70); break; }
digitalWrite(stepPinVertical, HIGH); delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW); delayMicroseconds(300);
}
// Posición inicial horizontal
digitalWrite(dirPinHorizontal, LOW);
while (true) {
if (digitalRead(microSwitchH) == LOW) { moveLeft(350); break; }
digitalWrite(stepPinHorizontal, HIGH); delayMicroseconds(300);
digitalWrite(stepPinHorizontal, LOW); delayMicroseconds(300);
}
}
void loop() {
lcd.clear(); lcd.setCursor(0,0); lcd.print("Insert a coin!");
while (true) { if (digitalRead(coinDetector) == LOW) 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?");
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; }
}
lcd.clear(); lcd.setCursor(0,0); lcd.print("Delivering...");
switch (buttonPressed) {
case 1: // Ubicación 1
moveUp(4900); delay(200); moveLeft(1700); delay(300);
servo1.writeMicroseconds(2000); delay(950); servo1.writeMicroseconds(1500); delay(500);
moveRight(1700); delay(200); moveDown(4900); break;
case 2: // Ubicación 2
moveUp(4900); delay(200);
servo2.writeMicroseconds(2000); delay(950); servo2.writeMicroseconds(1500); delay(500);
moveDown(4900); break;
case 3: // Ubicación 3
moveUp(2200); delay(200); moveLeft(1700); delay(300);
servo3.writeMicroseconds(2000); delay(950); servo3.writeMicroseconds(1500); delay(500);
moveRight(1700); delay(200); moveDown(2200); break;
case 4: // Ubicación 4
moveUp(2200); delay(200);
servo4.writeMicroseconds(2000); delay(950); servo4.writeMicroseconds(1500); delay(500);
moveDown(2200); break;
}
lcd.clear(); lcd.setCursor(0,0); lcd.print("Item delivered!"); delay(2000);
}
// Funciones movimiento
void moveUp(int steps) { /* ... */ }
void moveDown(int steps) { /* ... */ }
void moveLeft(int steps) { /* ... */ }
void moveRight(int steps) { /* ... */ }Explicación del Código
while (true) {
if (digitalRead(coinDetector) == LOW) break;
}while (true) {
if (digitalRead(button1) == LOW) { buttonPressed=1; break; }
// ... botones 2,3,4
}moveUp(), moveLeft(), etc., acciona servo correspondiente (2000μs = gira, 1500μs = para), vuelve a inicio.moveUp() ejemplo:void moveUp(int steps) {
digitalWrite(dirPinVertical, LOW);
for (int x=0; xwriteMicroseconds(2000) gira, 1500 para. 950ms = vuelta completa helicoidal (puede variar por motor).moveRight() y moveDown() devuelven carrier a inicio. Al final: "Item delivered".
Proceso de manufactura
- Máquinas expendedoras: Una industria de 36.600 millones de dólares en EE. UU.
- Construye tu propia máquina de escribir deberes casera (DIY Homework Writing Machine)
- Construye una consola de control DIY para Photoshop con Arduino Nano RP2040
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Construye un Sensor de Ritmo Cardíaco por Infrarrojos Fiable con Arduino: Guía Paso a Paso
- Tres en raya con Arduino, matriz LED MAX7219 y carcasa de cartón
- Construye un voltímetro DIY con Arduino y pantalla Nokia 5110 – Guía paso a paso
- Construye un Reloj Digital en Arduino usando una Máquina de Estados Finitos
- Construye una Máquina CNC Totalmente Funcional con Arduino Nano R3