网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数: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
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 下一页 尾页
  • 101回复贴,共3页
  • ,跳到 页  
<<返回arduino吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示