forked from MrCroesus/MMv3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathirsensor.py
84 lines (73 loc) · 2.76 KB
/
irsensor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import time
import digitalio
from analogio import AnalogIn
class IRSensors():
def __init__(self,
l_en, l_a, l_b, l_adc,
c_en, c_a, c_b, c_adc,
r_en, r_a, r_b, r_adc,
avg = 5
):
# Setup IR LED enables
self.l_en = digitalio.DigitalInOut(l_en)
self.c_en = digitalio.DigitalInOut(c_en)
self.r_en = digitalio.DigitalInOut(r_en)
for p in [self.l_en, self.c_en, self.r_en]:
p.direction = digitalio.Direction.OUTPUT
p.value = False
# Setup ADCs
self.l_adc = AnalogIn(l_adc)
self.c_adc = AnalogIn(c_adc)
self.r_adc = AnalogIn(r_adc)
# Setup differential pair enables
self.l_a = digitalio.DigitalInOut(l_a)
self.l_b = digitalio.DigitalInOut(l_b)
self.c_a = digitalio.DigitalInOut(c_a)
self.c_b = digitalio.DigitalInOut(c_b)
self.r_a = digitalio.DigitalInOut(r_a)
self.r_b = digitalio.DigitalInOut(r_b)
for p in [self.l_a, self.l_b, self.c_a,
self.c_b, self.r_a, self.r_b]:
p.direction = digitalio.Direction.OUTPUT
p.drive_mode = digitalio.DriveMode.OPEN_DRAIN
p.value = True # High Z mode
# Preallocate memory for storing values
self.lir_a, self.lir_b = 0, 0
self.cir_a, self.cir_b = 0, 0
self.rir_a, self.rir_b = 0, 0
self.avg = avg
def scan(self):
# Enable IR LEDs
for p in [self.l_en, self.c_en, self.r_en]:
p.value = True
# Reset all values to 0
self.lir_a, self.lir_b = 0, 0
self.cir_a, self.cir_b = 0, 0
self.rir_a, self.rir_b = 0, 0
# Read 'a' channels
for p in [self.l_a, self.c_a, self.r_a]:
p.value = False
time.sleep(0.001)
for _ in range(self.avg):
self.lir_a += self.l_adc.value
self.cir_a += self.c_adc.value
self.rir_a += self.r_adc.value
for p in [self.l_a, self.c_a, self.r_a]:
p.value = True
# Read 'b' channels
for p in [self.l_b, self.c_b, self.r_b]:
p.value = False
time.sleep(0.001)
for _ in range(self.avg):
self.lir_b += self.l_adc.value
self.cir_b += self.c_adc.value
self.rir_b += self.r_adc.value
for p in [self.l_b, self.c_b, self.r_b]:
p.value = True
# Compute averages
self.lir_a, self.lir_b = self.lir_a / self.avg, self.lir_b / self.avg
self.cir_a, self.cir_b = self.cir_a / self.avg, self.cir_b / self.avg
self.rir_a, self.rir_b = self.rir_a / self.avg, self.rir_b / self.avg
# Disable IR LEDs (save power)
for p in [self.l_en, self.c_en, self.r_en]:
p.value = False