If you are a fan of physics wunderkind Richard Feynman and you like bongo drums, this Feynman simulator will satisfy your every desire. Between wise quips, this Feyn-bot will dazzle you with its drumming expertise.
Wiring Diagram
Solenoids don't have 'direction' - any current will make them push. So even though we wired the black wire to 5V and the red wires to the #1 and #2 drive ports, they'll work just fine.
The microservo is taped to a wooden stick that moves the paper cut-out mouth up and down, for a Monty-Python-style puppet.
Our code plays through a few wave file quips and quotes we found online, with some interstitial bongo drumming. Once all the audio has been played, it bongos for a long time, then repeats!
# SPDX-FileCopyrightText: 2018 Limor Fried for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# CircuitPython 3.0 CRICKIT demo
import gc
import time
import audioio
import audiocore
import board
from adafruit_motor import servo
from adafruit_seesaw.pwmout import PWMOut
from adafruit_seesaw.seesaw import Seesaw
from busio import I2C
i2c = I2C(board.SCL, board.SDA)
ss = Seesaw(i2c)
print("Feynbot demo!")
# 1 Servo
pwm = PWMOut(ss, 17)
pwm.frequency = 50
myservo = servo.Servo(pwm)
myservo.angle = 180 # starting angle, highest
# 2 Drivers
drives = []
for ss_pin in (13, 12):
_pwm = PWMOut(ss, ss_pin)
_pwm.frequency = 1000
drives.append(_pwm)
# Audio files
wavfiles = ["01.wav", "02.wav", "03.wav", "04.wav", "05.wav"]
a = audioio.AudioOut(board.A0)
# Start playing the file (in the background)
def play_file(wavfile):
f = open(wavfile, "rb")
wav = audiocore.WaveFile(f)
a.play(wav)
# Tap the solenoids back and forth
def bongo(t):
for _ in range(t):
drives[0].duty_cycle = 0xFFFF
time.sleep(0.1)
drives[0].duty_cycle = 0
time.sleep(0.1)
drives[1].duty_cycle = 0xFFFF
time.sleep(0.1)
drives[1].duty_cycle = 0
time.sleep(0.1)
# Move mouth back and forth
def talk(t):
for _ in range(t):
myservo.angle = 150
time.sleep(0.1)
myservo.angle = 180
time.sleep(0.1)
filenum = 0 # counter to play all files
while True:
gc.collect()
print(gc.mem_free())
# time to play the bongos!
bongo(5)
time.sleep(1)
# OK say something insightful
play_file(wavfiles[filenum])
# and move the mouth while it does
while a.playing:
talk(1)
# Done being insightful, take a break
time.sleep(1)
# If we went thru all the files, JAM OUT!
filenum += 1
if filenum >= len(wavfiles):
bongo(20)
filenum = 0
Page last edited January 22, 2025
Text editor powered by tinymce.