embedded_stepper/motors/
four_wire.rs

1//! 4-pin stepper coil driver with no error handling
2
3use embedded_hal::digital::OutputPin;
4use crate::driver::StepperMotor;
5
6//// Coil driver using four output pins.
7pub struct StepperMotor4<P1: OutputPin, P2: OutputPin, P3: OutputPin, P4: OutputPin>
8where
9    P1: OutputPin,
10    P2: OutputPin<Error = P1::Error>,
11    P3: OutputPin<Error = P1::Error>,
12    P4: OutputPin<Error = P1::Error>,
13{
14    pub p1: P1,
15    pub p2: P2,
16    pub p3: P3,
17    pub p4: P4,
18}
19
20impl<P1, P2, P3, P4> StepperMotor for StepperMotor4<P1, P2, P3, P4>
21where
22    P1: OutputPin,
23    P2: OutputPin<Error = P1::Error>,
24    P3: OutputPin<Error = P1::Error>,
25    P4: OutputPin<Error = P1::Error>,
26{
27    type Error = ();
28
29    /// Energize pins for the step index `this_step % 4`.
30    fn step(&mut self, this_step: u32) -> Result<(), Self::Error> {
31        match this_step % 4 {
32            0 => {
33                let _ = self.p1.set_high();
34                let _ = self.p2.set_low();
35                let _ = self.p3.set_high();
36                let _ = self.p4.set_low();
37            }
38            1 => {
39                let _ = self.p1.set_low();
40                let _ = self.p2.set_high();
41                let _ = self.p3.set_high();
42                let _ = self.p4.set_low();
43            }
44            2 => {
45                let _ = self.p1.set_low();
46                let _ = self.p2.set_high();
47                let _ = self.p3.set_low();
48                let _ = self.p4.set_high();
49            }
50            3 => {
51                let _ = self.p1.set_high();
52                let _ = self.p2.set_low();
53                let _ = self.p3.set_low();
54                let _ = self.p4.set_high();
55            }
56            _ => unreachable!(),
57        }
58        Ok(())
59    }
60
61    /// Drive all pins low to de-energize the motor.
62    fn clear(&mut self) -> Result<(), Self::Error> {
63        let _ = self.p1.set_low();
64        let _ = self.p2.set_low();
65        let _ = self.p3.set_low();
66        let _ = self.p4.set_low();
67        Ok(())
68    }
69}