go go raccoon!
This commit is contained in:
parent
1772ef4c2b
commit
f67fce6b74
1 changed files with 131 additions and 0 deletions
131
Crickits/climbing_raccoon/code.py
Normal file
131
Crickits/climbing_raccoon/code.py
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
import time
|
||||||
|
import audioio
|
||||||
|
from digitalio import DigitalInOut, Pull, Direction
|
||||||
|
from adafruit_seesaw.seesaw import Seesaw
|
||||||
|
from adafruit_seesaw.pwmout import PWMOut
|
||||||
|
from adafruit_motor import stepper
|
||||||
|
from busio import I2C
|
||||||
|
import neopixel
|
||||||
|
import board
|
||||||
|
|
||||||
|
# Create seesaw object
|
||||||
|
i2c = I2C(board.SCL, board.SDA)
|
||||||
|
seesaw = Seesaw(i2c)
|
||||||
|
|
||||||
|
led = DigitalInOut(board.D13)
|
||||||
|
led.direction = Direction.OUTPUT
|
||||||
|
|
||||||
|
buttona = DigitalInOut(board.BUTTON_A)
|
||||||
|
buttona.direction = Direction.INPUT
|
||||||
|
buttona.pull = Pull.DOWN
|
||||||
|
|
||||||
|
buttonb = DigitalInOut(board.BUTTON_B)
|
||||||
|
buttonb.direction = Direction.INPUT
|
||||||
|
buttonb.pull = Pull.DOWN
|
||||||
|
|
||||||
|
BOTTOM_SENSOR = 2
|
||||||
|
TOP_SENSOR = 3
|
||||||
|
seesaw.pin_mode(BOTTOM_SENSOR, seesaw.INPUT_PULLUP)
|
||||||
|
seesaw.pin_mode(TOP_SENSOR, seesaw.INPUT_PULLUP)
|
||||||
|
|
||||||
|
# Create one stepper motor using the 4 'drive' PWM pins 13, 43, 12 and 42
|
||||||
|
pwms = [PWMOut(seesaw, 13), PWMOut(seesaw, 43), PWMOut(seesaw, 12), PWMOut(seesaw, 42)]
|
||||||
|
for p in pwms:
|
||||||
|
p.frequency = 2000
|
||||||
|
stepper_motor = stepper.StepperMotor(pwms[0], pwms[1], pwms[2], pwms[3])
|
||||||
|
|
||||||
|
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=1)
|
||||||
|
pixels.fill((0,0,0))
|
||||||
|
|
||||||
|
|
||||||
|
def rainbow():
|
||||||
|
pixels.fill((20,0,0))
|
||||||
|
time.sleep(0.05)
|
||||||
|
pixels.fill((20,20,0))
|
||||||
|
time.sleep(0.05)
|
||||||
|
pixels.fill((0,20,0))
|
||||||
|
time.sleep(0.05)
|
||||||
|
pixels.fill((0,20,20))
|
||||||
|
time.sleep(0.05)
|
||||||
|
pixels.fill((0,0,20))
|
||||||
|
time.sleep(0.05)
|
||||||
|
pixels.fill((20,0,20))
|
||||||
|
time.sleep(0.05)
|
||||||
|
|
||||||
|
# Audio playback object and helper to play a full file
|
||||||
|
a = audioio.AudioOut(board.A0)
|
||||||
|
def play_file(wavfile):
|
||||||
|
with open(wavfile, "rb") as file:
|
||||||
|
wavf = audioio.WaveFile(file)
|
||||||
|
a.play(wavf)
|
||||||
|
while a.playing:
|
||||||
|
rainbow()
|
||||||
|
|
||||||
|
|
||||||
|
last_b_time = last_a_time = 0
|
||||||
|
steps = speed = 0
|
||||||
|
MINIMUM_SPEED = 1 # in taps per second
|
||||||
|
drift_counter = 0
|
||||||
|
TOUCH_THRESH = 900
|
||||||
|
won = False
|
||||||
|
|
||||||
|
def reset():
|
||||||
|
print("Resetting..", end="")
|
||||||
|
while seesaw.digital_read(BOTTOM_SENSOR):
|
||||||
|
stepper_motor.onestep(direction=stepper.BACKWARD, style=stepper.DOUBLE)
|
||||||
|
print("Done!")
|
||||||
|
|
||||||
|
print("Racooon crawl!")
|
||||||
|
|
||||||
|
reset()
|
||||||
|
paused = False
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# pause button B
|
||||||
|
if buttonb.value:
|
||||||
|
while buttonb.value:
|
||||||
|
pass
|
||||||
|
paused = not paused
|
||||||
|
|
||||||
|
# reset button A
|
||||||
|
if buttona.value:
|
||||||
|
while buttona.value:
|
||||||
|
pass
|
||||||
|
pixels.fill((0, 0, 0))
|
||||||
|
reset()
|
||||||
|
|
||||||
|
if not seesaw.digital_read(TOP_SENSOR):
|
||||||
|
play_file("madeit.wav")
|
||||||
|
for i in range(20):
|
||||||
|
rainbow()
|
||||||
|
reset()
|
||||||
|
#print(seesaw.touch_read(0))
|
||||||
|
#print(seesaw.touch_read(3))
|
||||||
|
if seesaw.touch_read(0) > TOUCH_THRESH:
|
||||||
|
while seesaw.touch_read(0) > TOUCH_THRESH:
|
||||||
|
pass
|
||||||
|
last_a_time = time.monotonic()
|
||||||
|
|
||||||
|
if seesaw.touch_read(3) > TOUCH_THRESH:
|
||||||
|
while seesaw.touch_read(3) > TOUCH_THRESH:
|
||||||
|
pass
|
||||||
|
last_b_time = time.monotonic()
|
||||||
|
|
||||||
|
delta_a = time.monotonic() - last_a_time
|
||||||
|
delta_b = time.monotonic() - last_b_time
|
||||||
|
#print("Lately... %0.1f & %0.1f" % (delta_a, delta_b))
|
||||||
|
|
||||||
|
speed = 1.0 / max(delta_a, delta_b)
|
||||||
|
print("Speed %0.1f\tSteps %d" % (speed, steps))
|
||||||
|
if speed > MINIMUM_SPEED:
|
||||||
|
# Climb up
|
||||||
|
pixels.fill((0, int(speed*10), 0))
|
||||||
|
for i in range(6):
|
||||||
|
stepper_motor.onestep(direction=stepper.FORWARD, style=stepper.DOUBLE)
|
||||||
|
steps += 1
|
||||||
|
elif not paused:
|
||||||
|
# Fall down
|
||||||
|
pixels.fill((50, 0, 0))
|
||||||
|
if seesaw.digital_read(BOTTOM_SENSOR):
|
||||||
|
stepper_motor.onestep(direction=stepper.BACKWARD)
|
||||||
|
steps -= 1
|
||||||
Loading…
Reference in a new issue