|
6 | 6 | from pslab.serial_handler import SerialHandler
|
7 | 7 |
|
8 | 8 |
|
9 |
| -class HCSR04(LogicAnalyzer, PWMGenerator): |
| 9 | +class HCSR04: |
10 | 10 | """Read data from ultrasonic distance sensor HC-SR04/HC-SR05.
|
11 | 11 |
|
12 | 12 | These sensors can measure distances between 2 cm to 4 m (SR04) / 4.5 m
|
@@ -60,8 +60,8 @@ def __init__(
|
60 | 60 | echo: str = "LA1",
|
61 | 61 | ):
|
62 | 62 | self._device = device
|
63 |
| - LogicAnalyzer.__init__(self, self._device) |
64 |
| - PWMGenerator.__init__(self, self._device) |
| 63 | + self._la = LogicAnalyzer(self._device) |
| 64 | + self._pwm = PWMGenerator(self._device) |
65 | 65 | self._trig = trig
|
66 | 66 | self._echo = echo
|
67 | 67 | self._measure_period = 60e-3 # Minimum recommended by datasheet.
|
@@ -93,26 +93,26 @@ def estimate_distance(
|
93 | 93 | TimeoutError if the end of the ECHO pulse is not detected (i.e. the
|
94 | 94 | object is too far away).
|
95 | 95 | """
|
96 |
| - self.capture( |
| 96 | + self._la.capture( |
97 | 97 | channels=self._echo,
|
98 | 98 | events=2 * average,
|
99 | 99 | block=False,
|
100 | 100 | )
|
101 |
| - self.generate( |
| 101 | + self._pwm.generate( |
102 | 102 | channels=self._trig,
|
103 | 103 | frequency=self._measure_period**-1,
|
104 | 104 | duty_cycles=self._trigger_pulse_length / self._measure_period,
|
105 | 105 | )
|
106 |
| - time.sleep(self._measure_period * average) |
107 |
| - self.set_state(**{self._trig.lower(): 0}) |
108 |
| - (t,) = self.fetch_data() |
| 106 | + # Wait one extra period to make sure we don't miss the final edge. |
| 107 | + time.sleep(self._measure_period * (average + 1)) |
| 108 | + self._pwm.set_state(**{self._trig.lower(): 0}) |
| 109 | + (t,) = self._la.fetch_data() |
109 | 110 | self._sanity_check(len(t), 2 * average)
|
110 | 111 | high_times = t[::2] - t[1::2]
|
111 | 112 | return speed_of_sound * high_times.mean() / 2 * 1e-6
|
112 | 113 |
|
113 | 114 | def _sanity_check(self, events: int, expected_events: int):
|
114 |
| - if self.get_initial_states()[self._echo]: |
| 115 | + if self._la.get_initial_states()[self._echo]: |
115 | 116 | raise RuntimeError("ECHO pin was HIGH when measurement started.")
|
116 |
| - |
117 | 117 | if events < expected_events:
|
118 | 118 | raise TimeoutError
|
0 commit comments