updates for pumpkin

a few updates for the pumpkin project. now with a switch and more error handling
This commit is contained in:
Liz 2024-09-23 13:55:11 -04:00
parent d71dd92eb7
commit 99ca7416e0
2 changed files with 55 additions and 34 deletions

View file

@ -2,23 +2,25 @@
# #
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
import time
import microncontroller
import board import board
import audiocore import audiocore
import audiobusio import audiobusio
import audiomixer import audiomixer
import pwmio import pwmio
from digitalio import DigitalInOut, Direction from digitalio import DigitalInOut, Direction, Pull
from adafruit_ticks import ticks_ms, ticks_add, ticks_diff from adafruit_ticks import ticks_ms, ticks_add, ticks_diff
from adafruit_motor import servo from adafruit_motor import servo
import adafruit_vl53l1x import adafruit_vl53l1x
distance_delay = 5 # how often vl53 is read distance_delay = 4 # how often vl53 is read
servo_delays = [2.0, 1.5, 1.0, 0.5] # servo spin delay servo_delays = [2.0, 1.5, 1.0, 0.5] # servo spin delay
distances = [400, 200, 100, 50] # in centimeters distances = [150, 100, 80, 40] # in centimeters
max_audio = 0.5 max_audio = 1
# audio files # audio files
music = audiocore.WaveFile(open("music-loop-3.wav", "rb")) music = audiocore.WaveFile(open("music-loop-1.wav", "rb"))
fx_1 = audiocore.WaveFile(open("laugh-1.wav", "rb")) fx_1 = audiocore.WaveFile(open("happy-halloween.wav", "rb"))
fx_2 = audiocore.WaveFile(open("laugh-2.wav", "rb")) fx_2 = audiocore.WaveFile(open("laugh-2.wav", "rb"))
fx_3 = audiocore.WaveFile(open("laugh-3.wav", "rb")) fx_3 = audiocore.WaveFile(open("laugh-3.wav", "rb"))
@ -39,6 +41,10 @@ external_power = DigitalInOut(board.EXTERNAL_POWER)
external_power.direction = Direction.OUTPUT external_power.direction = Direction.OUTPUT
external_power.value = True external_power.value = True
switch = DigitalInOut(board.EXTERNAL_BUTTON)
switch.direction = Direction.INPUT
switch.pull = Pull.UP
# servo control # servo control
pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, duty_cycle=2 ** 15, frequency=50) pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, duty_cycle=2 ** 15, frequency=50)
servo = servo.ContinuousServo(pwm, min_pulse=750, max_pulse=2250) servo = servo.ContinuousServo(pwm, min_pulse=750, max_pulse=2250)
@ -53,32 +59,47 @@ prop_time = False
servo_throttle = 0 servo_throttle = 0
while True: while True:
if prop_time: try:
if ticks_diff(ticks_ms(), servo_clock) >= servo_time: if switch.value:
# print(servo_throttle) external_power.value = True
servo.throttle = servo_throttle if prop_time:
servo_throttle = not servo_throttle if ticks_diff(ticks_ms(), servo_clock) >= servo_time:
servo_clock = ticks_add(servo_clock, servo_time) print(servo_throttle)
if ticks_diff(ticks_ms(), vl53_clock) >= vl53_time: servo.throttle = servo_throttle
if vl53.data_ready: servo_throttle = not servo_throttle
# print(f"Distance: {vl53.distance} cm") servo_clock = ticks_add(servo_clock, servo_time)
vl53.clear_interrupt() if ticks_diff(ticks_ms(), vl53_clock) >= vl53_time:
closest_distance = min(distances, key=lambda x: abs(vl53.distance - x)) if vl53.data_ready:
# print(closest_distance) print(f"Distance: {vl53.distance} cm")
if vl53.distance <= distances[0]: vl53.clear_interrupt()
prop_time = True if vl53.distance is None:
mixer.voice[0].level = max_audio prop_time = False
mixer.voice[0].level = 0.0
servo_time = int(servo_delays[0] * 1000)
servo.throttle = 1.0
else:
closest_distance = min(distances, key=lambda x: abs(vl53.distance - x))
# print(closest_distance)
if vl53.distance <= distances[0]:
prop_time = True
mixer.voice[0].level = max_audio
else:
prop_time = False
mixer.voice[0].level = 0.0
servo.throttle = 1.0
if closest_distance == distances[1]:
mixer.voice[1].play(tracks[1], loop=False)
servo_time = int(servo_delays[1] * 1000)
elif closest_distance == distances[2]:
mixer.voice[2].play(tracks[2], loop=False)
servo_time = int(servo_delays[2] * 1000)
elif closest_distance == distances[3]:
mixer.voice[3].play(tracks[3], loop=False)
servo_time = int(servo_delays[3] * 1000)
vl53_clock = ticks_add(vl53_clock, vl53_time)
else: else:
prop_time = False external_power.value = False
mixer.voice[0].level = 0.0 except Exception as error: # pylint: disable=broad-exception-caught
servo_time = int(servo_delays[0] * 1000) print(error)
if closest_distance == distances[1]: time.sleep(5)
mixer.voice[1].play(tracks[1], loop=False) microncontroller.reset()
servo_time = int(servo_delays[1] * 1000)
elif closest_distance == distances[2]:
mixer.voice[2].play(tracks[2], loop=False)
servo_time = int(servo_delays[2] * 1000)
elif closest_distance == distances[3]:
mixer.voice[3].play(tracks[3], loop=False)
servo_time = int(servo_delays[3] * 1000)
vl53_clock = ticks_add(vl53_clock, vl53_time)

Binary file not shown.