DIY Arduino 智能售货机:机电一体化完整制作指南
本项目将从零制作一款 Arduino 售货机,涵盖 MDF 板切割组装、电子电路连接、Arduino 编程全流程。 可观看视频或阅读下方图文教程。 售货机包含:4 组出货单元(360°连续旋转舵机驱动螺旋弹簧)、XY 双轴载具系统(步进电机+同步带)、16×2 LCD、4 个选项按钮、红外硬币检测器。 载具系统虽非严格必须,但能增加项目复杂度与学习价值,适合机电一体化毕业设计或 Arduino 进阶练手。 基于 3D 模型(Thangs 下载)切割 8mm MDF 板。使用圆锯切割大板,曲线锯开孔。组装用木工胶+3mm 螺丝,配合 90° 角夹和 F 夹定位。 铝管导轨:横向 16mm 管×2(27cm),纵向 20mm 管×3(45cm)。18mm 实木板开槽嵌管。滑块用 21×21cm 木板 + M8 螺纹杆 + 22mm/16mm 轴承。调节双管间距消除间隙(扩槽+穿螺纹杆拉紧)。 横向步进电机装在纵向滑块上,纵向步进电机装在机箱顶部。同步带用扎带固定在滑块上。最终滑动顺滑无卡顿。 用 3mm 钢丝缠绕 7cm 直径喷漆罐制成螺旋弹簧,热熔胶固定在 DS04-NFC 连续旋转舵机上。 亚克力板封大窗,铝板开孔装按钮、投币口、LCD。红外接近传感器作硬币检测(硬币滑过触发)。两颗微动开关限定载具原点。LED 灯带照明内部。 12V/2A+ 供电 → LM2596 降压模块出 5V 供舵机、Arduino、传感器。步进电机用 A4988 驱动(12V 直供)。按键、微动开关接地+数字口,启用内部上拉。杜邦线连接略显杂乱但功能正常。 元件链接: 教程结束。代码简洁易懂,适合二次开发扩展(如添加库存计数、网络支付等)。欢迎提问交流!功能概述

机箱制作与组装



XY 轨道系统








出货单元


前门面板



电路原理图

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; // 4出货舵机
#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);
// 回零:垂直向上触发微动 -> 微调 70 步
digitalWrite(dirPinVertical, HIGH);
while (true) { if (digitalRead(microSwitchV)==LOW) { moveUp(70); break; }
digitalWrite(stepPinVertical, HIGH); delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW); delayMicroseconds(300); }
// 水平向左触发微动 -> 微调 350 步
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: // 货道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: // 货道2:右上
moveUp(4900); delay(200);
servo2.writeMicroseconds(2000); delay(950); servo2.writeMicroseconds(1500); delay(500);
moveDown(4900); break;
case 3: // 货道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: // 货道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);
}
// 步进电机通用移动函数(1/4 细分,脉冲宽 300μs)
void moveUp(int steps) { digitalWrite(dirPinVertical, LOW); for(int x=0;x代码关键点解析
buttonPressed。writeMicroseconds(2000) 正转,1500 停止(连续旋转舵机中位)。脉宽可能需微调。
制造工艺
- 自动售货机:美国366亿美元的产业巨头
- 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
- DIY Photoshop 硬件控制台:Arduino Nano RP2040 实现快捷键外设
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 用 Arduino 制作超声波悬浮装置:分步指南
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
- 基于有限状态机的 Arduino 电子表 – YAKINDU Statechart Tools 实战
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
- 基于 Arduino UNO 构建可靠的智能能源监测仪——分步指南