updates for pumpkin
a few updates for the pumpkin project. now with a switch and more error handling
This commit is contained in:
parent
d71dd92eb7
commit
99ca7416e0
2 changed files with 55 additions and 34 deletions
|
|
@ -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)
|
|
||||||
|
|
|
||||||
BIN
Spinning_Ikea_Pumpkin/happy-halloween.wav
Normal file
BIN
Spinning_Ikea_Pumpkin/happy-halloween.wav
Normal file
Binary file not shown.
Loading…
Reference in a new issue