embedded_stepper/motors/
five_wire.rs

1//! 5-pin stepper coil driver with no error handling
2
3use embedded_hal::digital::OutputPin;
4use crate::driver::StepperMotor;
5
6/// Coil driver using five output pins.
7pub struct StepperMotor5<P1: OutputPin, P2: OutputPin, P3: OutputPin, P4: OutputPin, P5: OutputPin>
8where
9    P1: OutputPin,
10    P2: OutputPin<Error = P1::Error>,
11    P3: OutputPin<Error = P1::Error>,
12    P4: OutputPin<Error = P1::Error>,
13    P5: OutputPin<Error = P1::Error>,
14{
15    pub p1: P1,
16    pub p2: P2,
17    pub p3: P3,
18    pub p4: P4,
19    pub p5: P5,
20}
21
22impl<P1, P2, P3, P4, P5> StepperMotor for StepperMotor5<P1, P2, P3, P4, P5>
23where
24    P1: OutputPin,
25    P2: OutputPin<Error = P1::Error>,
26    P3: OutputPin<Error = P1::Error>,
27    P4: OutputPin<Error = P1::Error>,
28    P5: OutputPin<Error = P1::Error>,
29{
30    type Error = ();
31
32    /// Energize pins for the step index `this_step % 10`.
33    fn step(&mut self, this_step: u32) -> Result<(), Self::Error> {
34        match this_step % 10 {
35            0 => {
36                let _ = self.p1.set_low();
37                let _ = self.p2.set_high();
38                let _ = self.p3.set_high();
39                let _ = self.p4.set_low();
40                let _ = self.p5.set_high();
41            },
42            1 => {
43                let _ = self.p1.set_low();
44                let _ = self.p2.set_high();
45                let _ = self.p3.set_low();
46                let _ = self.p4.set_low();
47                let _ = self.p5.set_high();
48            },
49            2 => {
50                let _ = self.p1.set_low();
51                let _ = self.p2.set_high();
52                let _ = self.p3.set_low();
53                let _ = self.p4.set_high();
54                let _ = self.p5.set_high();
55            },
56            3 => {
57                let _ = self.p1.set_low();
58                let _ = self.p2.set_high();
59                let _ = self.p3.set_low();
60                let _ = self.p4.set_high();
61                let _ = self.p5.set_low();
62            },
63            4 => {
64                let _ = self.p1.set_high();
65                let _ = self.p2.set_high();
66                let _ = self.p3.set_low();
67                let _ = self.p4.set_high();
68                let _ = self.p5.set_low();
69            },
70            5 => {
71                let _ = self.p1.set_high();
72                let _ = self.p2.set_low();
73                let _ = self.p3.set_low();
74                let _ = self.p4.set_high();
75                let _ = self.p5.set_low();
76            },
77            6 => {
78                let _ = self.p1.set_high();
79                let _ = self.p2.set_low();
80                let _ = self.p3.set_high();
81                let _ = self.p4.set_high();
82                let _ = self.p5.set_low();
83            },
84            7 => {
85                let _ = self.p1.set_high();
86                let _ = self.p2.set_low();
87                let _ = self.p3.set_high();
88                let _ = self.p4.set_low();
89                let _ = self.p5.set_low();
90            },
91            8 => {
92                let _ = self.p1.set_high();
93                let _ = self.p2.set_low();
94                let _ = self.p3.set_high();
95                let _ = self.p4.set_low();
96                let _ = self.p5.set_high();
97            },
98            9 => {
99                let _ = self.p1.set_low();
100                let _ = self.p2.set_low();
101                let _ = self.p3.set_high();
102                let _ = self.p4.set_low();
103                let _ = self.p5.set_high();
104            },
105            _ => unreachable!(),
106        }
107        Ok(())
108    }
109
110    /// Drive all pins low to de-energize the motor.
111    fn clear(&mut self) -> Result<(), Self::Error> {
112        let _ = self.p1.set_low();
113        let _ = self.p2.set_low();
114        let _ = self.p3.set_low();
115        let _ = self.p4.set_low();
116        let _ = self.p5.set_low();
117        Ok(())
118    }
119}