a library for laser printer based on https://os.mbed.com/users/xmwmx/code/wmx_laser_copy/
Dependents: Example_for_learning_easy
laser.cpp
- Committer:
- Dennis_Yu
- Date:
- 2018-10-16
- Revision:
- 2:35089485bc89
- Parent:
- 1:9cfdf3c372b5
File content as of revision 2:35089485bc89:
#include "laser.h" laser::laser(Esp8266 & iClient, SDFileSystem & iSD) :client(iClient), sd(iSD), switch_GS(PC_15), switch_pos1(PC_8), //P25 switch_pos2(PA_6), //P26 switch_pos3(PA_11), //P27 fp_drawing(NULL), status(0), Endoffile(0) { Lenoflattice = 1 ;//mm 取1mm为xy单元 unit_xy/Lenoflattice=100 unit_xy = 100; //单位长度(xy移动一格)对应unit_xy转 大约10cm/3圈/9600step 约96mm/9600step=0.1mm/10step unit_x = 103; //单位长度(xy移动一格)对应unit_x转 大约10cm/3圈/9600step 约96mm/9600step=0.1mm/10step unit_y = 103; //单位长度(xy移动一格)对应unit_y转 大约10cm/3圈/9600step 约96mm/9600step=0.1mm/10step ///Ticker ticker_step; step_halfperiod = 0.0001;//0.0002; dir_x = 1;///调试时调整 dir_y = 1;///调试时调整 dot_max = 30; //灰度最大值对应多少次激光点击 dot_last = 0.005; //每次激光点击持续多久 H_max = 255; //灰度值最大值 k = 1.0; //缩放比例 y=0;//图片y边长 x=0;//图片x边长 key=0;//判断变量 dot=0;//点计数 flag=0; } void laser::moveto(float x, float y) { rotate(0, (x - now_x)*unit_xy); rotate(1, (y - now_y)*unit_xy); now_x = x; now_y = y; } void laser::rotate(int id, int pix) //id= 0--x,1--y pix=3200为一圈 { if (pix >= 0) { dir[0] = dir_x; dir[1] = dir_y; } else { pix = -pix; dir[0] = 1 - dir_x; dir[1] = 1 - dir_y; } for (int i = 0; i < pix; i++) { step[id] = 1; wait(step_halfperiod); step[id] = 0; wait(step_halfperiod); } } void laser::markdot(float value) { //switch_GS=1; int Ndot = floor(value * dot_max / H_max); for (int i = 0; i < Ndot; i++) { switch_GS = 1; wait(dot_last); switch_GS = 0; } } void laser::draw() { unit_xy=unit_xy*k; float x, y, v; fp_drawing = fopen("/sd/write.txt", "r"); ser2usb.printf("reading\r\n"); for (int i = 0; fscanf(fp_drawing, "(%f,%f,%f)", &x, &y, &v) == 3; i++) { ser2usb.printf("(%f,%f,%f)|%d|%d\r\n", x, y, v,i,dot); moveto(x, y); markdot(v); } fclose(fp_drawing); }