DIY Arduino 3D 线材弯折机:机电一体化项目全攻略
本教程展示如何制作一款 Arduino 控制的 3D 线材弯折机。这是一个典型的机电一体化系统,融合机械、电子与计算机工程,非常适合工科学生或机电入门者练手。 可观看视频或阅读下方图文教程。 线材先经多组直滚轮矫直,由步进电机精准送料至弯折机构。弯折机构包含一颗步进电机(旋转弯折齿轮)和一颗微型舵机(驱动齿条弹出弯折销)。Z 轴步进电机带动整个弯折头绕线材旋转,从而实现三维成型。主控为 Arduino,电路集成在定制 PCB 上。固件内置星形、立方体、支架等自动成型程序,并提供串口手动模式。 SolidWorks 建模,Thangs 在线查看/下载。齿轮、轴承座、联轴器等关键件 3D 打印(Creality CR-10,打印质量优)。 底座与导轨: 8mm MDF 双层底板 + 4 根 18mm 胶合板立柱,木工胶+螺丝固定。顶板安装 3D 打印轴承座(垫 3mm MDF 调高),装入 6202 轴承(外径 35mm、内径 15mm),穿 15mm 空心铜管作为 Z 轴主轴(长约 30cm)。主轴中部固定 30 齿模数 1.5 齿轮(M3 螺母嵌入槽内锁紧)。 Z 轴驱动: NEMA 17 步进电机 + 18 齿齿轮,3D 打印安装支架(长孔便于啮合调整)。 送料机构: NEMA 17 直装顶板,输出轴接 3D 打印联轴器+铜管作为摩擦轮。对侧装压料杠杆(带轴承),通过胶合板块+T型螺母+螺栓调节压力,保证送料摩擦力。 矫直系统: 胶合板钻孔装 3 组/2 组矫直轮(轴承+3D 打印槽形外环),对向夹紧,螺母调节间隙。前后各加一块导向板。 弯折机构: MDF 板开 38mm 孔装 NEMA 23 大扭矩步进电机,输出轴装 18 齿模数 2.5 齿轮,与 30 齿大齿轮啮合。大齿轮集成 MG996R 舵机安装座,舵机驱动齿条机构:齿条端部装铜管作为弯折触点,AB 胶固定轴承于大齿轮。齿条小齿轮锁在舵机摇臂上。 弯折头安装到 Z 轴: 两个 3D 打印轴夹通过 M6 螺栓锁在弯折板上,再夹紧在 Z 轴铜管上。加装 3mm 出线喷嘴和弯折头底部微动开关(用于回零)。 3 颗 DRV8825 驱动 3 个步进电机(NEMA 17×2 + NEMA 23×1),12V/3A+ 供电。MG996R 舵机另接 LM7805 降压供电(Arduino 5V 稳压器带不动)。弯折头微动开关接数字引脚(上拉)。 元件链接: EasyEDA 双层布线,集成:3 路步进驱动器插座(含细分选择跳针)、舵机接口、双微动开关、电源端子、额外 IO 引出。生成 Gerber 交 JLCPCB 制板(首单 $2/10pcs)。 焊接排针、贴片元件、驱动器插座、Arduino 排母、端子、电源开关。步进细分选 16 细分(对应跳针)。 使用 星形生成逻辑( 手动模式( 完整代码(含 矫直系统若拧太紧会导致送料打滑。可尝试:更高强度材料替代铜管、重新设计送料轮结构(如滚花轮、双轮夹持)。 教程结束。欢迎提问交流,关注我的 Arduino 项目合集!工作原理概述


3D 模型与打印件



机械结构制作

















电路原理图

PCB 设计






Arduino 固件详解
AccelStepper 库驱动步进电机,Servo.h 控制舵机。定义 STEP/DIR 引脚、限位开关、串口指令缓冲。#include <AccelStepper.h> #include <Servo.h>
#define limitSwitch 11
AccelStepper feederStepper(1, 5, 6); // STEP=5, DIR=6
AccelStepper zAxisStepper(1, 7, 8); // STEP=7, DIR=8
AccelStepper benderStepper(1, 9, 10); // STEP=9, DIR=10
Servo servo01;
String dataIn = ""; String manualStatus = "";
int count = 0, dist;setup():舵机初始位(弯折销收回 40°),三电机最大速度 2000 steps/s。弯折电机回零:反向转动触发限位开关 → 设当前位置为 0 → 正转 1400 步到弯折起始位 → 再置 0。void setup() {
Serial.begin(9600);
pinMode(limitSwitch, INPUT_PULLUP);
servo01.attach(2); servo01.write(40);
feederStepper.setMaxSpeed(2000);
zAxisStepper.setMaxSpeed(2000);
benderStepper.setMaxSpeed(2000);
// 回零
while (digitalRead(limitSwitch) != 0) {
benderStepper.setSpeed(1200); benderStepper.runSpeed();
benderStepper.setCurrentPosition(0);
}
delay(40);
while (benderStepper.currentPosition() != -1400) {
benderStepper.setSpeed(-1200); benderStepper.run();
}
benderStepper.setCurrentPosition(0);
}loop() 读取串口指令:manual 进入手动模式,star/cube/stand 执行预设图形。void loop() {
String mode = Serial.readString();
if (mode.startsWith("manual")) manual();
if (mode.startsWith("star")) star();
if (mode.startsWith("cube")) cube();
if (mode.startsWith("stand")) stand();
}star()): 循环 5 次(五角星)。每次:送料 38mm(步进换算系数 48 steps/mm)→ 弯折销抬起 → 弯折 -52° → 回零 → 再送料 38mm → 弯折销压下 → 弯折头转到新初始位(-42°) → 弯折销抬起 → 反向弯折 +105° → 回零 -63° → 弯折销压下。角度换算常数 angleConst=18(steps/度)。void star() {
while (count != 5) {
int feed = 38; int feedDistance = feed * 48;
while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); }
feederStepper.setCurrentPosition(0); servo01.write(40); delay(200);
int angleConst = 18;
// 弯折 -52°
while (benderStepper.currentPosition() != -52 * angleConst) { benderStepper.setSpeed(-700); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(100);
// 回零 +52°
while (benderStepper.currentPosition() != 52 * angleConst) { benderStepper.setSpeed(1200); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(100);
// 二次送料
while (feederStepper.currentPosition() != feedDistance) { feederStepper.setSpeed(1200); feederStepper.run(); }
feederStepper.setCurrentPosition(0); delay(100);
servo01.write(130); delay(200); // 压下弯折销
// 移至反向弯折初始位 -42°
while (benderStepper.currentPosition() != -42 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(200);
servo01.write(40); delay(200); // 抬起
// 反向弯折 +105°
while (benderStepper.currentPosition() != 105 * angleConst) { benderStepper.setSpeed(700); benderStepper.run(); }
benderStepper.setCurrentPosition(0); delay(50);
// 回零 -63°
while (benderStepper.currentPosition() != -63 * angleConst) { benderStepper.setSpeed(-1200); benderStepper.run(); }
delay(100); servo01.write(130); benderStepper.setCurrentPosition(0); count++;
}
}manual()): 串口指令解析——f[mm] 送料,b[deg] 弯折(支持负号),z[deg] Z 轴旋转,end 退出。弯折时自动处理弯折销上下、正反向初始位切换。if (dataIn.startsWith("f")) { // 送料
dist = dataIn.substring(1).toInt() * 48;
while (feederStepper.currentPosition() != dist) { feederStepper.setSpeed(1200); feederStepper.run(); }
feederStepper.setCurrentPosition(0);
}
if (dataIn.startsWith("b")) { // 弯折
// 解析角度,处理正负号,自动切换弯折销状态与初始位
}
if (dataIn.startsWith("z")) { // Z轴
// 解析角度驱动 zAxisStepper
}cube()、stand()、完整 manual())见文末。已知问题与改进

制造工艺