Feynman Simulator

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.

Parts List

Circuit Playground Express

PRODUCT ID: 3333
Circuit Playground Express is the next step towards a perfect introduction to electronics and programming. We've taken the original Circuit Playground Classic and...
$24.95
IN STOCK

Adafruit CRICKIT for Circuit Playground Express

PRODUCT ID: 3093
Sometimes we wonder if robotics engineers ever watch movies. If they did, they'd know that making robots into slaves always ends up in a robot rebellion. Why even go down that...
$29.95
IN STOCK

Mini Push-Pull Solenoid - 5V

PRODUCT ID: 2776
Solenoids are basically electromagnets: they are made of a coil of copper wire with an armature (a slug of metal) in the middle. When the coil is energized, the slug is pulled into the...
$4.95
IN STOCK

Micro servo

PRODUCT ID: 169
Tiny little servo can rotate approximately 180 degrees (90 in each direction), and works just like the standard kinds you're used to but smaller. You can use any servo...
$5.95
IN STOCK

Mono Enclosed Speaker - 3W 4 Ohm

PRODUCT ID: 3351
Listen up! This 2.8" x 1.2" speaker is a great addition to any audio project where you need 4 ohm impedance and 3W or less of power. We particularly like...
$3.95
IN STOCK

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.

Code

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!

# CircuitPython 3.0 CRICKIT demo

import gc
import time

import audioio
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 = audioio.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
This guide was first published on May 16, 2018. It was last updated on May 16, 2018. This page (Feynman Simulator) was last updated on Jan 26, 2020.