embedded_stepper/motors/
two_wire.rs

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