自制投币式个人售货机 - 完整零件清单与组装指南
核心材料清单 (BOM)
| 类别 | 物料 | 规格/数量 | 备注 |
|---|---|---|---|
| 结构件 | 1/4" 胶合板 | 4 张 | 按图纸裁切: 侧板 18"×23.75"×2, 顶底板 21"×18"×2, 前后板 21"×24.25"×2, 中隔板 18"×23.75" |
| 3/4" 方木条 | 1 批 | 作角码连接板件, 长度匹配板厚 | |
| 平口金属搁板支架 | 1 根 | 折弯成 ∧ 型作货道中分隔 | |
| 3D 打印线圈轮 | 4 套 | 配合 28BYJ-48 电机轴, 直径略小于线圈内径 | |
| 电控系统 | Arduino Mega 2560 | 1 | 54 路 IO, 4 硬件串口, 适合多电机并行 |
| 28BYJ-48 5V 步进电机 + ULN2003 驱动板 | 5 套 | 4 套用于货道, 1 套备用/扩展 | |
| 5V 4 路继电器模块 (光耦隔离) | 1 | 给步进电机供电断电, 防止过热 | |
| L293D 驱动芯片 | 1 | 驱动继电器线圈, Arduino 输出电流不足时 | |
| ATX 电脑电源 (300W+) | 1 | 提供 12V(电机/继电器) 和 5V(逻辑/Arduino) | |
| 交互与检测 | 1602 I2C LCD (或并口 + I2C 模块) | 1 | 显示选单、价格、投币提示 |
| 带灯微动按钮 | 4 | 选品按键, 自带 LED 指示 | |
| 电子投币器 (脉冲输出型) | 1 | 输出脉冲数对应币值, 接中断脚 | |
| WS2812B LED 灯带 | 2 条 | 货道照明/氛围灯, 可选 | |
| 连接耗材 | 1.27mm 排线 + 2.54mm 公母座 | 1 套 | 模块化连接, 便于维护 |
| 杜邦公母头外壳 40P | 635 件套 | 自制各种连接线 | |
| 8AWG 裸铜线 | 50 英尺 | 绕制弹簧线圈(出货推杆) |
所需工具
- 台锯/圆锯 (或木材店代切)
- 电烙铁、焊锡、热缩管
- 热熔胶枪、胶棒
- 万用表、剥线钳、螺丝刀套装
机箱组装步骤
1. 板材裁切与角码准备
按尺寸裁切胶合板。每个板件连接处预留 3/4"×3/4" 角码位置。方木条切段备用。
2. 箱体组装
- 底板平放,四角粘贴/螺丝固定角码
- 竖立两侧板 (18"D × 23.75"H),底部固定在底板角码上
- 安装中隔板 (18"D × 23.75"H),从顶部量下 16.25" 和 8.25" 处固定角码,放入上下两层搁板 (13"W × 12"D)
- 安装顶板 (21"W × 18"D),锁紧所有角码
- 安装前后板 (21"W × 24.25"H),完成封闭箱体
关键尺寸:整机外尺 21"W × 18"D × 24.25"H。货道上下层间距 8",搁板深 12",每层左右各半宽 6.5"。
3. 步进电机与出货线圈安装
- 在搁板上测量标记:距左侧 6.5" 为中线,左右各 3.25" 为两货道中心
- 根据 3D 打印轮直径 + 1/4" 间隙确定电机安装高度,钻孔固定电机
- 弹簧线圈制作:找 1.5" 直径圆管 (喷漆罐/胶水管),缠绕 8AWG 铜线。一侧起始 1" 处开始,间距 2" 打标记;另一侧每 2" 打标记。按标记缠绕形成 2" 节距线圈。糖果条可缩短至 1" 节距
- 线圈 1" 侧压缩成圆环套入 3D 打印轮边缘,热熔胶固定
电路系统接线
继电器供电控制电路 (L293D 驱动)
用 L293D 驱动继电器模块的使能端,实现 Arduino 控制 12V 电机供电总开关:
| L293D 引脚 (缺口朝左) | 连接目标 |
|---|---|
| Pin 1 (1,2EN) | Arduino D10 |
| Pin 2 (1A) | Arduino D9 |
| Pin 3 (1Y) | 继电器模块 VCC+ (左侧第1脚) |
| Pin 4,5 (GND) | 面包板 12V 地 |
| Pin 6 (2Y) | 继电器模块 GND (左侧第3脚) |
| Pin 7 (2A) | Arduino D8 |
| Pin 8 (VCC2) | 面包板 +12V |
继电器模块中间公共端接 +12V,常开端 (右侧后脚) 接 4 块 ULN2003 驱动板的 VCC 总线。
4 路步进电机驱动接线
每路 ULN2003 驱动板 4 路输入 (IN1-IN4) 接 Arduino 数字引脚:
| 电机 | 颜色标识 | Arduino 引脚 |
|---|---|---|
| M1 (左上货道) | 蓝 | D22, D24, D26, D28 |
| M2 (右上货道) | 黄 | D23, D25, D27, D29 |
| M3 (左下货道) | 绿 | D30, D32, D34, D36 |
| M4 (右下货道) | 红 | D31, D33, D35, D37 |
注意:D22-D37 为 Mega 扩展引脚,前两个 (D20/D21) 是 I2C 保留,勿占用。
按键与 LCD 接线
| 模块 | 接线 |
|---|---|
| 4×按钮 | 一端接 5V,另端接 220Ω 电阻接地并分别接 A0-A3 (模拟口作数字输入) |
| 1602 LCD (并口模式) | VSS-GND, VDD-5V, V0-电位器中间脚(两侧接 5V/GND 调对比度), RS-D2, RW-GND, E-D3, D4-D4, D5-D5, D6-D6, D7-D7, A-5V, K-GND |
投币器接线
- 投币器脉冲输出 → Arduino D21 (INT0, 中断脚)
- 投币器 12V 供电 ← ATX 12V 总线
- 每个脉冲 = 1 元/5 元 (按投币器设定),代码中累加金额
ATX 电源改装
- 剪断并剥离:黑线 (GND) Pin3/7/19/24,绿线 (PS_ON) Pin16,黄线 (+12V) Pin10/11,红线 (+5V) Pin21
- Pin3(GND) + Pin16(Green) → 自锁开关 → 接回电源插座 (开机触发)
- Pin7(GND) + Pin10(+12V) → 面包板 12V 总线 (供电机/继电器/灯带)
- Pin24(GND) + Pin11(+12V) → DC 插头/接线端子 → Arduino Mega 电源插座 (Mega 自带稳压至 5V)
- Pin19(GND) + Pin21(+5V) → 面包板 5V 总线 (供逻辑/传感器/LCD/投币器逻辑侧)
软件逻辑与代码版本
版本演进
- 基础版:按键直接出货,无投币判断
- 灯光版:出货时 RGB 灯带跑马灯动画
- 投币版 (最终):投币累积金额 → 够钱才允许出货 → 出货扣款
投币版核心逻辑 (关键片段)
const int COIN_PIN = 21; // 中断脚
const int TARGET_CENTS = 100; // 1元 = 100分, 投币器每脉冲 5分
volatile int cents = 0;
int credits = 0;
void setup() {
attachInterrupt(digitalPinToInterrupt(COIN_PIN), coinISR, RISING);
// ... LCD、步进电机、按键、灯带初始化 ...
}
void loop() {
// 累积金额换算信用额度
if (cents >= TARGET_CENTS) {
credits++; cents -= TARGET_CENTS;
}
// 显示当前金额/信用
lcd.setCursor(0,0); lcd.print(cents); lcd.print("c ");
lcd.setCursor(0,1); lcd.print(credits); lcd.print("cr ");
if (credits > 0) { // 有信用额度才响应按键
readButtons();
if (btn1Pressed && !btn2Pressed) { vend(0); credits--; cents=0; }
if (btn2Pressed && !btn1Pressed) { vend(1); credits--; cents=0; }
if (btn3Pressed && !btn4Pressed) { vend(2); credits--; cents=0; }
if (btn4Pressed && !btn3Pressed) { vend(3); credits--; cents=0; }
}
}
void coinISR() { cents += 5; digitalWrite(13, HIGH); } // 每脉冲 5分
void vend(int motorIndex) {
digitalWrite(ENABLE_RELAY, HIGH); // 合上继电器供电
// RGB 灯带动画...
steppers[motorIndex].step(STEPS_PER_REV); // 正转一圈
// M4 反向安装需 step(-STEPS_PER_REV)
delay(2500); // 等待取货
digitalWrite(ENABLE_RELAY, LOW); // 断开电机电源防过热
// 灯带复位...
}
关键调试要点
- 步进电机方向:M4 反向安装,代码中用负步数;其余正向
- 电机过热保护:出货完成立即断开继电器切断电机电源
- 投币器脉冲标定:实测每枚硬币产生脉冲数,修改
cents += X - 线圈卡滞:节距过大/线圈变形会卡货,微调节距或涂润滑脂
- LCD 对比度:必须接电位器调节 V0,否则字符不可见
- 供电压降:4 电机同时转动瞬间电流大,ATX 12V 线要粗,矩阵首尾并联供电
扩展建议
- 加入红外/重量传感器检测出货成功,失败自动重试或退款
- 接入 ESP32/树莓派,增加微信/支付宝扫码支付、库存上云、远程监控
- 设计专用 PCB 整合 L293D、ULN2003、按键、投币器接口,减少飞线
- 外壳加装亚克力透明门 + 电磁锁,防盗防尘
- 增加语音播报模块 (DFPlayer Mini) 提升交互体验
原理图
完整系统原理图包含:ATX 电源分配、L293D 继电器驱动、4×ULN2003 电机驱动、LCD、按键分压、投币器中断、RGB 灯带、Arduino Mega 引脚分配表。详见项目附件高清原理图。
制造工艺