网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月11日
漏签
0
天
arduino吧
关注:
75,374
贴子:
230,228
看贴
图片
吧主推荐
视频
游戏
1
2
3
下一页
尾页
101
回复贴,共
3
页
,跳到
页
确定
<<返回arduino吧
>0< 加载中...
【教程】用废软驱制作XY绘图仪 [1]:硬件篇
只看楼主
收藏
回复
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
最近吧里开始时兴数控设备的制作,这里我赶时髦写一个XY绘图仪的制作教程。这个项目除了几个关键部件之外,全部使用日常生活可以找到的材料,以突出屌丝DIY主题。
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
材料:
主要材料是两个笔记本电脑的软驱,属于办公室垃圾。其实用光驱更流行,但网上相似的教程已经很多了,用软驱的人几乎没有,而且软驱制作可以更加紧凑,缺点是运动范围很小。除此之外,还用了两片L293D芯片用于驱动步进电机,一个舵机用于抬笔,一个电位器和按钮开关用于笔的高度调整。控制使用了Arduino pro mini。所有电路搭在一块面包板上,正好占满全部连接。
2025-08-11 18:53:43
广告
不感兴趣
开通SVIP免广告
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
在X轴电机的磁头座上固定一个抬笔用的舵机比较困难,试了很多方法,最后用了超市扎口袋的铁丝条用钳子扭紧(不许笑)。
用了一个普通的钢票夹作为笔架,然后用了四段铁丝把票夹扭紧在舵机臂上,居然固定得很结实。
anaesthesia_vp
声名远扬
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
也太小了吧。。不过赞。。
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
Y轴电机的磁头座上用上面现成的螺丝固定了半片礼品卡(类似信用卡)作为绘图平面。堆叠的两块光驱靠中间的一块三层板和木螺丝(图上看不到)固定。剩下的半片礼品卡用来安装调节舵机位置的电位器和一个按钮开关。
悄悄说一下,其实楼主使用这些简陋材料主要不是因为神马DIY精神,而是为了利用假期验证某个软件算法想快速做出可用的硬件,没工夫去订购东西了。
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
电路部分:
为了在一块面包板上布下所有电路,电机驱动没有使用现成的电机驱动板,而是每个电机用了一个L293D H桥芯片来驱动,加上了相应位置一共12个0.1uF的去耦电容,去耦效果很不错,所以没有使用光耦隔离arduino和H桥。面包板的两路电源轨连接了两套不同的电源:一路是低电流5V电源来自电脑的USB线通过FTDI接口板(红色模块)连arduino和面包板一侧的电源轨,给arduino和L293D的逻辑部分供电;另一路是5V 2A的大电流整流电源,通过一个DC插座连到面包板的另一侧的电源轨,并联一个10 uF电容给步进电机,舵机,光电限位开关的红外LED和电位器供电。两套电源共地。
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
软件部分:
这里只说一下自编的试验硬件工作情况的测试软件。程序用了arduino自带的步进电机和舵机库,用于测试笔和舵机的固定情况,电机运行,以及舵机对笔压力的调整,还有舵机抬笔和落笔的动作。最后画了一个标定绘图范围的16 X 16 mm的方框表明全部硬件工作正常。
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
自编测试代码:
/* XY CNC made from two floppy drive
XX 2014 (C) */
#include <Stepper.h>
#include <Servo.h>
const int stepsPerRev = 20; //20 steps or 2mm/rev, 0.1mm/step
const int stepperSpeed = 200; // rpm or steps/3sec
const int fullRange = 160; //full range: 8 rev or 160 stepps
const int penLift = 5; //lift pen by this angle
const int photoIntPinX = 2; //photoInterupter Pin
const int photoIntPinY = 3;
const int servoPin = 5;
const int potPin = A4;
const int buttonPin = A5;
const int ledPin = 13;
boolean ledState = 0;
int posX, posY;
//int lastposX, lastposY;
int penLevel; //level of servo when pen touches paper
Stepper stepperX(stepsPerRev, 7,6,14,12); //top floppy
Stepper stepperY(stepsPerRev, 9,8,11,10); //bottom floppy
Servo servoPen;
void setup() {
stepperX.setSpeed(stepperSpeed); // rpm, or steps/3sec
stepperY.setSpeed(stepperSpeed);
servoPen.attach(servoPin);
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(photoIntPinX, INPUT_PULLUP);
pinMode(photoIntPinY, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
back2Origin(); //Origin is on upper-left corner
digitalWrite(ledPin, 1);//lit for adjustment
while (digitalRead(buttonPin)){//push button when done
penLevel = map(analogRead(potPin), 0, 1023, 60, 120);
servoPen.write(penLevel);
Serial.println (penLevel);
delay(30);
}
digitalWrite(ledPin, 0);
servoPen.write(penLevel + penLift);
delay(2000);
}
void loop(){
digitalWrite(ledPin, ledState);
ledState = !ledState;
delay(500);
if (!digitalRead(buttonPin)){ //push button to draw
drawBox();
drawCross();
}
}
//draw a box of drawing area starting from origin
void drawBox(){
//servoPen.write(penLevel + penLift);
back2Origin();
servoPen.write(penLevel);
stepperX.step(fullRange);
delay(50);
stepperY.step(fullRange);
delay(50);
stepperX.step(-fullRange);
delay(50);
stepperY.step(-fullRange);
delay(50);
servoPen.write(penLevel + penLift);
}
//draw a spiral box starting from origin
void drawSpiral(){
int boxWidth = fullRange;
servoPen.write(penLevel);
back2Origin();
while(boxWidth>0){
stepperX.step(boxWidth);
delay(50);
boxWidth-=10;
stepperY.step(boxWidth);
delay(50);
boxWidth-=10;
stepperX.step(-boxWidth);
delay(50);
boxWidth-=10;
stepperY.step(-boxWidth);
delay(50);
boxWidth-=10;
servoPen.write(penLevel + penLift);
}
}
void drawCross(){
back2Origin();
servoPen.write(penLevel);
for (int i=0; i < fullRange; i++){
stepperX.step(1);
stepperY.step(1);
}
servoPen.write(penLevel + penLift);
stepperX.step(-fullRange);
servoPen.write(penLevel);
for (int i=0; i < fullRange; i++){
stepperX.step(1);
stepperY.step(-1);
}
servoPen.write(penLevel + penLift);
}
void back2Origin(){ //back to zero for X and Y
while(!digitalRead(photoIntPinX)){ //high when reaching zero
stepperX.step(-1);
}
posX = 0;
while(!digitalRead(photoIntPinY)){ //high when reaching zero
stepperY.step(-1);
}
posY = 0;
}
2025-08-11 18:47:43
广告
不感兴趣
开通SVIP免广告
春泥蛋炒饭
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这只是测试硬件用的程序。下一个贴会专门讨论编写程序从串口接收G-code并解释执行,并分享一些常用的相关算法。
欢迎提问提建议。
如要转载,请注明出处:百度贴吧arduino吧。
anaesthesia_vp
声名远扬
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
目测重点是这个:drawSpiral()
w624158831
小有美名
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
没做过电机驱动,学习一下
maximscy
闻名一方
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
小猪会轮滑
赫赫有名
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
←_←我也要做
Delphi世界
颇具盛名
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
最好是上个开源的 XY gantry,那是再好不过的了,不知道哪里有这方面的资料
2025-08-11 18:41:43
广告
不感兴趣
开通SVIP免广告
Sam0205qe
崭露头角
2
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
牛逼哄哄的,顶起!!
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示