Dr. Theopolis,- a different approach

bobbrown731

Member
Mar 15, 2025
33
95
15
51
Greetings,
So I have been wanting a Dr. Theopolis from my childhood favorite TV show. Ian Hughes on Patreon is a gifted 3d modeler of full scale Sci-Fi robots and props, he has designed a Dr. Theopolis but it is lacking some detail. After looking for details and finding this forum, I am taking inspiration from Ian and details from @Revell-Fan and a little bit on my own ideas to make a full scale Dr. Theopolis that will have a 3D printed shell/housing, laser cut acrylic face and parts, IC chips, LED lights, color laser printed water slide decals, and eventually an open source AI home assistant interface that will activate the lighting when speaking, saying lines from the show, answering questions and performing home automation task similar to a google home or alexa. This discussion thread will document my journey and if successful, it will provide readers with an easy to follow step by step guide to build and improve upon thier very own Dr. Theopolis smart home assistant. I am hoping I can complete a working prototype before Ian Hughes releases his full scale 3D printed Twiki.


After using Ian's mesh model for some basic measurements I have create the below solid model and some DXF sketches
-Case will be 3d printed.
-Eyes, Mouth, Brow Pieces, lenses will be clear and colored acrylic cut on my 50watt co2 laser.
-Color Graphics (Color Graphics courtesy of @Revell-Fan ) to be color laser printed on clear water slide decal sheet.

Screenshot 2025-03-17 112046.png
 
After looking at the reference images I am seeing quite a few changes I need to make. First I am going to make all the parts go in from the back the cut front lens first followed by an interior trim ring to act as a spacer between the layers of clear acrylic. I will be adding alignment pegs and slots to force the alignment orientation of the 2 acrylic lenses to always be correct. I also need to redraw the mouth and chin as the shapes are not correct at all. Screenshot 2025-03-17 124037.pngScreenshot 2025-03-17 124605.png
 
BYC is my goto source for the original models. Here are some additional WIP drawings from my SketchUp file. I think you can make some good use of the hangers. BTW, all those graphics are made with CorelDraw. I can convert them into *.eps, *.svg, *.dwg or *.dxf files if you like. ;)
 

Attachments

  • Like
Reactions: micahrogers
BYC is my goto source for the original models. Here are some additional WIP drawings from my SketchUp file. I think you can make some good use of the hangers. BTW, all those graphics are made with CorelDraw. I can convert them into *.eps, *.svg, *.dwg or *.dxf files if you like. ;)
You rock. I will work on it more tomorrow. I think I am at a stopping point for right now until I can get to the plastics shop and touch some sheet material to see how thick or thin I need for the laser cut parts. I might start work on installing a mount and layout for the raspberryPI to control the lights, audio, and smart assistant. Some basic questions with grok AI and I now have some ideas on how to get set up to control things in my home as well as complete some smart assistant tasks.

I found some CAD for IC chips. I might not go 100% accuracy with the chips. so for now they are all the same chip just cut and pasted. I can swap and edit as I source actual chips for the build.
Screenshot 2025-03-17 144103.png
 
I found some CAD for IC chips. I might not go 100% accuracy with the chips. so for now they are all the same chip just cut and pasted. I can swap and edit as I source actual chips for the build.
Good idea. I replicated as much of the original ID codes as possible and improvised whenever I could not see them clearly. :)
 
I have ordered the Red and Clear Acrylic from my local plastics shop. They should have my order ready when I get off of work. I still need the textured for the eyes. I think I will go to Home Hepot and grab some textured light defusing panel from the lighting dept. to laminate over clear with a transparent printed color layer between the clear and the textured diffuser.

I have exported out my CAD outlines for cutting into svg files for the co2 laser cutter

I have ordered clear laserprinter waterslide decal paper and laserprinter transparency projector sheets for the graphics.

Screenshot 2025-03-19 153037.png
 
I haven't been able to get much done in the past day. I did ask grok how to make Theo flash and play audio clips via a raspberry pi. This will be done before I go full AI driven smart speaker device. After some tweaking of requirements
Here is what grok said

Let’s tweak the flashing sequence for your Dr. Theopolis prop. Now, when idle, the 4 soft white perimeter LEDs and 6 normal white eye LEDs will stay on. When speaking (button pressed), the eyes will alternate flashing with the remaining red LEDs (mouth, upper eyebrow, large eyebrow, chin). This adds a dynamic, conversational feel while keeping the idle state glowing and alive. Here’s the updated build.

### Materials (Unchanged)
- **Prop Base**: 9-inch disc, clear acrylic face (~8.5-inch), paint, hot glue, etc.
- **Electronics**:
- Raspberry Pi (Zero 2 W or 3/4).
- Speaker (3-5W, USB or 3.5mm).
- Push button.
- **LEDs**:
- 4 soft white LEDs (perimeter, always-on).
- 6 normal white LEDs (eyes, 3 per eye, on when idle, flashing when speaking).
- 4 red LEDs (mouth).
- 6 red LEDs (upper eyebrow).
- 8 red LEDs (large eyebrow).
- 3 red LEDs (chin).
- Resistors: 220Ω for each LED (31 total).
- Wires, breadboard (optional), soldering kit.
- **Power**: 5V USB power bank (5000mAh+).
- **Audio**: MP3 clips.

### Step-by-Step Build (Adjusted)
#### 1. Design the Prop
- **Face Layout**: Same as before:
- Perimeter: 4 soft white LEDs at 12, 3, 6, 9 o’clock.
- Eyes: 3 normal white LEDs per eye (left ~10 o’clock, right ~2 o’clock).
- Upper Eyebrow: 6 red LEDs above eyes.
- Large Eyebrow: 8 red LEDs below upper eyebrow.
- Mouth: 4 red LEDs, lower center.
- Chin: 3 red LEDs below mouth.
- **Mounting**: Glue LEDs behind the acrylic, wires to the back.

#### 2. Wire the Electronics
- **Always-On Perimeter LEDs (4 Soft White)**:
- Parallel wiring:
- Positive legs to Pi’s 3.3V (pin 1).
- Negative legs to GND (pin 6) via 220Ω resistors each.
- On at power-up.
- **Idle-On & Flashing Eye LEDs (6 Normal White)**:
- Left eye (3 LEDs) to GPIO 18.
- Right eye (3 LEDs) to GPIO 23.
- Wire in parallel per eye, 220Ω resistor per LED to GND.
- Controlled by script to stay on when idle, flash when speaking.
- **Flashing Red LEDs (21 Total)**:
- Mouth (4 LEDs) to GPIO 12.
- Upper Eyebrow (6 LEDs) to GPIO 24.
- Large Eyebrow (8 LEDs) to GPIO 25.
- Chin (3 LEDs) to GPIO 16.
- Wire each group in parallel, 220Ω resistor per LED to GND.
- **Button**: GPIO 17 and GND.
- **Speaker**: Pi’s 3.5mm jack or USB.

#### 3. Update the Script
- New logic: Perimeter and eyes on when idle; when button pressed, eyes alternate flashing with red LEDs during audio:
```python
import RPi.GPIO as GPIO
import time
import random
import os

# GPIO setup
GPIO.setmode(GPIO.BCM)
BUTTON_PIN = 17
EYE_PINS = [18, 23] # Left eye, right eye (normal white)
RED_PINS = [12, 24, 25, 16] # Mouth, upper eyebrow, large eyebrow, chin (red)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
for pin in EYE_PINS + RED_PINS:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)

# Note: 4 perimeter soft white LEDs wired to 3.3V and GND, always on

# MP3 files directory
AUDIO_PATH = "/home/pi/theo_clips/" # Update with your path
clips = [f for f in os.listdir(AUDIO_PATH) if f.endswith(".mp3")]

def flash_sequence(duration):
end_time = time.time() + duration
while time.time() < end_time:
# Eyes on, red off
for pin in EYE_PINS:
GPIO.output(pin, GPIO.HIGH)
for pin in RED_PINS:
GPIO.output(pin, GPIO.LOW)
time.sleep(0.2)
# Eyes off, red on
for pin in EYE_PINS:
GPIO.output(pin, GPIO.LOW)
for pin in RED_PINS:
GPIO.output(pin, GPIO.HIGH)
time.sleep(0.2)

try:
# Idle state: eyes on
for pin in EYE_PINS:
GPIO.output(pin, GPIO.HIGH)

while True:
if GPIO.input(BUTTON_PIN) == GPIO.LOW: # Button pressed
clip = random.choice(clips)
print(f"Playing: {clip}")
os.system(f"mpg123 {AUDIO_PATH}{clip}") # Play MP3
flash_sequence(3) # Alternate eyes and red LEDs for 3 seconds
time.sleep(0.5) # Debounce delay
# Return to idle: eyes on, red off
for pin in EYE_PINS:
GPIO.output(pin, GPIO.HIGH)
for pin in RED_PINS:
GPIO.output(pin, GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup()
```
- **Install**: `sudo apt-get install mpg123`. MP3s in `/home/pi/theo_clips/`.

#### 4. Assemble and Test
- **Mounting**:
- Glue 4 soft white perimeter LEDs at 12, 3, 6, 9 o’clock.
- Position face LEDs: 3 normal white per eye, 4 red for mouth, 6 red for upper eyebrow, 8 red for large eyebrow, 3 red for chin.
- Mount Pi, speaker (back/bottom, with holes), and button (side/back).
- Organize wires.
- **Power**: 5V power bank. Perimeter and eye LEDs glow on startup; red LEDs stay off until triggered.
- **Test**:
- **Idle**: 4 perimeter and 6 eye LEDs on, red LEDs off.
- **Button Press**: Audio plays, eyes flash for 0.2s, then red LEDs (mouth, eyebrows, chin) flash for 0.2s, alternating for 3 seconds. Eyes return to on afterward.

#### 5. Finish
- Seal back with a removable panel.
- Paint rim silver/metallic, letting perimeter LEDs shine subtly.

### How It Looks and Works
- **Idle**: 4 soft white perimeter LEDs and 6 normal white eye LEDs glow steadily, giving Theo a “powered-on” look.
- **Speaking**: Audio plays (e.g., “Greetings, Buck”), and eyes flash on/off (0.2s), alternating with all red LEDs (mouth, upper eyebrow, large eyebrow, chin) for 3 seconds. Post-audio, eyes stay on, red LEDs turn off.

### Tips
- **Timing**: Adjust `time.sleep(0.2)` in `flash_sequence` for faster/slower alternation (e.g., 0.1s for quicker flashes).
- **Power**: 31 LEDs, but only 15 on at once (4 perimeter, 6 eyes, 5 red avg. when flashing)—~300mA max, Pi-safe.
- **Balance**: If eyes look dim next to red, lower red resistors to 180Ω or test eye LEDs at 3.3V.

This gives Theo a lively speaking pattern. Need help with the alternating sequence or a visual of the effect? Let me know how it’s coming!

Of course there will be needed tweaking and editing but this give a starting point for a dumb old man like me.

 -Bobby
 
I wasn't thrilled with the idea of the time and effort that a raspberry pi would require just to play audio clips and flash some LEDs. So I asked Grok if it could be done with an small arduino microcontroller. It seems that for this use case it would be a better option. I was unhappy with the lights flashing based on timing with the start and stop of audio. So I again asked Grok, can I make the lights flash based on syllables rather than fixed timing. It gave me the steps needed to detect the audio peaks and flash the lighting sequence based on the peaks and valleys of the audio. The output below is from Grok.



Yes, you can make the LEDs alternate flashing with the syllables of Dr. Theopolis’ voice instead of a fixed timing! This creates a more dynamic, speech-synced effect, where the eyes and red LEDs (mouth, eyebrows, chin) toggle based on the audio’s rhythm. With an Arduino, we can achieve this by analyzing the audio output in real-time using the speaker signal from the DFPlayer Mini. However, since the Arduino doesn’t have built-in audio processing, we’ll use a simple analog envelope detection method with minimal extra hardware. Here’s how to adapt the build.

### How It Works
- **Concept**: The DFPlayer Mini sends audio to the speaker. We’ll tap into that signal, detect amplitude peaks (syllables), and use them to trigger LED alternation. Eyes light up on one peak, red LEDs on the next, mimicking speech cadence.
- **Hardware**: Add a basic circuit to sense audio levels—an analog pin on the Arduino will read voltage changes from the speaker line.
- **Software**: Modify the code to alternate LEDs based on audio peaks instead of fixed delays.

### Updated Materials
- **Prop Base**: 9-inch disc, clear acrylic face (~8.5-inch), paint, hot glue, etc.
- **Electronics**:
- Arduino (Uno or Nano).
- DFPlayer Mini (MP3 module with microSD).
- Small speaker (3-5W, 8Ω).
- Push button.
- **LEDs**:
- 4 soft white LEDs (perimeter, always-on).
- 6 normal white LEDs (eyes, 3 per eye, on when idle, flashing with syllables).
- 4 red LEDs (mouth).
- 6 red LEDs (upper eyebrow).
- 8 red LEDs (large eyebrow).
- 3 red LEDs (chin).
- Resistors: 220Ω for each LED (31 total).
- **Audio Detection**:
- 1kΩ resistor.
- 10kΩ resistor.
- Small signal diode (e.g., 1N4148).
- 10µF capacitor.
- Wires, breadboard (recommended for testing), soldering kit.
- **Power**: 5V USB power bank or 9V battery.
- **Audio**: MP3 clips on microSD (001.mp3, 002.mp3, etc.).

### Step-by-Step Build
#### 1. Design the Prop
- **Face Layout**: Unchanged—4 perimeter soft white, 6 eye normal white, 4 mouth red, 6 upper eyebrow red, 8 large eyebrow red, 3 chin red.
- **Mounting**: Glue LEDs behind acrylic, wires to the back.

#### 2. Wire the Electronics
- **Always-On Perimeter LEDs (4 Soft White)**:
- Positive legs to Arduino 5V.
- Negative legs to GND via 220Ω resistors each.
- **Idle-On & Flashing Eye LEDs (6 Normal White)**:
- Left eye (3 LEDs) to pin 2.
- Right eye (3 LEDs) to pin 3.
- Parallel per eye, 220Ω resistor per LED to GND.
- **Flashing Red LEDs (21 Total)**:
- Mouth (4 LEDs) to pin 4.
- Upper Eyebrow (6 LEDs) to pin 5.
- Large Eyebrow (8 LEDs) to pin 6.
- Chin (3 LEDs) to pin 7.
- Parallel per group, 220Ω resistor per LED to GND.
- **Push Button**: Pin 8 to GND (internal pull-up).
- **DFPlayer Mini**:
- VCC to Arduino 5V.
- GND to Arduino GND.
- RX to pin 10 (via 1kΩ resistor).
- TX to pin 11.
- SPK_1 and SPK_2 to speaker.
- **Audio Detection Circuit**:
- From DFPlayer SPK_1 (before speaker):
- Connect a 1kΩ resistor in series.
- Add a diode (1N4148, anode to resistor, cathode to next step) to block negative voltage.
- Connect a 10µF capacitor (positive to diode cathode, negative to GND) to smooth the signal.
- From diode/capacitor junction, run a 10kΩ resistor to GND (voltage divider).
- Connect this junction to Arduino analog pin A0.
- This creates a simple envelope follower—audio peaks raise A0’s voltage.

#### 3. Arduino Code
- Use the DFPlayer library and read A0 to detect syllables, alternating LEDs on peaks:
```cpp
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

SoftwareSerial mySerial(10, 11); // RX, TX for DFPlayer
#define BUTTON_PIN 8
#define LEFT_EYE_PIN 2
#define RIGHT_EYE_PIN 3
#define MOUTH_PIN 4
#define UPPER_EYEBROW_PIN 5
#define LARGE_EYEBROW_PIN 6
#define CHIN_PIN 7
#define AUDIO_PIN A0

const int eyePins[] = {LEFT_EYE_PIN, RIGHT_EYE_PIN};
const int redPins[] = {MOUTH_PIN, UPPER_EYEBROW_PIN, LARGE_EYEBROW_PIN, CHIN_PIN};
const int numClips = 5; // Update with your number of MP3 files
int threshold = 100; // Adjust based on testing (0-1023)
bool eyesOn = true; // Tracks alternation state

void setup() {
mySerial.begin(9600);
mp3_set_serial(mySerial);
delay(10);
mp3_set_volume(20); // 0-30, adjust

pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(AUDIO_PIN, INPUT);
for (int pin : eyePins) {
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); // Eyes on at idle
}
for (int pin : redPins) {
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW); // Red off at idle
}
}

void flashWithSyllables(int durationMs) {
unsigned long startTime = millis();
int lastPeak = 0;
while (millis() - startTime < durationMs) {
int audioLevel = analogRead(AUDIO_PIN); // Read audio envelope (0-1023)
if (audioLevel > threshold && millis() - lastPeak > 100) { // Peak detected, debounce 100ms
eyesOn = !eyesOn; // Toggle state
if (eyesOn) {
for (int pin : eyePins) digitalWrite(pin, HIGH);
for (int pin : redPins) digitalWrite(pin, LOW);
} else {
for (int pin : eyePins) digitalWrite(pin, LOW);
for (int pin : redPins) digitalWrite(pin, HIGH);
}
lastPeak = millis();
}
}
}

void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // Button pressed
int clip = random(1, numClips + 1);
mp3_play(clip);
flashWithSyllables(3000); // Flash with syllables for 3s
delay(500); // Debounce
// Return to idle
for (int pin : eyePins) digitalWrite(pin, HIGH);
for (int pin : redPins) digitalWrite(pin, LOW);
}
}
```
- **Install Library**: Add “DFPlayer Mini Mp3 by Makuna” via Arduino IDE.
- **Notes**:
- `threshold`: Tune this (50-200) based on your audio levels—test with Serial Monitor (`Serial.println(audioLevel);`) to find peaks.
- `100ms debounce`: Prevents rapid toggling; adjust if syllables are too fast/slow.

#### 4. Assemble and Test
- **Mounting**: Same as before—4 perimeter, 6 eyes, 4 mouth, 6 upper eyebrow, 8 large eyebrow, 3 chin.
- **Wiring**: Add the audio detection circuit between DFPlayer SPK_1 and A0.
- **Power**: 5V USB to Arduino (powers all).
- **Test**:
- **Idle**: 4 perimeter and 6 eye LEDs on, red off.
- **Button Press**: Audio plays, eyes and red LEDs alternate on syllable peaks for 3s, then back to idle.

#### 5. Finish
- Seal back with a removable panel.
- Paint rim silver/metallic.

### How It Works
- **Idle**: 4 soft white perimeter and 6 normal white eye LEDs on.
- **Speaking**: Audio peaks (syllables) toggle eyes on/red off, then eyes off/red on. Timing follows speech rhythm, not a fixed delay.

### Tips
- **Threshold Tuning**: Start at 100, adjust up/down if it misses syllables or triggers too often.
- **Audio Levels**: If detection is weak, increase DFPlayer volume or tweak resistors (e.g., 4.7kΩ instead of 10kΩ).
- **Power**: 31 LEDs, ~300mA avg.—Arduino handles it fine.

This syncs LEDs to Theo’s voice naturally. Need help testing the circuit or tweaking the threshold? Let me know!
 
Ok... So I am getting scope creep... the killer of any project. So I am redefining the scope and not making anymore changes in my requirements just in case I decide to start selling (and supporting these as finished models). We all have a bluetooth enabled digital assistant on us all the time, anyway. Would it not be prudent to just make Dr. Theo a Bluetooth Speaker with a battery and let your smart phone of choice be the AI or Digital Assistant as well as playing music and sound files with the same audio pickup circuit to control the lights? I have already run the new requirements through Grok AI and he has given me the parts and the coding that I need to make this happen. I will order a few parts next week. This weekend I hope to finish Rev 1 of the CAD files, cut all of my acrylic, print all of my printed parts, and work on spacing between the acrylic layers. It appear the hardest part will be making the audio detection circuit.