|
2 | 2 | #
|
3 | 3 | # SPDX-License-Identifier: MIT
|
4 | 4 |
|
| 5 | +import time |
| 6 | +import microncontroller |
5 | 7 | import board
|
6 | 8 | import audiocore
|
7 | 9 | import audiobusio
|
8 | 10 | import audiomixer
|
9 | 11 | import pwmio
|
10 |
| -from digitalio import DigitalInOut, Direction |
| 12 | +from digitalio import DigitalInOut, Direction, Pull |
11 | 13 | from adafruit_ticks import ticks_ms, ticks_add, ticks_diff
|
12 | 14 | from adafruit_motor import servo
|
13 | 15 | import adafruit_vl53l1x
|
14 | 16 |
|
15 |
| -distance_delay = 5 # how often vl53 is read |
| 17 | +distance_delay = 4 # how often vl53 is read |
16 | 18 | servo_delays = [2.0, 1.5, 1.0, 0.5] # servo spin delay
|
17 |
| -distances = [400, 200, 100, 50] # in centimeters |
18 |
| -max_audio = 0.5 |
| 19 | +distances = [150, 100, 80, 40] # in centimeters |
| 20 | +max_audio = 1 |
19 | 21 | # audio files
|
20 |
| -music = audiocore.WaveFile(open("music-loop-3.wav", "rb")) |
21 |
| -fx_1 = audiocore.WaveFile(open("laugh-1.wav", "rb")) |
| 22 | +music = audiocore.WaveFile(open("music-loop-1.wav", "rb")) |
| 23 | +fx_1 = audiocore.WaveFile(open("happy-halloween.wav", "rb")) |
22 | 24 | fx_2 = audiocore.WaveFile(open("laugh-2.wav", "rb"))
|
23 | 25 | fx_3 = audiocore.WaveFile(open("laugh-3.wav", "rb"))
|
24 | 26 |
|
|
39 | 41 | external_power.direction = Direction.OUTPUT
|
40 | 42 | external_power.value = True
|
41 | 43 |
|
| 44 | +switch = DigitalInOut(board.EXTERNAL_BUTTON) |
| 45 | +switch.direction = Direction.INPUT |
| 46 | +switch.pull = Pull.UP |
| 47 | + |
42 | 48 | # servo control
|
43 | 49 | pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, duty_cycle=2 ** 15, frequency=50)
|
44 | 50 | servo = servo.ContinuousServo(pwm, min_pulse=750, max_pulse=2250)
|
|
53 | 59 | servo_throttle = 0
|
54 | 60 |
|
55 | 61 | while True:
|
56 |
| - if prop_time: |
57 |
| - if ticks_diff(ticks_ms(), servo_clock) >= servo_time: |
58 |
| - # print(servo_throttle) |
59 |
| - servo.throttle = servo_throttle |
60 |
| - servo_throttle = not servo_throttle |
61 |
| - servo_clock = ticks_add(servo_clock, servo_time) |
62 |
| - if ticks_diff(ticks_ms(), vl53_clock) >= vl53_time: |
63 |
| - if vl53.data_ready: |
64 |
| - # print(f"Distance: {vl53.distance} cm") |
65 |
| - vl53.clear_interrupt() |
66 |
| - closest_distance = min(distances, key=lambda x: abs(vl53.distance - x)) |
67 |
| - # print(closest_distance) |
68 |
| - if vl53.distance <= distances[0]: |
69 |
| - prop_time = True |
70 |
| - mixer.voice[0].level = max_audio |
| 62 | + try: |
| 63 | + if switch.value: |
| 64 | + external_power.value = True |
| 65 | + if prop_time: |
| 66 | + if ticks_diff(ticks_ms(), servo_clock) >= servo_time: |
| 67 | + print(servo_throttle) |
| 68 | + servo.throttle = servo_throttle |
| 69 | + servo_throttle = not servo_throttle |
| 70 | + servo_clock = ticks_add(servo_clock, servo_time) |
| 71 | + if ticks_diff(ticks_ms(), vl53_clock) >= vl53_time: |
| 72 | + if vl53.data_ready: |
| 73 | + print(f"Distance: {vl53.distance} cm") |
| 74 | + vl53.clear_interrupt() |
| 75 | + if vl53.distance is None: |
| 76 | + prop_time = False |
| 77 | + mixer.voice[0].level = 0.0 |
| 78 | + servo_time = int(servo_delays[0] * 1000) |
| 79 | + servo.throttle = 1.0 |
| 80 | + else: |
| 81 | + closest_distance = min(distances, key=lambda x: abs(vl53.distance - x)) |
| 82 | + # print(closest_distance) |
| 83 | + if vl53.distance <= distances[0]: |
| 84 | + prop_time = True |
| 85 | + mixer.voice[0].level = max_audio |
| 86 | + else: |
| 87 | + prop_time = False |
| 88 | + mixer.voice[0].level = 0.0 |
| 89 | + servo.throttle = 1.0 |
| 90 | + if closest_distance == distances[1]: |
| 91 | + mixer.voice[1].play(tracks[1], loop=False) |
| 92 | + servo_time = int(servo_delays[1] * 1000) |
| 93 | + elif closest_distance == distances[2]: |
| 94 | + mixer.voice[2].play(tracks[2], loop=False) |
| 95 | + servo_time = int(servo_delays[2] * 1000) |
| 96 | + elif closest_distance == distances[3]: |
| 97 | + mixer.voice[3].play(tracks[3], loop=False) |
| 98 | + servo_time = int(servo_delays[3] * 1000) |
| 99 | + vl53_clock = ticks_add(vl53_clock, vl53_time) |
71 | 100 | else:
|
72 |
| - prop_time = False |
73 |
| - mixer.voice[0].level = 0.0 |
74 |
| - servo_time = int(servo_delays[0] * 1000) |
75 |
| - if closest_distance == distances[1]: |
76 |
| - mixer.voice[1].play(tracks[1], loop=False) |
77 |
| - servo_time = int(servo_delays[1] * 1000) |
78 |
| - elif closest_distance == distances[2]: |
79 |
| - mixer.voice[2].play(tracks[2], loop=False) |
80 |
| - servo_time = int(servo_delays[2] * 1000) |
81 |
| - elif closest_distance == distances[3]: |
82 |
| - mixer.voice[3].play(tracks[3], loop=False) |
83 |
| - servo_time = int(servo_delays[3] * 1000) |
84 |
| - vl53_clock = ticks_add(vl53_clock, vl53_time) |
| 101 | + external_power.value = False |
| 102 | + except Exception as error: # pylint: disable=broad-except |
| 103 | + print(error) |
| 104 | + time.sleep(5) |
| 105 | + microncontroller.reset() |
0 commit comments