Skip to content

Commit 600c2a6

Browse files
committed
Simplify Stepper::stepMotor()
Instead of separately coding each step, use the fact that all pins follow the same periodic pattern, with phase shifts between them. For the 5-pin steppers, hard-code the pattern in a PROGMEM array, as this is cheaper than reducing a number modulo 10 on chips lacking a hardware divider.
1 parent 6ab0270 commit 600c2a6

File tree

1 file changed

+22
-121
lines changed

1 file changed

+22
-121
lines changed

src/Stepper.cpp

Lines changed: 22 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -233,128 +233,29 @@ void Stepper::step(int steps_to_move)
233233
*/
234234
void Stepper::stepMotor(int thisStep)
235235
{
236-
if (this->pin_count == 2) {
237-
switch (thisStep) {
238-
case 0: // 01
239-
digitalWrite(motor_pin_1, LOW);
240-
digitalWrite(motor_pin_2, HIGH);
241-
break;
242-
case 1: // 11
243-
digitalWrite(motor_pin_1, HIGH);
244-
digitalWrite(motor_pin_2, HIGH);
245-
break;
246-
case 2: // 10
247-
digitalWrite(motor_pin_1, HIGH);
248-
digitalWrite(motor_pin_2, LOW);
249-
break;
250-
case 3: // 00
251-
digitalWrite(motor_pin_1, LOW);
252-
digitalWrite(motor_pin_2, LOW);
253-
break;
254-
}
255-
}
256-
if (this->pin_count == 4) {
257-
switch (thisStep) {
258-
case 0: // 1010
259-
digitalWrite(motor_pin_1, HIGH);
260-
digitalWrite(motor_pin_2, LOW);
261-
digitalWrite(motor_pin_3, HIGH);
262-
digitalWrite(motor_pin_4, LOW);
263-
break;
264-
case 1: // 0110
265-
digitalWrite(motor_pin_1, LOW);
266-
digitalWrite(motor_pin_2, HIGH);
267-
digitalWrite(motor_pin_3, HIGH);
268-
digitalWrite(motor_pin_4, LOW);
269-
break;
270-
case 2: //0101
271-
digitalWrite(motor_pin_1, LOW);
272-
digitalWrite(motor_pin_2, HIGH);
273-
digitalWrite(motor_pin_3, LOW);
274-
digitalWrite(motor_pin_4, HIGH);
275-
break;
276-
case 3: //1001
277-
digitalWrite(motor_pin_1, HIGH);
278-
digitalWrite(motor_pin_2, LOW);
279-
digitalWrite(motor_pin_3, LOW);
280-
digitalWrite(motor_pin_4, HIGH);
281-
break;
282-
}
283-
}
236+
static PROGMEM const uint8_t phases[] = {
237+
LOW, LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH,
238+
LOW, LOW, LOW, LOW, LOW, HIGH, HIGH, HIGH, HIGH
239+
};
284240

285-
if (this->pin_count == 5) {
286-
switch (thisStep) {
287-
case 0: // 01101
288-
digitalWrite(motor_pin_1, LOW);
289-
digitalWrite(motor_pin_2, HIGH);
290-
digitalWrite(motor_pin_3, HIGH);
291-
digitalWrite(motor_pin_4, LOW);
292-
digitalWrite(motor_pin_5, HIGH);
293-
break;
294-
case 1: // 01001
295-
digitalWrite(motor_pin_1, LOW);
296-
digitalWrite(motor_pin_2, HIGH);
297-
digitalWrite(motor_pin_3, LOW);
298-
digitalWrite(motor_pin_4, LOW);
299-
digitalWrite(motor_pin_5, HIGH);
300-
break;
301-
case 2: // 01011
302-
digitalWrite(motor_pin_1, LOW);
303-
digitalWrite(motor_pin_2, HIGH);
304-
digitalWrite(motor_pin_3, LOW);
305-
digitalWrite(motor_pin_4, HIGH);
306-
digitalWrite(motor_pin_5, HIGH);
307-
break;
308-
case 3: // 01010
309-
digitalWrite(motor_pin_1, LOW);
310-
digitalWrite(motor_pin_2, HIGH);
311-
digitalWrite(motor_pin_3, LOW);
312-
digitalWrite(motor_pin_4, HIGH);
313-
digitalWrite(motor_pin_5, LOW);
314-
break;
315-
case 4: // 11010
316-
digitalWrite(motor_pin_1, HIGH);
317-
digitalWrite(motor_pin_2, HIGH);
318-
digitalWrite(motor_pin_3, LOW);
319-
digitalWrite(motor_pin_4, HIGH);
320-
digitalWrite(motor_pin_5, LOW);
321-
break;
322-
case 5: // 10010
323-
digitalWrite(motor_pin_1, HIGH);
324-
digitalWrite(motor_pin_2, LOW);
325-
digitalWrite(motor_pin_3, LOW);
326-
digitalWrite(motor_pin_4, HIGH);
327-
digitalWrite(motor_pin_5, LOW);
328-
break;
329-
case 6: // 10110
330-
digitalWrite(motor_pin_1, HIGH);
331-
digitalWrite(motor_pin_2, LOW);
332-
digitalWrite(motor_pin_3, HIGH);
333-
digitalWrite(motor_pin_4, HIGH);
334-
digitalWrite(motor_pin_5, LOW);
335-
break;
336-
case 7: // 10100
337-
digitalWrite(motor_pin_1, HIGH);
338-
digitalWrite(motor_pin_2, LOW);
339-
digitalWrite(motor_pin_3, HIGH);
340-
digitalWrite(motor_pin_4, LOW);
341-
digitalWrite(motor_pin_5, LOW);
342-
break;
343-
case 8: // 10101
344-
digitalWrite(motor_pin_1, HIGH);
345-
digitalWrite(motor_pin_2, LOW);
346-
digitalWrite(motor_pin_3, HIGH);
347-
digitalWrite(motor_pin_4, LOW);
348-
digitalWrite(motor_pin_5, HIGH);
349-
break;
350-
case 9: // 00101
351-
digitalWrite(motor_pin_1, LOW);
352-
digitalWrite(motor_pin_2, LOW);
353-
digitalWrite(motor_pin_3, HIGH);
354-
digitalWrite(motor_pin_4, LOW);
355-
digitalWrite(motor_pin_5, HIGH);
356-
break;
357-
}
241+
switch (pin_count) {
242+
case 2:
243+
digitalWrite(motor_pin_1, (thisStep+1) & 2);
244+
digitalWrite(motor_pin_2, (thisStep+2) & 2);
245+
break;
246+
case 4:
247+
digitalWrite(motor_pin_4, (thisStep+0) & 2);
248+
digitalWrite(motor_pin_2, (thisStep+1) & 2);
249+
digitalWrite(motor_pin_3, (thisStep+2) & 2);
250+
digitalWrite(motor_pin_1, (thisStep+3) & 2);
251+
break;
252+
case 5:
253+
digitalWrite(motor_pin_1, pgm_read_byte(&phases[thisStep+0]));
254+
digitalWrite(motor_pin_4, pgm_read_byte(&phases[thisStep+2]));
255+
digitalWrite(motor_pin_2, pgm_read_byte(&phases[thisStep+4]));
256+
digitalWrite(motor_pin_5, pgm_read_byte(&phases[thisStep+6]));
257+
digitalWrite(motor_pin_3, pgm_read_byte(&phases[thisStep+8]));
258+
break;
358259
}
359260
}
360261

0 commit comments

Comments
 (0)