73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
# SPDX-FileCopyrightText: 2018 Limor Fried for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import time
|
|
import random
|
|
import audioio
|
|
import audiocore
|
|
from digitalio import DigitalInOut, Pull, Direction
|
|
from adafruit_seesaw.seesaw import Seesaw
|
|
from adafruit_seesaw.pwmout import PWMOut
|
|
from adafruit_motor import servo
|
|
from busio import I2C
|
|
import board
|
|
|
|
wavefiles = ["01.wav", "02.wav", "03.wav", "04.wav", "05.wav", "06.wav",
|
|
"07.wav", "08.wav", "09.wav", "10.wav", "11.wav", "12.wav",
|
|
"13.wav", "14.wav"]
|
|
|
|
# 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
|
|
|
|
SWITCH = 2 # A switch on signal #0
|
|
# Add a pullup on the switch
|
|
seesaw.pin_mode(SWITCH, seesaw.INPUT_PULLUP)
|
|
|
|
# Servo angles
|
|
MOUTH_START = 95
|
|
MOUTH_END = 90
|
|
|
|
# 17 is labeled SERVO 1 on CRICKIT
|
|
pwm = PWMOut(seesaw, 17)
|
|
# must be 50 cannot change
|
|
pwm.frequency = 50
|
|
# microservo usually is 400/2500 (tower pro sgr2r)
|
|
my_servo = servo.Servo(pwm, min_pulse=400, max_pulse=2500)
|
|
# Starting servo locations
|
|
my_servo.angle = MOUTH_START
|
|
|
|
# Audio playback object and helper to play a full file
|
|
a = audioio.AudioOut(board.A0)
|
|
def play_file(wavfile):
|
|
print("Playing", wavfile)
|
|
with open(wavfile, "rb") as f:
|
|
wav = audiocore.WaveFile(f)
|
|
a.play(wav)
|
|
while a.playing:
|
|
my_servo.angle = MOUTH_END
|
|
time.sleep(.15)
|
|
my_servo.angle = MOUTH_START
|
|
time.sleep(.15)
|
|
|
|
while True:
|
|
if seesaw.digital_read(SWITCH) and not buttona.value and not buttonb.value:
|
|
continue
|
|
|
|
play_file(random.choice(wavefiles))
|
|
|
|
# wait for buttons to be released
|
|
while buttona.value or buttonb.value or not seesaw.digital_read(SWITCH):
|
|
pass
|