您的位置 首页 > 数码极客

激光雕刻机——激光雕刻机可以雕刻什么材料

近期有小伙伴留言,说家里有个废旧的电脑主机,扔了怪可惜的,想利用它结合单片机开发板DIY一个项目,这时我想到一个我以前做过的激光雕刻机项目,于是凭着记忆又做了一遍,效果还不错,下面我就把详细过程公布出来和大家共享一下,希望你们看完有所收获,感兴趣的小伙伴一起get起来啊!

这里再次感谢以前一个同事的资料,让我少走了一些弯路。

废话不多说直接上实物图:

首先拆解废旧光驱

下面取出步进电机架子

下面把光驱外壳折叠成这个样子

把丝杆与步进电机这样固定住,小铁棒就是激光的位置。↓

下面这个铁棒是为了让它垂直的

下面这个古代软盘就是工作台,哈哈全是废物利用

下面开始焊接杜邦线

基本成型

成型

上位机软件截图

简单接线图

元器件清单

台式机光驱 x2

l298n电机驱动模块 x2

51最小系统 x1

usb-ttl模块 x1

uln2003模块 x1

250mw激光模组 x1

导线若干

参考C程序

/*z地址定义

50 1=x+,2=x-,3=y+,4=y-

51 前进后退步数高

52 前进后退步数低

53

54/55 字宽

56

57 弱光开关

58/59 激光强度

60 x轴速度

61 y轴速度

62 开始打印0,57

63 暂停

64 停止标志

65

66 左右标记

100开始时灰度图数据

*/

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

#define N z[60] //X速度

#define M z[61] //Y速度

sbit a=P1^3;//步进电机接线定义 移动激光头

sbit a_=P1^2;

sbit b=P1^1;

sbit b_=P1^0;

sbit xa=P1^4;

sbit xa_=P1^5;

sbit xb=P1^6;

sbit xb_=P1^7;

/*sbit a=P1^4;//步进电机接线定义 移动底板

sbit a_=P1^5;

sbit b=P1^6;

sbit b_=P1^7;

sbit xa=P1^3;

sbit xa_=P1^2;

sbit xb=P1^1;

sbit xb_=P1^0; */

sbit jg=P2^0;

sbit led=P2^1;//指示灯

uchar xdata z[500]={0};//缓存

uchar buff[3];//串口缓存

uchar x1,x0,y1,y0,cont2=0;

uchar xfb=4,yfb=4;//走步标志位

unsigned char HighRH = 0; //高电平重载值的高字节

unsigned char HighRL = 0; //高电平重载值的低字节

unsigned char LowRH = 0; //低电平重载值的高字节

unsigned char LowRL = 0; //低电平重载值的低字节

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

/* 配置并启动PWM,fr-频率,dc-占空比 */

void ConfigPWM(unsigned int fr, unsigned char dc)

{

unsigned int high, low;

unsigned long tmp;


tmp = (11059200/12) / fr; //计算一个周期所需的计数值

high = (tmp*dc) / 100; //计算高电平所需的计数值

low = tmp - high; //计算低电平所需的计数值

high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时

low = 65536 - low + 12; //计算低电平的重载值并补偿中断延时

HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节

HighRL = (unsigned char)high;

LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节

LowRL = (unsigned char)low;

TMOD &= 0xF0; //清零T0的控制位

TMOD |= 0x01; //配置T0为模式1

TH0 = HighRH; //加载T0重载值

TL0 = HighRL;

ET0 = 1; //使能T0中断

TR0 = 1; //启动T0

jg = 1; //输出低电平,关闭激光

}

/* 关闭PWM */

void ClosePWM()

{

TR0 = 0; //停止定时器0

ET0 = 0; //禁止定时器0中断

jg = 1; //输出低电平,关闭激光

}

/* T0中断服务函数,产生PWM输出 */

void InterruptTimer0() interrupt 1

{

if (jg == 1) //当前输出为低电平时,装载高电平值并输出高电平

{

TH0 = LowRH;

TL0 = LowRL;

jg = 0;

}

else //当前输出为高电平时,装载低电平值并输出低电平

{

TH0 = HighRH;

TL0 = HighRL;

jg = 1;

}

}

void xfor(uint i) //x轴前进函数,前进多少步

{

while(1)

{

if(xfb==4)

{

xa=xb=1;

xb_=xa_=0;

xfb=1;

i--;

delayms(N);

if(i==0){xa=xb=0; break;}

}

if(xfb==1)

{

xb=xa_=1;

xa=xb_=0;

xfb=2;

i--;

delayms(N);

if(i==0){xa_=xb=0; break;}

}

if(xfb==2)

{

xa_=xb_=1;

xb=xa=0;

xfb=3; //走步标志位

i--;

delayms(N);

if(i==0){xa_=xb_=0; break;}

}

if(xfb==3)

{

xa_=xb=0;

xb_=xa=1;

xfb=4;

i--;

delayms(N);

if(i==0){xa=xb_=0; break;}

}

}

}

void xbac(uint i) //xxx后退函数

{

while(1)

{

if(xfb==1)

{

xa_=xb=0;

xb_=xa=1;

xfb=4;

i--; //走步标志位

delayms(N);

if(i==0){xa=xb_=0; break;}

}

if(xfb==4)

{

xa_=xb_=1;

xb=xa=0;

xfb=3;

i--;

delayms(N);

if(i==0){xa_=xb_=0; break;}

}

if(xfb==3)

{

xb=xa_=1;

xa=xb_=0;

xfb=2; //走步标志位

i--;

delayms(N);

if(i==0){xa_=xb=0; break;}

}

if(xfb==2)

{

xa=xb=1;

xb_=xa_=0;

xfb=1;

i--;

delayms(N);

if(i==0){xa=xb=0; break;}

}

}

}

void yfor(uint i) //y轴前进函数

{

while(1)

{

switch(yfb)

{

case 4:{a=b=1; b_=a_=0; yfb=1; i--; delayms(M); if(i==0){a=b=0;break;}}

case 1:{b=a_=1; a=b_=0; yfb=2; i--; delayms(M); if(i==0){a_=b=0;break;}}

case 2:{a_=b_=1; b=a=0; yfb=3; i--; delayms(M); if(i==0){a_=b_=0;break;}}

case 3:{b_=a=1; a_=b=0; yfb=4; i--; delayms(M); if(i==0){a=b_=0;break;}}

}

if(i==0) break;

}

}

void ybac(uint i) //yy后退函数

{

while(1)

{

switch(yfb)

{

case 1:{a=b_=1; b=a_=0; yfb=4; i--; delayms(M); if(i==0){a=b_=0;break;}}

case 4:{b_=a_=1; a=b=0; yfb=3; i--; delayms(M); if(i==0){a_=b_=0;break;}}

case 3:{a_=b=1; b_=a=0; yfb=2; i--; delayms(M); if(i==0){a_=b=0;break;}}

case 2:{b=a=1; a_=b_=0; yfb=1; i--; delayms(M); if(i==0){a=b=0;break;}}

}

if(i==0) break;

}

}

void dazi(uint zik)//打印函数 ******打印函数已更改******

{

uint x;

jg=0;


for(x=0;x<zik;x++)//执行zik个循环,x轴右移zik步

{

while(z[63]); //暂停等待

if(z[64]==1) break;//停止标志 跳出循环

SBUF=255; // 每开始打印一个点,向上位机发送255,上位机进度显示用

jg=0; //开激光

delayms((z[99+x]*(z[58]*256+z[59]))/100);

jg=1; //关闭激光

if(z[66]==1)

{

xbac(1);

}

else

{

xfor(1);

}

}

if(z[64==1]) z[64]=0;

else{yfor(1);} //y轴进一行

z[62]=0; //一行打印完成

SBUF=1; //发送信息,表示打印一行完成


}

/* 串口配置函数,baud-通信波特率 */

void ConfigUART(unsigned int baud)

{

SCON = 0x50; //配置串口为模式1

TMOD &= 0x0F; //清零T1的控制位

TMOD |= 0x20; //配置T1为模式2

TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值

TL1 = TH1; //初值等于重载值

ET1 = 0; //禁止T1中断

ES = 1; //使能串口中断

TR1 = 1; //启动T1

}

void chuanlo() interrupt 4

{

if(RI)

{

buff[cont2]=SBUF;//每次3字节,地址高,地址低,数据,,


cont2++;

if(cont2==3)//每收3个字节,把数据写入地址中

{

z[(buff[0]*256)+buff[1]]=buff[2];

cont2=0;

SBUF=0; //*****************在这里加入这行代码测试一下*******************************

}

RI=0;


}

if(TI)

{

TI=0;

}

}

鉴于篇幅限制,只能写部分代码

好了以上写的够详细了吧?最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,如果需要 程序完整源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。

如果喜欢请点赞评论加关注哦!

谢谢!

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐