% Clear the workspace clear all; close all; clc; % Reload breakpoints ActivateBreakpoints; % Define program variables Update_size = 30; GCode_size = 40; flags.Randomize = false; % Update command line UpdateStr = sprintf(' -------- PROGRAM START! --------\n'); UpdateStr = [UpdateStr,sprintf('Started %s\n',datestr(now,'HH:MM:SS dd-mmm-yyyy'))]; fprintf(UpdateStr); RunTimer = tic; % Define bed parameters Bed_size = [400,400]; Soft_border = [10,10]; Nozzle_offset = [40,18]; Mesh_edges = [Soft_border(1),Soft_border(2); Bed_size(1)-Soft_border(1),Bed_size(2)-Soft_border(2)]; Mesh_pts = [3,3]; Z_travel = 10; Z_probe = 5; Z_liftspeed = 20; Z_divespeed = 10; XY_speed = 50; nSamples = 3; nReps = 1; %% Create coordinates list % Update command line UpdateStr = sprintf('Generating coordinate list...'); Padding = repmat(',',1,Update_size-length(UpdateStr)); fprintf(UpdateStr); Coord_timer = tic; try X_list = linspace(Mesh_edges(1,1),Mesh_edges(2,1),Mesh_pts(1)); Y_list = linspace(Mesh_edges(1,2),Mesh_edges(2,2),Mesh_pts(2)); Lines_total = Mesh_pts(1)*Mesh_pts(2)*nReps; Coord_list = []; Line_ind = 1; for Rep_count = 1:nReps for X_ind = 1:Mesh_pts(1) if ~flags.Randomize && mod(X_ind,2) == 0 Y_start = Mesh_pts(2); Y_step = -1; Y_finish = 1; elseif flags.Randomize || mod(X_ind,2) ~= 0 Y_start = 1; Y_step = 1; Y_finish = Mesh_pts(2); end for Y_ind = Y_start:Y_step:Y_finish Temp_coords = [X_list(X_ind),Y_list(Y_ind)] + Nozzle_offset; if isempty(Coord_list) Coord_list = Temp_coords; else Coord_list = [Coord_list; Temp_coords]; end end end end % Randomize coordinate list if flags.Randomize randInds = randperm(length(Coord_list)); Coord_list = Coord_list(randInds,:); end catch ErrorData ErrorMsg = sprintf('\n----- CRITICAL STOP! -----\n'); ErrorMsg = ErrorData.message; ErrorFiles = split(ErrorData.stack(end).file,'\'); ErrorFile = ErrorFiles(end); ErrorLine = ErrorData.stack(end).line; ErrorOutput = sprintf('\tCritical error in %s, line %g\n\tError: %s\n\n',ErrorFile{1},ErrorLine,ErrorMsg); throw(MException('MeshMaker:FailedCoordList',ErrorOutput)); x = 1; end fprintf([Padding,sprintf('Done!\n')]); Coord_time = toc(Coord_timer); %% Prepare gcode file UpdateStr = sprintf('Preparing G-code...'); Padding = repmat('.',1,Update_size-length(UpdateStr)+1); fprintf(UpdateStr); GCode_timer = tic; try % Define log file name Logfile_name = 'eventlog_14-Jan-202.txt'; % Define startup text CodeStr = {sprintf(' ; ----- High-density Bed Meshing ----- \n')}; CodeStr{end+1} = sprintf(' ; Authored by Rob Smith\n'); CodeStr{end+1} = sprintf(' ; Prepared on %s\n',datestr(now,'HH:MM:SS dd-mmm-yyyy')); CodeStr{end+1} = sprintf(' ; \n'); CodeStr{end+1} = sprintf(' ; Mesh parameters:\n'); CodeStr{end+1} = sprintf(' ; Bed dimensions:\t%gmm x %gmm\n',Bed_size(1),Bed_size(2)); X_spacing = Bed_size(1)/Mesh_pts(1); Y_spacing = Bed_size(2)/Mesh_pts(2); CodeStr{end+1} = sprintf(' ; Site spacing:\t\t%3.2fmm\n',(Bed_size(1)-2*Soft_border(1))/(Mesh_pts(1)+1)); CodeStr{end+1} = sprintf(' ; Probe sites:\t\t%g\n',Mesh_pts(1)*Mesh_pts(2)); CodeStr{end+1} = sprintf(' ; Sample size:\t\t%g\n',nSamples); CodeStr{end+1} = sprintf(' ; Repetitions:\t\t%g\n',nReps); CodeStr{end+1} = sprintf(' ; Datapoints:\t\t%g\n',Mesh_pts(1)*Mesh_pts(2)*nSamples*nReps); CodeStr{end+1} = sprintf(' ; \n'); CodeStr{end+1} = sprintf(' ; ----- PROGRAM START! -----\n\n'); CodeStr{end+1} = PadGCode('G28','Home the printer',GCode_size); CodeStr{end+1} = PadGCode(sprintf('M929 P"%s" S1',Logfile_name),'Enable communication logging\n'); CodeStr{end+1} = PadGCode('M503','Copy original EEPROM settings\n'); CodeStr{end+1} = PadGCode(sprintf('M558 F%g H3 T%g A%g S0.001',Z_divespeed*60,XY_speed*60,nSamples),'Modify z-probe configuration\n'); CodeStr{end+1} = PadGCode(sprintf('G1 Z%g F%g',Z_travel,Z_liftspeed*60),'Lift effector to start position\n\n'); i = 1; Spinner = ['|';'/';'-';'\']; Spinner_ind = 1; WipeCoords = ''; while i <= length(Coord_list) NewCoordStr = sprintf('\n%g - (%3.3f,%3.3f)',i,Coord_list(i,1),Coord_list(i,2)); fprintf([WipeCoords,NewCoordStr]); WipeCoords = repmat(sprintf('\b'),1,length(NewCoordStr)); % Check for previous repetitions CheckStr = sprintf('X%3.3f Y%3.3f',Coord_list(i,1),Coord_list(i,2)); RepCheck = cellfun(@(x) contains(x,CheckStr),CodeStr,'UniformOutput',false); RepCount = numel(find(cell2mat(RepCheck))) + 1; % Generate gcode set CodeStr{end+1} = sprintf('\n ; -- Probe site %s%g, rep %s%g\n',char(35),i,char(35),RepCount); CodeStr{end+1} = PadGCode(sprintf('G1 X%3.3f Y%3.3f F%g',Coord_list(i,1),Coord_list(i,2),XY_speed*60),'Move to coordinates\n'); CodeStr{end+1} = PadGCode(sprintf('G1 Z%3.3f F%g',Z_travel,Z_divespeed*60),'Dive to probe height\n'); CodeStr{end+1} = PadGCode(sprintf('G30 S-1'),'Invoke probe series\n'); CodeStr{end+1} = PadGCode(sprintf('G1 Z%3.3f F%g',Z_travel,Z_liftspeed*60),'Lift to travel height\n'); % Spin the spinny thing if mod(i,5) == 0 Spinner_ind = Spinner_ind + 1; if (Spinner_ind + 1) > length(Spinner) Spinner_ind = 1; end fprintf('\b%s',Spinner(Spinner_ind)); end % Increment to next coordinate pair i = i + 1; end fprintf([WipeCoords,sprintf('\b')]); CodeStr{end+1} = sprintf('\n ; Data collection complete!\n'); CodeStr{end+1} = PadGCode(sprintf('G1 X%3.3f Y%3.3f F%g',Bed_size(1)/2,Bed_size(2)/2,XY_speed*60),'Move to bed center\n'); CodeStr{end+1} = PadGCode(sprintf('G1 Z30 F%g',Z_liftspeed*60),'Lift effector to end position\n'); CodeStr{end+1} = PadGCode('M929 S0','Disable communication logging\n'); CodeStr{end+1} = PadGCode('M84','Disable stepper motors\n'); CodeStr{end+1} = sprintf('\n\n ----- PROGRAM COMPLETE! -----\n\n'); catch ErrorData fprintf('\n----- CRITICAL STOP! -----\n'); ErrorMsg = ErrorData.message; ErrorFiles = split(ErrorData.stack(end).file,'\'); ErrorFile = ErrorFiles(end); ErrorLine = ErrorData.stack(end).line; ErrorOutput = sprintf('\tCritical error in %s, line %g\n\tError: %s\n\n',ErrorFile{1},ErrorLine,ErrorMsg); throw(MException('MeshMaker:FailedCoordList',ErrorOutput)); x = 1; end fprintf([Padding,sprintf('Done!\n')]); GCode_time = toc(GCode_timer); %% Output code to file UpdateStr = sprintf('Writing gcode to file...'); Padding = repmat('.',1,Update_size-length(UpdateStr)); fprintf(UpdateStr); File_timer = tic; try File_name = 'MajorRandomness.gcode'; File_ID = fopen(File_name,'w+'); for i = 1:length(CodeStr) newLine = CodeStr{i}; if iscell(newLine) newLine = newLine{1}; end fprintf(File_ID,newLine); end fclose(File_ID); catch ErrorData ErrorMsg = fprintf('\n----- CRITICAL STOP! -----\n'); OpenFiles = fopen('all'); if ~isempty(OpenFiles) UpdateStr = sprintf(''); fprintf(UpdateStr); for i = 1:numel(OpenFiles) fclose(OpenFiles(i)); end Padding = repmat(',',1,Update_size-length(UpdateStr)); fprintf([Padding,sprintf('Done!\n')]); end ErrorMsg = ErrorData.message; ErrorFiles = split(ErrorData.stack(end).file,'\'); ErrorFile = ErrorFiles(end); ErrorLine = ErrorData.stack(end).line; ErrorOutput = sprintf('\tCritical error in %s, line %g\n\tError: %s\n\n',ErrorFile{1},ErrorLine,ErrorMsg(1:end-1)); throw(MException('MeshMaker:FailedCoordList',ErrorOutput)); x = 1; end fprintf([Padding,sprintf('Done!\n')]); File_time = toc(File_timer); %% End program fprintf('----- PROGRAM COMPLETE! -----\n\n'); File_length = 5 + (i*4); UpdateStr = sprintf('Gcode size: %g lines\n',File_length); Runtime = toc(RunTimer); Run_mins = floor(Runtime/60); Run_secs = Runtime - Run_mins*60; UpdateStr = [UpdateStr,sprintf('Generating coordinate list: %gs\n',Coord_time)]; UpdateStr = [UpdateStr,sprintf('Preparing G-code: %gs\n',GCode_time)]; UpdateStr = [UpdateStr,sprintf('Output to file: %gs\n\n',File_time)]; UpdateStr = [UpdateStr,sprintf('Run time: %gm%gs\n\n',Run_mins,Run_secs)]; fprintf(UpdateStr);