Sat, 07 Nov 2015 13:23:07 +0100
Initial code from reprappro Marlin repository
0 | 1 | #include "z_probe.h" |
2 | #if defined(PROBE_PIN) && (PROBE_PIN > -1) | |
3 | #include "Marlin.h" | |
4 | #include "stepper.h" | |
5 | #include "temperature.h" | |
6 | ||
7 | float Probe_Bed(float x_pos, float y_pos, int n) | |
8 | { | |
9 | //returns Probed Z average height | |
10 | float ProbeDepth[n]; | |
11 | float ProbeDepthAvg=0; | |
12 | ||
13 | //force bed heater off for probing | |
14 | int save_bed_targ = target_raw_bed; | |
15 | target_raw_bed = 0; | |
16 | WRITE(HEATER_BED_PIN,LOW); | |
17 | ||
18 | if (Z_HOME_DIR==-1) | |
19 | { | |
20 | //int probe_flag =1; | |
21 | float meas = 0; | |
22 | int fails = 0; | |
23 | saved_feedrate = feedrate; | |
24 | saved_feedmultiply = feedmultiply; | |
25 | feedmultiply = 100; | |
26 | //previous_millis_cmd = millis(); | |
27 | ||
28 | //Move to probe position | |
29 | if (x_pos >= 0) destination[X_AXIS]=x_pos; | |
30 | if (y_pos >= 0) destination[Y_AXIS]=y_pos; | |
31 | //destination[Z_AXIS]=current_position[Z_AXIS]; | |
32 | destination[Z_AXIS]=Z_HOME_RETRACT_MM; | |
33 | feedrate = 9000; | |
34 | prepare_move(); | |
35 | ||
36 | enable_endstops(true); | |
37 | SERIAL_ECHO("PRE-PROBE current_position[Z_AXIS]=");SERIAL_ECHOLN(current_position[Z_AXIS]); | |
38 | ||
39 | SERIAL_ECHOLN("Ready to probe..."); | |
40 | ||
41 | //Probe bed n times | |
42 | //*******************************************************************************************Bed Loop************************************* | |
43 | for(int8_t i=0; i < n ; i++) | |
44 | { | |
45 | //int z = 0; | |
46 | ||
47 | //fast probe | |
48 | //plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); | |
49 | destination[Z_AXIS] = 1.1 * max_length[Z_AXIS] * Z_HOME_DIR; | |
50 | feedrate = homing_feedrate[Z_AXIS]; | |
51 | plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); | |
52 | st_synchronize(); | |
53 | ||
54 | //feedrate = 0.0; | |
55 | ||
56 | SERIAL_ECHO("current_position[Z_AXIS]=");SERIAL_ECHOLN(current_position[Z_AXIS]); | |
57 | if(endstop_z_hit == true) | |
58 | { | |
59 | SERIAL_ECHO("endstops_trigsteps[Z_AXIS]=");SERIAL_ECHOLN(endstops_trigsteps[Z_AXIS]); | |
60 | ProbeDepth[i]= endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]; | |
61 | meas = ProbeDepth[i]; | |
62 | SERIAL_ECHO("ProbeDepth[");SERIAL_ECHO(i);SERIAL_ECHO("]=");SERIAL_ECHOLN(ProbeDepth[i]); | |
63 | //************************************************************************************************************* | |
64 | if (i > 0 ) //Second probe has happened so compare results | |
65 | { | |
66 | if (abs(ProbeDepth[i] - ProbeDepth[i - 1]) > .05) | |
67 | { //keep going until readings match to avoid sticky bed | |
68 | SERIAL_ECHO("Probing again: "); | |
69 | SERIAL_ECHO(ProbeDepth[i]); SERIAL_ECHO(" - "); SERIAL_ECHO(ProbeDepth[i - 1]);SERIAL_ECHO(" = "); SERIAL_ECHOLN(abs(ProbeDepth[i] - ProbeDepth[i - 1])); | |
70 | meas = ProbeDepth[i]; | |
71 | i--; i--; //Throw out both that don't match because we don't know which one is accurate | |
72 | if(fails++ > 4) break; | |
73 | } | |
74 | } | |
75 | }else{ | |
76 | SERIAL_ECHOLN("Probe not triggered."); | |
77 | i=n-1; | |
78 | } | |
79 | //************************************************************************************************************************************************** | |
80 | //fast move clear | |
81 | plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], meas, current_position[E_AXIS]); | |
82 | destination[Z_AXIS] = Z_HOME_RETRACT_MM; | |
83 | feedrate = fast_home_feedrate[Z_AXIS]; | |
84 | plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); | |
85 | st_synchronize(); | |
86 | ||
87 | //check z stop isn't still triggered | |
88 | if ( READ(X_MIN_PIN) != X_ENDSTOPS_INVERTING ) | |
89 | { | |
90 | SERIAL_ECHOLN("Poking Stuck Bed:"); | |
91 | destination[Z_AXIS] = -1; prepare_move(); | |
92 | destination[Z_AXIS] = Z_HOME_RETRACT_MM; prepare_move(); | |
93 | st_synchronize(); | |
94 | i--; //Throw out this meaningless measurement | |
95 | } | |
96 | feedrate = 0; | |
97 | } //end probe loop | |
98 | #ifdef ENDSTOPS_ONLY_FOR_HOMING | |
99 | enable_endstops(false); | |
100 | #endif | |
101 | ||
102 | feedrate = saved_feedrate; | |
103 | feedmultiply = saved_feedmultiply; | |
104 | //previous_millis_cmd = millis(); | |
105 | endstops_hit_on_purpose(); | |
106 | } | |
107 | for(int8_t i=0;i<n;i++) | |
108 | { | |
109 | ProbeDepthAvg += ProbeDepth[i]; | |
110 | } | |
111 | ProbeDepthAvg /= n; | |
112 | SERIAL_ECHO("Probed Z="); SERIAL_ECHOLN(ProbeDepthAvg); | |
113 | SERIAL_ECHO("RAW current_position[Z_AXIS]=");SERIAL_ECHOLN(current_position[Z_AXIS]); | |
114 | plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], Z_HOME_RETRACT_MM, current_position[E_AXIS]); | |
115 | current_position[Z_AXIS] = Z_HOME_RETRACT_MM; | |
116 | ||
117 | target_raw_bed = save_bed_targ; | |
118 | return ProbeDepthAvg; | |
119 | } | |
120 | ||
121 | void probe_init() | |
122 | { | |
123 | SET_INPUT(PROBE_PIN); | |
124 | WRITE(PROBE_PIN,HIGH); | |
125 | } | |
126 | ||
127 | /*Crash1 - G29 to Probe and stop on Bed | |
128 | G29 will probe bed at least twice at 3 points and take an average. G30 will probe bed at it's current location. | |
129 | Z stop should be set slightly below bed height. Solder stub wire to each hole in huxley bed and attach a ring terminal under spring. | |
130 | Wire bed probe to A2 on Melzi and duplicate cap/resistor circuit in schematic. | |
131 | ||
132 | Use something like this in the start.gcode file: | |
133 | G29 ;Probe bed for Z height | |
134 | G92 Z0 ;Set Z to Probed Depth | |
135 | G1 Z5 F200 ;Lift Z out of way | |
136 | */ | |
137 | void probe_3points() | |
138 | { | |
139 | float Probe_Avg, Point1, Point2, Point3; | |
140 | Point1 = Probe_Bed(max_length[X_AXIS] - 15,15,PROBE_N); | |
141 | Point2 = Probe_Bed(max_length[X_AXIS] - 15,max_length[Y_AXIS] - 15,PROBE_N) ; | |
142 | Point3 = Probe_Bed(15,max_length[Y_AXIS] / 2,PROBE_N); | |
143 | Probe_Avg = (Point1 + Point2 + Point3) / 3; | |
144 | //destination[2] = Probe_Avg; | |
145 | //feedrate = homing_feedrate[Z_AXIS]; | |
146 | //prepare_move(); | |
147 | SERIAL_ECHOLN("**************************************"); | |
148 | SERIAL_ECHO("Point1 ="); SERIAL_ECHOLN(Point1); | |
149 | SERIAL_ECHO("Point2 ="); SERIAL_ECHOLN(Point2); | |
150 | SERIAL_ECHO("Point3 ="); SERIAL_ECHOLN(Point3); | |
151 | SERIAL_ECHO("Probed Average="); SERIAL_ECHOLN(Probe_Avg); | |
152 | SERIAL_ECHOLN("**************************************"); | |
153 | } | |
154 | ||
155 | void probe_1point() | |
156 | { | |
157 | float Point; | |
158 | Point = Probe_Bed(-1,-1,PROBE_N); | |
159 | //destination[2] = Point +1; | |
160 | //feedrate = homing_feedrate[Z_AXIS]; | |
161 | //prepare_move(); | |
162 | SERIAL_ECHOLN("**************************************"); | |
163 | SERIAL_ECHO("Probed Z="); SERIAL_ECHOLN(Point); | |
164 | } | |
165 | ||
166 | void probe_status() | |
167 | { | |
168 | SERIAL_ECHO("Probe Status = "); SERIAL_ECHOLN(READ(PROBE_PIN)); | |
169 | } | |
170 | ||
171 | #endif //defined(PROBE_PIN) > -1 | |
172 | ||
173 |