亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

DIY Arduino 智能售货机:机电一体化完整制作指南

本项目将从零制作一款 Arduino 售货机,涵盖 MDF 板切割组装、电子电路连接、Arduino 编程全流程。

可观看视频或阅读下方图文教程。

功能概述

售货机包含:4 组出货单元(360°连续旋转舵机驱动螺旋弹簧)、XY 双轴载具系统(步进电机+同步带)、16×2 LCD、4 个选项按钮、红外硬币检测器。

DIY Arduino 智能售货机:机电一体化完整制作指南

载具系统虽非严格必须,但能增加项目复杂度与学习价值,适合机电一体化毕业设计或 Arduino 进阶练手。

机箱制作与组装

基于 3D 模型(Thangs 下载)切割 8mm MDF 板。使用圆锯切割大板,曲线锯开孔。组装用木工胶+3mm 螺丝,配合 90° 角夹和 F 夹定位。

DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南

XY 轨道系统

铝管导轨:横向 16mm 管×2(27cm),纵向 20mm 管×3(45cm)。18mm 实木板开槽嵌管。滑块用 21×21cm 木板 + M8 螺纹杆 + 22mm/16mm 轴承。调节双管间距消除间隙(扩槽+穿螺纹杆拉紧)。

DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南

横向步进电机装在纵向滑块上,纵向步进电机装在机箱顶部。同步带用扎带固定在滑块上。最终滑动顺滑无卡顿。

DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南

出货单元

用 3mm 钢丝缠绕 7cm 直径喷漆罐制成螺旋弹簧,热熔胶固定在 DS04-NFC 连续旋转舵机上。

DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南

前门面板

亚克力板封大窗,铝板开孔装按钮、投币口、LCD。红外接近传感器作硬币检测(硬币滑过触发)。两颗微动开关限定载具原点。LED 灯带照明内部。

DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南
DIY Arduino 智能售货机:机电一体化完整制作指南

电路原理图

DIY Arduino 智能售货机:机电一体化完整制作指南

12V/2A+ 供电 → LM2596 降压模块出 5V 供舵机、Arduino、传感器。步进电机用 A4988 驱动(12V 直供)。按键、微动开关接地+数字口,启用内部上拉。杜邦线连接略显杂乱但功能正常。

元件链接:

  • LM2596 降压模块…………
  • 16×2 LCD…………………
  • 360° 连续旋转舵机………
  • NEMA 17 步进电机…………
  • A4988 驱动模块……………
  • 红外接近传感器……………
  • 按钮、微动开关……………
  • Arduino 开发板……………

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

代码关键点解析

  • 上拉输入: 按键/微动常态 HIGH,按下接地变 LOW。
  • 开机回零: 双轴分别向极限方向移动直到触发微动开关,再微调偏移到固定原点。
  • 投币检测: 红外传感器输出 LOW 表示有币通过。
  • 选品逻辑: 阻塞式等待按键,按键值存入 buttonPressed。
  • 出货流程: XY 载具移动到目标货道坐标(步数经实测标定)→ 对应舵机转 950ms(约一圈)→ 载具归位。
  • 舵机控制: writeMicroseconds(2000) 正转,1500 停止(连续旋转舵机中位)。脉宽可能需微调。

教程结束。代码简洁易懂,适合二次开发扩展(如添加库存计数、网络支付等)。欢迎提问交流!

制造工艺

  1. 自动售货机:美国366亿美元的产业巨头
  2. 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
  3. DIY Photoshop 硬件控制台:Arduino Nano RP2040 实现快捷键外设
  4. 用 Arduino 打造绚丽显示器 Ambilight 系统
  5. 用 Arduino 制作超声波悬浮装置:分步指南
  6. Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
  7. Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
  8. Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
  9. Arduino DIY 电压表:Nokia 5110 屏幕显示,手把手教学
  10. 基于有限状态机的 Arduino 电子表 – YAKINDU Statechart Tools 实战
  11. 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
  12. 基于 Arduino UNO 构建可靠的智能能源监测仪——分步指南