No description
  • OpenSCAD 53.9%
  • C++ 39.2%
  • Python 4.5%
  • Shell 2.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
nimby 072ac93656 Eye pods: flat front, no step for the ring
The tan ring now glues straight onto the flat face.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 00:25:12 -04:00
docs/enoch Enoch body: measurements, cut list and silhouette drawings 2026-10-24 16:55:27 -04:00
hardware Eye pods: flat front, no step for the ring 2026-10-28 00:25:12 -04:00
lib/face_render Pumking: firmware, face renderer, enclosures and head mount 2026-10-24 14:34:09 -04:00
src Pumking: firmware, face renderer, enclosures and head mount 2026-10-24 14:34:09 -04:00
stl Eye pods: flat front, no step for the ring 2026-10-28 00:25:12 -04:00
tools Enoch body: measurements, cut list and silhouette drawings 2026-10-24 16:55:27 -04:00
.gitignore Pumking: firmware, face renderer, enclosures and head mount 2026-10-24 14:34:09 -04:00
platformio.ini Pumking: firmware, face renderer, enclosures and head mount 2026-10-24 14:34:09 -04:00
README.md Mouth: a pod built like the eyes, replacing the plate 2026-10-27 01:07:11 -04:00

Pumking 🎃

Tech for a large plastic jack-o'-lantern mask, for Halloween 2026, on a budget under $500:

  • Carried above your head: the pumpkin rides on a 3D-printed shoulder yoke and turns with your head. You see out through a dark mesh panel in the costume at face level (see Head mount).
  • Glowing carved face: two 2.8" LCDs behind the triangle eyes draw flickering flame eyes with blinks and moods. An 8×32 LED panel behind a frosted diffuser makes the mouth, which opens with your voice.
  • Voice changer: mic at your collar → effects (Demon / Ghost / Robot / Clean / Off) → speaker on your chest or belt.

One Teensy 4.1 runs the voice, eyes, and mouth. It starts instantly, adds no noticeable audio delay, and has no SD card to corrupt. The Raspberry Pi 5 (deskpi) is the dev machine. The Teensy plugs into omarchy-laptop for flashing (see Deploying).

Repo layout

Path What
lib/face_render/ Hardware-independent eye/mouth animation and rendering. The firmware and the host preview share it, so the preview shows exactly what the hardware will draw.
lib/face_render/face_geometry.h Tunable geometry: eye triangle, mouth crescent, LED panel wiring. Update this after measuring the mask.
src/firmware/ Teensy 4.1 firmware: config.h (pins, presets, limits), voice, eyes, mouth, buttons, volume_knob, main.cpp
src/preview/ Host preview that renders frames to PNG (dependency-free PNG writer)
tools/preview_sheet.py Contact sheets + talking.gif from the preview frames
tools/deploy.sh Build + flash on the laptop (or via deskpi), and show serial output
hardware/brain_box.scad Parametric OpenSCAD model of the 3D-printed brain box (see Brain box)
hardware/speaker_pod.scad The speaker pod: both speakers, their amps and the knob, with swappable mount plates (see Speaker pod)
hardware/eye_pod.scad Enoch's round eye, on the outside of the pumpkin; one per eye (see Enoch face)
hardware/face_model.scad The shape of the pumpkin's face (from the test strips) and where the eyes sit, shared by the eye pods and the mouth plate
hardware/mouth_pod.scad Enoch's mouth: a pod over the carved grin that holds the LED panel and the teeth (see Enoch face)
stl/ Exported STLs for every printed part, kept in step with the .scad files
hardware/eye_box.scad Old: an eye box behind the carved triangle, replaced by eye_pod.scad (see Eye boxes)
hardware/head_mount.scad The head mount: shoulder yoke, tube joints, swivel, and the peg and fork that turn the pumpkin with your head (see Head mount)
docs/enoch/ The Enoch body: measurements, cut list, fabric costs and silhouette drawings
tools/enoch_silhouette.py Draws those silhouettes to scale, with the wearer inside and the Funko traced over them

Building

PlatformIO lives at ~/.venvs/platformio/bin/pio (on both the Pi and the laptop).

pio run -e teensy41            # firmware, Waveshare ST7789 eyes (default)
pio run -e teensy41_ili9341    # firmware, HiLetgo ILI9341 fallback eyes
pio run -e native              # host preview

Host preview

pio run -e native && .pio/build/native/program preview_out
~/.venvs/platformio/bin/python3 tools/preview_sheet.py preview_out

This writes the following to preview_out/:

  • eye_*.png: one eye at full panel resolution (moods, blink stages, wide, color themes)
  • mouth_open_*.png: the bare LEDs (top) and the view through the diffuser and cutout (bottom), at openings from 0 to 1
  • face_*.png: the whole mask from the front, with the eyes clipped by their cutouts
  • anim/ + talking.gif: 4 s of fake speech run through the real animators
  • sheet_*.png: contact sheets

Deploying to the Teensy

The Teensy plugs into omarchy-laptop (ssh omarchy-laptop). tools/deploy.sh copies the repo there, builds it, reboots the Teensy into its bootloader over USB (no button needed), and flashes it:

tools/deploy.sh --build-only        # compile only (no Teensy needed)
tools/deploy.sh                     # build + flash on the laptop
tools/deploy.sh --monitor           # flash, then open the serial monitor
tools/deploy.sh --env teensy41_ili9341
tools/deploy.sh --pi                # Teensy plugged into deskpi instead

Once the Teensy is in the brain box, plug the laptop into the box's TEENSY port (USB-A→C or C→C cable) instead. The extension carries data, so the box stays closed.

The first write right after the reboot often fails on the laptop ("error writing to Teensy"). The script waits and retries automatically, and it succeeds on the second try. A brand-new board that isn't running Pumking yet needs one press of its button.

One-time setup on whichever machine the Teensy plugs into (needs sudo; already done on omarchy-laptop and deskpi): install PJRC's udev rules so your normal user can flash the board, then replug the Teensy:

sudo curl -fsSL https://www.pjrc.com/teensy/00-teensy.rules -o /etc/udev/rules.d/00-teensy.rules
sudo udevadm control --reload-rules && sudo udevadm trigger

The first flash of a brand-new Teensy may need a press of its program button.

Serial monitor keys:

Key Action
1–5 Demon / Ghost / Robot / Clean / Off
p Next preset
m Next eye mood
q Quiet mode
v Voice meter on/off (mic in, effect out, gate, level 10×/s)
+ / - Volume up / down 1.5 dB, same as the knob (shown in the status line, and saved)
c Switch the mic input between the left and right I2S channel (bench check)
e Eye test pattern
t Mouth wiring test pattern

Every 5 s the firmware prints eye/mouth fps, audio CPU and audio memory.

Controls

Everything is on one knob, on the speaker pod:

Knob Action
Turn Volume up / down, 1.5 dB per click
Press Next voice preset: Demon → Ghost → Robot → Clean → Off. The face changes color with the voice
Double press Next eye mood: normal → angry → happy → sleepy
Hold (0.8 s) Quiet mode on/off (mute, eyes and mouth dark)

A single press acts 0.35 s after you let go (BTN_DOUBLE_MS), because the firmware first waits to see whether a second press follows.

The volume is saved 3 s after you stop turning the knob, and it comes back at the same level after a power cycle. OUTPUT_VOLUME in config.h is only the starting level for a brand-new Teensy. If clockwise turns the volume down, set ENC_REVERSE = true.

Wiring the knob (KY-040-style encoder module, pins CLK, DT, SW, + / VCC, GND): CLK to 15, DT to 16, SW to 17, GND to GND, and VCC to the Teensy's 3.3V pin. Never 5 V: the module's pull-up resistors would put 5 V on the Teensy's pins, which aren't 5 V tolerant. In the mask, each of CLK, DT and SW goes through a 1 kΩ resistor on the pod board (see Speaker pod); on the bench you can leave them out. (A bare EC11 works too: A → 15, B → 16, push → 17, C and the push's other leg → GND.)

Teensy 4.1 pin map

Function Pins
I2S audio (mic + amps share clocks) BCLK 21, LRCLK 20, amp DIN ← OUT1A 7, mic DOUT → IN1 8. INMP441 L/R → GND. The amps are in the speaker pod, through 47 Ω on the brain board.
Left eye TFT (SPI) MOSI 11, SCK 13, CS 10, DC 9, RST 6
Right eye TFT (SPI1, parallel DMA) MOSI1 26, SCK1 27, CS 38, DC 37, RST 36
Eye backlight (optional PWM) 2 → both Waveshare LCD_BL pins. On HiLetgo boards, tie LED to 3.3 V and set PIN_EYE_BACKLIGHT = -1.
Mouth LEDs 14 (Serial3 TX) → 74AHCT125 → 330 Ω → panel DIN, 1000 µF across panel 5 V/GND
Knob (KY-040 module) CLK 15, DT 16, SW 17 (through 1 kΩ on the pod board), VCC → 3.3V, GND

Gotcha: FastLED's WS2812 output disables interrupts and glitches the audio library. The mouth uses WS2812Serial (DMA, non-blocking) on pin 14. Don't switch it to FastLED.

Hardware decisions

Feature Choice Why
Nose Dark mesh Nothing goes behind it any more
Vision A dark mesh panel in the costume at your face level. The pumpkin rides above your head No camera, display or lag, and nothing to fog up
Head mount Printed shoulder yoke + 3/4" EMT post and arm, lazy-susan swivel, peg and fork on a cap brim The weight sits on your shoulders, and the pumpkin turns with your head. See Head mount
Eyes 2× Waveshare 2.8inch Resistive Touch LCD (ST7789, 240×320, SPI; touch unused; fallback HiLetgo ILI9341) The ~2.3×1.7" viewing area covers the ~1.7" inside opening. Each sits in its own eye box, with a foam gasket against the curved shell.
Part connectors GX16-10 aviation sockets on the eye boxes, GX20-10 on the speaker pod Screw collars lock, so cables plug in after the parts are installed and don't pull out. The two sizes can't be swapped by mistake.
Mouth BTF-Lighting 8×32 flexible WS2812B panel Bends along the face curve. ~5 rows show through the 2" opening.
Diffuser Frosted acrylic or 2 layers of parchment, ~½" in front of the LEDs Blends the dots into a glow while keeping rows distinct
Airflow ¼" gaps above/below the panel + 5 V fan + hidden vents near the stem The mouth is the main vent, and the panel blocks most of it
Voice INMP441 I2S mic → Teensy Audio (HPF → granular pitch → bitcrush → waveshaper → ring mod → reverb → noise gate) → 2× MAX98357A → 2× 4 Ω 3 W speakers Wired, no Bluetooth latency

Amazon shopping list

Use these search terms. Check that the seller has good reviews and that the listing names the chip shown here.

Controller + voice

# Search for Qty ~$ Notes
1 "Teensy 4.1 with pins" 1 35–45 Get the pre-soldered pins version. pjrc.com sells it for $35.50 if Amazon is overpriced.
2 "INMP441 I2S microphone module" (3–5 pack) 1 pack 10
3 "MAX98357A I2S amplifier module" (2–3 pack) 1 pack 10
4 "4 ohm 3W speaker 40mm" (2 pack) 1 pack 8
5 "EC11 rotary encoder with switch 20mm shaft" + "6mm knob" 1 pack each 8 The knob, the mask's only control. Get the bare encoder with 5 pins, not the KY-040 board, which is too big for the pod

Face

# Search for Qty ~$ Notes
6 "Waveshare 2.8inch Resistive Touch LCD" (ST7789, 240x320) 2 20–25 ea Fallback: "HiLetgo 2.8 ILI9341 SPI TFT" (~$15 ea)
7 "BTF-LIGHTING WS2812B 8x32 flexible LED matrix" 1 25–30 Fallback: 4 rows of 60/m strip on a curved backer
8 "SN74AHCT125N" (DIP, multi-pack) 1 pack 8 3.3 V → 5 V data level shifter
9 "electrolytic capacitor assortment" + "resistor assortment kit" 1 each 12 Need 2× 1000 µF caps, a 330 Ω, 3× 1 kΩ and 3× 47 Ω resistors
10 "frosted acrylic sheet 1/8 inch" (or "LED diffusion film") 1 10
11 "black speaker grill cloth" 1 8 Nose cover + mouth edges
12 "black EVA foam sheet 2mm" 1 8 Gaskets / light blocking

Power, wiring, comfort

# Search for Qty ~$ Notes
13 Your own power bank (no purchase) 1 0 Needs two USB-C ports and 5V⎓3A on at least one of them; see Power
14 "USB C panel mount power socket 5.1k" (2-wire, with nut) 1 pack 8 The box's 5V port. Must have the 5.1 kΩ CC resistors, or the bank gives 0 V
15 "panel mount USB C female to micro USB male extension" (data, screw ears) 1 9 The box's TEENSY port. Get the shortest one (≤ 20 cm)
16 "22 AWG silicone stranded wire kit" 1 15
17 "heat shrink tubing kit" 1 8
18 "JST SM 3 pin connector pigtail" 1 pack 8 Mates with the mouth panel's own JST-SM input
19 "breadboard jumper wire kit" 1 10
20 "40mm 5V USB fan" 1 10 Anti-fog / cooling

Tools (only if needed): temperature-controlled soldering iron kit ($30), hot glue gun ($10).

Brain box (see Brain box)

# Search for Qty ~$ Notes
23 "M3 heat set inserts" + "M3 screw nut assortment" (incl. countersunk) 1 each 12 26 inserts: 8 for the brain box, 10 for the speaker pod, 4 per eye box. Plus screws for the lids, board and TEENSY port ears, and 8 self-tapping screws for the eye boards
24 "USB C to USB C cable 1m" (2 pack) 1 10 Bank → box. A USB-A→C cable also works
25 "PETG filament 1kg" 1 20 Only if you don't have PETG already; PLA can sag in a warm mask
26 "USB C power meter tester" 1 10 Optional. Shows the bank's voltage and current while you test
27 "70x90mm prototype PCB double sided" 1 pack 8 The brain board. Must have 4 corner holes
28 "JST XH right angle header kit" (3/5 pin) 1 9 Board-edge sockets: 3-pin (MOUTH), 5-pin (MIC)
29 "JST XH pre-crimped cable 3/5 pin 30cm" 1 pack 9 The mic cable (5-pin, under 20 cm)
30 "2x5 IDC right angle shrouded box header" 1 pack 7 EYE L / EYE R / POD sockets
31 "10 pin IDC ribbon cable female 50cm" 3 12 Eye and pod cables, up the head mount from the brain box. Cut one end off each; it goes into a GX plug

Part connectors (see Eye boxes and Speaker pod)

# Search for Qty ~$ Notes
32 "GX16 10 pin aviation connector male female panel mount" 2 pairs 10 Eye boxes. Socket in the box, plug on the eye cable
33 "GX20 10 pin aviation connector male female panel mount" 1 pair 8 Speaker pod. Socket in the rear cover, plug on the pod cable
34 "braided cable sleeve 10mm" 1 7 Bundles the cables up the post and arm

Head mount (see Head mount). Parts 21–22 (the nose camera) are dropped.

# Search for Qty ~$ Notes
35 "3/4 inch EMT conduit 10 ft" 1 10 Hardware store. Crossbar, post and arm. Measure its outside diameter (emt_od)
36 Everbilt 49548 6 in. square lazy susan (Home Depot) 1 8 The swivel. head_mount.scad is set up for this one. For another bearing, measure its hole spacing (bearing_hole_pitch, bearing_top_pitch) and middle opening (bearing_bore)
37 "1/4 inch plywood project panel" 1 8 The seat plate the pumpkin sits on
38 "3/8 inch wood dowel" 1 2 The peg
39 "1 inch nylon webbing 5 yards" + "1 inch side release buckles" + "1 inch tri-glide slides" 1 each 15 Chest strap, 2 underarm straps, optional waist strap
40 "6mm EVA foam sheet" 1 8 Saddle padding
41 "M5 bolt nut assortment" (16 and 40 mm) + "M4 bolts nuts" 1 each 10 14 pinch bolts M5×16, 8 cross bolts M5×40, 4 M4×12 for the bearing, plus one M4×12 set screw for the peg
42 "1 inch worm gear hose clamp" 2 4 The brain box saddle on the post
43 "JST XH pre-crimped cable 3 pin 50cm" 1 pack 8 The mouth cable, up the post
44 "black sheer mesh fabric" 1 8 The face window in the costume
— A baseball cap with a stiff brim, felt pads, zip ties — 0 Things you probably already have

Estimated total: $440–490 with your own power bank (+$30 for PETG and the meter, if needed).

Soldering

You only need one INMP441 and two MAX98357A (one amp per speaker); the rest of each multi-pack are spares. Solder one mic and one amp first, test them, add the second amp and speaker the same way, and leave the spares untouched as backups. The Teensy came with pins, and the 74AHCT125 plugs straight into the breadboard, so bench testing needs just two header strips and two speaker wires.

For the bench (now):

  1. INMP441 mic: solder the 6-pin header (L/R, WS, SCK, SD, VDD, GND). Find the tiny sound hole on the round sensor first, and keep it uncovered and free of solder and flux.
  2. MAX98357A amp: solder the 7-pin header (LRC, BCLK, DIN, GAIN, SD, GND, VIN). For the speaker output, solder in the 2-pin screw terminal if one came with it; otherwise solder two wires to the +/− pads.
  3. Speaker: solder ~15 cm of wire to each tab (red to +), and heat-shrink the joints.

Header technique:

  • Push the long pins into the breadboard, set the module on top, and solder it there. The breadboard holds the pins straight.
  • Tack one pin first, check that the module sits flat, then do the rest.
  • Iron temperature: ~330–350 °C for leaded solder, ~370 °C for lead-free.
  • Heat the pin and the pad together for 1–2 s, then feed in solder. A good joint is a shiny little cone, with no blobs bridging neighbouring pins.
  • Work with ventilation, and wash your hands after handling leaded solder.

For the final build (after the bench tests pass):

  • Keep the I2S wires as short as you can. These are the mic and amp clock/data lines. The mic cable stays under ~20 cm. The amps are in the speaker pod, so the I2S lines also run the length of the pod cable: 47 Ω resistors on the brain board and GND wires on both sides of the clock keep that clean, but bench-test the real cable at full length before building it in (see Speaker pod).
  • Replace the jumpers with soldered wire and heat-shrink every joint. Every part cable plugs into a socket on the brain box, and the eyes and speaker pod have their own locking sockets, so there are no loose pigtails.
  • Solder the mouth panel's 1000 µF capacitor and 330 Ω data resistor at the panel end of the mouth cable.

Bench wiring (breadboard, one stage at a time)

Add one subsystem, flash, test, then move on. The full firmware runs at every stage: parts that aren't connected yet are simply ignored.

Safety:

  • The Teensy 4.1 is 3.3 V logic and not 5 V tolerant. Never connect a 5 V signal to a Teensy pin.
  • Every module shares GND with the Teensy.
  • While USB is plugged in, never feed the 5 V bus into the Teensy's VIN pin.

Stage 0: once. Install the udev rules (see Deploying), then plug the Teensy into omarchy-laptop with a data-capable micro-USB cable.

Stage 1: Teensy alone. Run tools/deploy.sh --monitor. You should see the "Pumking ready" banner, then a status line every 5 s. The orange LED will flicker; that's normal, because pin 13 is also the eye SPI clock.

Stage 2: audio. First solder headers onto one mic and one amp (see Soldering).

INMP441 mic Teensy MAX98357A amp Teensy
VDD 3.3V VIN VIN (USB 5 V is fine on the bench)
GND GND GND GND
L/R GND BCLK 21
WS 20 LRC 20
SCK 21 DIN 7
SD 8 GAIN, SD leave unconnected

Connect the speaker to the amp's + and − terminals, and point it away from the mic. For the second speaker, wire a second amp the same way: its BCLK, LRC and DIN go to the same Teensy pins 21, 20 and 7, its VIN and GND go to power, and GAIN and SD stay unconnected.

  1. Press 4 (Clean) and talk: you should hear yourself.
  2. Press v for the voice meter. Note the rms reading when you're silent and when you talk. Set GATE_OPEN_RMS above the silent reading, and LEVEL_FULL_RMS near your loud speaking level.
  3. Press 1–3 to try Demon, Ghost and Robot.

Stage 3: left eye (Waveshare 2.8inch Resistive Touch LCD).

The pin labels sit between the pins, so it's easy to land one pin off. Count physical pins instead, with the USB end at the top:

LEFT ROW                      RIGHT ROW
 1st  GND                      VIN   ← screen 5V
 2nd  0                        GND   ← screen GND
 3rd  1                        3.3V  ← screen TP_CS
 4th  2   ← LCD_BL             23
 5th  3                        22
 6th  4                        21    (amps BCLK, mic SCK)
 7th  5                        20    (amps LRC, mic WS)
 8th  6   ← LCD_RST            19
 9th  7   (amps DIN)           18
10th  8   (mic SD)             17    (knob push)
11th  9   ← LCD_DC             16    (knob DT)
12th  10  ← LCD_CS             15    (knob CLK)
13th  11  ← MOSI               14    (mouth data)
14th  12                       13    ← SCLK
15th  3.3V                     GND
16th  24                       41
17th  25                       40
18th  26  (right eye MOSI)     39
19th  27  (right eye SCLK)     38    (right eye LCD_CS)
20th  28                       37    (right eye LCD_DC)
21st  29                       36    (right eye LCD_RST)
Screen Teensy
5V VIN (the screen has its own 3.3 V regulator, so not the 3.3V pin)
GND GND
MISO leave unconnected
MOSI 11
SCLK 13
LCD_CS 10
LCD_DC 9
LCD_RST 6
LCD_BL 2
TP_CS 3.3V (keeps the touch chip off the bus)
TP_IRQ leave unconnected

The screen is set up only when the Teensy boots, so unplug and replug the Teensy after wiring it. If the screen stays completely dark, check 5V, GND and LCD_BL. If it lights up but shows no picture, check the data pins against the chart above.

Press e for the test pattern: red, green, blue and white, then corner markers (red top-left, green top-right, blue bottom-left, as seen from the front).

  • If the image is upside down, change EYE_ROTATION (1 ↔ 3).
  • At the default EYE_SPI_HZ of 24 MHz, expect ~14 fps in the status line (it already counts frames for both eyes).
  • If you see garbage or streaks, use shorter jumpers or lower EYE_SPI_HZ.

Stage 4: mouth. Power the panel from the power bank's second USB-C port through the 5V socket (part 14), not from the Teensy.

From To
5V socket VBUS / GND Panel 5 V / GND, with the 1000 µF capacitor across them at the panel (stripe = −)
5V socket GND Teensy GND
74AHCT125 pin 14 (VCC) / pin 7 (GND) 5 V / GND
74AHCT125 pin 1 (1OE) GND
74AHCT125 pin 2 (1A) Teensy 14
74AHCT125 pin 3 (1Y) 330 Ω → panel DIN
74AHCT125 pins 4, 10, 13 (unused OE) 5 V
74AHCT125 pins 5, 9, 12 (unused A) GND

Press t. The LEDs light one at a time along the chain, then three corner markers appear: red top-left, green top-right, blue bottom-left. If the corners are wrong, fix MOUTH_FLIP_X, MOUTH_FLIP_Y or MOUTH_COLUMN_MAJOR in face_geometry.h. Then talk: the mouth should open with your voice.

Stage 5: all together. Talk while the eyes and mouth animate. There should be no crackle, and "audio cpu max" in the status line should stay low.

Stage 6: right eye.

Screen Teensy
5V VIN (shared with the left eye)
GND GND
MISO leave unconnected
MOSI 26
SCLK 27
LCD_CS 38
LCD_DC 37
LCD_RST 36
LCD_BL 2 (shared with the left eye)
TP_CS 3.3V
TP_IRQ leave unconnected

These pins are in the lower half of the Teensy; see the chart in Stage 3.

No firmware change is needed. Press e: the right eye should show the mirror image of the left.

Stage 7: the knob. Wire it as shown under Controls. In the serial monitor:

  • Turning the knob prints volume: … once per click, and the sound gets louder or quieter.
  • A press prints preset: …, a double press prints mood: …, and holding it prints quiet: on / quiet: off.
  • Unplug the Teensy, plug it back in, and check that the status line shows the same volume as before.

Then: fit everything into the mask (gaskets, diffuser spacing, mouth constants, cable runs, fan) and do a 30-minute wear test. Set the volume with the knob, and raise EYE_SPI_HZ (try 40 MHz) once the wiring is short and soldered.

Final wiring (in the mask)

Layout

                 ┌──────── PUMPKIN (above your head) ──────────┐
                 │   [L eye 2.8" TFT]        [R eye 2.8" TFT]  │  ← behind the eye cutouts
                 │   [==== 8×32 LED panel, 12.6" × 3.15" ====] │  ← curved behind the diffuser
                 │   SPEAKER POD under the chin: 2× speakers,  │
                 │   2× MAX98357A, the knob                    │
                 └──────────────────────┬──────────────────────┘
                   seat plate on the swivel (head mount; it turns with your head)
                                        │  EYE L, EYE R, MOUTH, POD cables down the arm + post
                 ┌──────────────────────┴──────────────────────┐
                 │ BRAIN BOX on the post, behind your neck     │── MIC cable ──► INMP441 at your collar
                 │ Teensy 4.1 + 74AHCT125                      │
                 └──────────────────────┬──────────────────────┘
                                        │  2 USB-C cables down your back
                 ┌──────────────────────┴──────────────────────┐
                 │ 1× power bank, 2 USB-C ports (belt/pocket)  │
                 └─────────────────────────────────────────────┘
  • Brain box: the brain board in a 3D-printed box (see Brain box).
    • The board is a 70 × 90 mm prototype PCB. The Teensy sits in the middle on female headers so it can be pulled out.
    • The 74AHCT125 (in a DIP-14 socket) sits next to it. Right-angle sockets line both long edges.
    • Velcro the box onto the box_saddle on the head mount's post, behind your neck. It stays put while the pumpkin turns.
  • Mic: at the front of your collar, near your real mouth, on its short XH cable. If 20 cm doesn't reach from the box, bench-test a 30 cm one before you build it in.
  • Eyes: two Waveshare boards (~3.4" × 2.2" each), each in its own eye box pressed against a foam gasket.
  • Mouth: the flexible 12.6" × 3.15" panel, ~½" behind the diffuser.
  • Speaker pod: both speakers, their amps and the knob, under the pumpkin's chin (see Speaker pod). The sound comes from the pumpkin, well away from the mic. The knob is now above your head, though; if you can't reach it through the costume, move the pod to your chest with plate_strap.
  • Cables to the pumpkin: up the post and the arm, through the swivel's notch and the bearing's middle. Leave a slack loop at the swivel so the pumpkin can turn ±60°.
  • Off the mask: the power bank.

Brain box

hardware/brain_box.scad is a parametric OpenSCAD model with two printed parts, the base and the lid. Every helmet part has its own cable that plugs into a labeled socket on the box, so the helmet goes together and comes apart without soldering.

  • Port end: two USB-C sockets, labeled on the lid.
    • TEENSY: a panel-mount USB-C → micro-USB extension (part 15), plugged into the Teensy. It carries data, so you can also flash through it.
    • 5V: a USB-C power socket (part 14), wired to the 5 V bus.
    • Swapping the two cables is harmless, since both ports just take 5 V.
  • Side walls: right-angle headers soldered on the board edge, poking through windows. Each window has its name engraved above it. See the socket table below.
  • Far end: air vents.
  • Lid: vents over the 5 V bus, plus a 3 mm window over the Teensy's orange LED.
  • Base: room in the port bay for the fallback PD trigger + buck (see Power), and two recesses for 25 mm Velcro dots.

Sockets

Pin 1 is the end with the triangle on the header (the red stripe on ribbon cable).

Socket Wall Header Pins 1 → n Part end of the cable
MOUTH left JST-XH 3 5V, GND, DIN (from '125 1Y) 330 Ω in DIN, 1000 µF across 5V/GND, then JST-SM to the panel. The fan taps 5V/GND here too
EYE L left 2×5 IDC 5V, GND, SCK 13, GND, MOSI 11, DC 9, CS 10, RST 6, BL 2, TP_CS (3.3V) Ribbon → GX16-10 plug, pin n to pin n. The eye box socket is wired to the eye board
EYE R left 2×5 IDC 5V, GND, SCK1 27, GND, MOSI1 26, DC 37, CS 38, RST 36, BL 2, TP_CS (3.3V) Same as EYE L
MIC left JST-XH 5 3V3, GND, WS 20, SCK 21, SD 8 Soldered to the INMP441 (L/R bridged to GND). Keep it under 20 cm
POD right 2×5 IDC 5V, GND, BCLK 21, GND, LRC 20, DIN 7, knob CLK 15, knob DT 16, knob SW 17, 3.3V Ribbon → GX20-10 plug, pin n to pin n. BCLK, LRC and DIN go through 47 Ω on the board. See Speaker pod
  • No cable fits a socket where it could do damage:
    • The XH sockets all have different pin counts. The three IDC sockets (EYE L, EYE R, POD) take the same plug, but swapping any two is harmless: 5V and GND are on the same pins in all three, the knob lines have 1 kΩ at the pod, and pin 10 is the Teensy's 3.3 V in all three. A swapped eye just goes blank or trades images.
    • At the part end, the eyes use GX16 and the pod uses GX20, so an eye cable can't go into the pod.
    • The IDC plugs are keyed.
  • Don't force a plug. A smaller XH plug can be pushed into a larger XH header, off by a pin. That's why MOUTH (the only 5 V XH socket) is at the opposite end of its wall from MIC.
  • Setup order: plug in all the part cables first (both ends, with the GX collars screwed down) and the two USB-C cables last. GX pins touch in any order while the collar turns, so never plug or unplug one while powered. To take it apart, unplug USB-C first. Never plug or unplug MOUTH while powered: the data pin can touch before GND and kill the panel's first LED.

Before printing, measure your parts and set the variables at the top of the file. These matter most:

  • data_port_w/h, data_screw_pitch: the TEENSY extension's opening and ear screw spacing.
  • power_hole_d, power_has_flat: the 5V socket's thread and any anti-rotate flat.
  • board_l/w, board_hole_inset: your prototype board.
  • xh_h, idc_w/h: the right-angle header bodies.
  • connectors: each socket's position along the board edge. Match it to where you soldered the headers.
  • teensy_lift, in_h: the header height and the total inside height.
  • teensy_*, amps_*: where the Teensy and the vented area sit, so the LED window and vents line up.

Render (part="assembly" shows everything with placeholder parts, to check clearances):

openscad -D 'part="base"' -o base.stl hardware/brain_box.scad
openscad -D 'part="lid"'  -o lid.stl  hardware/brain_box.scad

Print in PETG, 0.2 mm layers, 3 walls, no supports. The parts are exported in print orientation.

Assembly:

  1. Solder the right-angle headers flush with the board's long edges, at the connectors positions. Test-fit the bare board in a printed base before soldering anything else, then adjust connectors and reprint if a window is off.
  2. Build the rest of the board.
  3. Melt in the M3 heat-set inserts: 4 lid pillars, 4 board standoffs.
  4. Mount both USB-C sockets. The TEENSY ears take M3 screws with nuts inside.
  5. Solder the 5V socket's wires to the 5 V bus.
  6. Coil the TEENSY extension in the port bay and plug it into the Teensy.
  7. Lower the board in at an angle, sockets first, so the headers drop into their windows. Screw it down (M3×6).
  8. Make one cable per part (see the socket table).
  9. Bench-test (see Power), then fit the lid with M3×8 countersunk screws.

Wire runs (brain box ⇄ part)

Run Signals Cable Box socket
Left eye see Sockets 10-wire IDC ribbon → GX16-10 plug EYE L (2×5 IDC)
Right eye see Sockets 10-wire IDC ribbon → GX16-10 plug EYE R (2×5 IDC)
Mic 3V3, GND, WS 20, SCK 21, SD 8 XH pre-crimped, under 20 cm, from the post to your collar MIC (XH-5)
Mouth panel + fan 5 V, GND, DIN XH pre-crimped 50 cm, then JST-SM at the panel MOUTH (XH-3)
Speaker pod 5 V, GND ×2, I2S (21, 20, 7), knob (15, 16, 17, 3.3 V) 10-wire IDC ribbon → GX20-10 plug (see Speaker pod) POD (2×5 IDC)
5 V power Bank USB-C port → 5 V bus (20 AWG inside the box) USB-C cable 5V (USB-C)
Teensy Bank USB-C port → micro-USB (also used to flash) USB-C cable TEENSY (USB-C)

Totals:

  • 3 IDC ribbon cables (10-wire): one per eye, into a GX16-10 plug, and one for the pod, into a GX20-10 plug.
  • 2 XH cables: 3-pin and 5-pin (and one spare 5-pin, for the mic if you redo it).
  • 1 JST-SM 3-pin pigtail at the mouth panel. The fan splices into this cable.
  • Board headers: 3× right-angle 2×5 IDC, 2× right-angle XH (3, 5), plus two 24-pin female headers for the Teensy.
  • USB-C cables: 2, both from the one power bank to the box.
  • Long runs: the eye, mouth and pod cables now run ~50 cm from the box behind your neck up into the pumpkin. If the eyes streak, lower EYE_SPI_HZ (try 16 MHz). Bench-test the pod cable at full length (see Speaker pod).

Speaker pod

hardware/speaker_pod.scad is one printed bar (about 136 × 48 × 41 mm) that holds everything you hear or touch: both speakers, their two amps and the knob. Inside, it has three bays: speaker, pod board, speaker.

  • Front: a grille over each speaker. The speakers face outward. A ring behind each grille centres its speaker; fix it with hot glue or E6000.
  • Bottom: the knob. The pod board is soldered onto the encoder's pins, so the encoder's nut holds the board too.
  • Rear cover: 6 M3 screws, and the GX20-10 socket, labeled POD. The speaker wires reach the middle bay through a small hole in each divider; seal it with hot glue so each speaker keeps a closed back.
  • Top: 4 M3 inserts that take a mount plate. Both plates use the same screw pattern, so you can move the pod without reprinting it:
    • plate_mask: bolt it under the mask's chin (M3 through the mask with fender washers, or zip ties through the slots), or stick it on with the two Velcro dots.
    • plate_strap: thread 25 mm webbing or a lanyard through both end slots and hang the pod on your chest, with the grille forward and the knob at the bottom.

Feedback: under the pumpkin's chin, the speakers sit well above the mic at your collar. If it still howls, aim the grille further out, raise GATE_OPEN_RMS or turn the knob down. With plate_strap on your chest, the speakers are much closer to the mic, so feedback is more likely.

Pod board

A small prototype board (up to 38 × 32 mm) that carries:

  • both MAX98357A amps
  • the knob's three 1 kΩ resistors
  • the 470–1000 µF capacitor
  • the encoder itself, underneath

Short wires go from the board to the GX20 socket's cups.

 GX20 socket (rear cover)        POD BOARD
 ────────────────────────        ─────────
  1  5V  ───────┬───────────────► amp #1 VIN, amp #2 VIN
                ═ 470–1000 µF (stripe to GND)
  2  GND ───────┴──┬────────────► amp #1 GND, amp #2 GND
  4  GND ──────────┤
                   └────────────► knob module GND
  3  BCLK ──────────────────────► amp #1 BCLK, amp #2 BCLK
  5  LRC  ──────────────────────► amp #1 LRC,  amp #2 LRC
  6  DIN  ──────────────────────► amp #1 DIN,  amp #2 DIN
  7  ─────── 1 kΩ ──────────────► knob module CLK
  8  ─────── 1 kΩ ──────────────► knob module DT
  9  ─────── 1 kΩ ──────────────► knob module SW
  10 3.3V ──────────────────────► knob module VCC (+)   never 5V

 amp #1 OUT+ ──► speaker 1 +      amp #2 OUT+ ──► speaker 2 +
 amp #1 OUT− ──► speaker 1 −      amp #2 OUT− ──► speaker 2 −
 GAIN and SD: not connected on either amp
  • Neither speaker wire is ground. The amp drives OUT+ and OUT− against each other. Never connect a speaker − to GND, and never share one wire between the two speakers.
  • Wire both speakers the same way round (red / + tab to OUT+), so they stay in phase.
  • With SD left unconnected, each amp plays (left + right) / 2. The firmware sends the same voice on both channels.

Pod cable: a 10-wire IDC ribbon (part 31), made like the eye cables. Plug its IDC end into POD on the brain box. Cut the other end, peel the last ~4 cm into single wires, and solder wire n to pin n of the GX20-10 plug (red stripe = pin 1). Slide the sleeve (part 34) over the part that runs outside the mask.

  • The clock: BCLK (pin 3) runs between two GND wires.
  • Power: the amps' 5 V comes through one ribbon wire. At 50 cm, that drops ~0.3 V on loud peaks, which the amps don't mind.

Test the real cable on the bench first. With the amps in the pod, the I2S clock now runs the full cable length, and the mic shares that clock. Before building it in, plug everything together with the cable you'll wear and talk in each voice. If you hear crackle, or the mic sounds wrong, shorten the cable. The 47 Ω resistors on the brain board are in the pod's lines only, not the mic's.

Before printing, measure your parts and set these variables:

  • spk_d and spk_depth: the speaker
  • enc_bushing_d and enc_body_h: the encoder's bushing (M7 on an EC11) and its body height
  • pcb_l, pcb_w, pcb_parts_h: the pod board and its tallest part
  • gx_*: the GX20 socket's sizes

The model refuses to render if the socket body would hit the pod board.

openscad -D 'part="pod"'         -o pod.stl         hardware/speaker_pod.scad
openscad -D 'part="rear"'        -o pod_rear.stl    hardware/speaker_pod.scad
openscad -D 'part="plate_mask"'  -o plate_mask.stl  hardware/speaker_pod.scad
openscad -D 'part="plate_strap"' -o plate_strap.stl hardware/speaker_pod.scad

Print in PETG, as for the brain box. The pod prints grille-down with the open rear up.

Assemble:

  1. Melt in the inserts and glue the speakers in.
  2. Build the pod board on the encoder, then mount the encoder in the bottom wall with its nut.
  3. Thread the speaker wires through the dividers to the amps, and seal the holes.
  4. Mount the GX20 socket in the rear cover and wire it to the board.
  5. Close the rear cover and screw on a plate.

Enoch face

The face is Enoch's (Over the Garden Wall), scaled from the Funko #2548 so his eyes sit 6" apart. Everything mounts on the outside of the pumpkin, through the carved holes, so nothing has to be cut or glued to the shell (glue doesn't hold on its polyethylene). The wall is 0.75" thick at every hole. Print the parts as exported, in PETG, without supports. The STLs are in stl/.

Eyes (hardware/eye_pod.scad, one per eye):

  • Parts: eye_front_l or eye_front_r (black) is a round shell, 110 mm across, that holds the 2.8" eye board. Its window shows the whole screen, with a 2 mm lip around it that holds the screen in. Its back edge follows the face under that eye, so left and right (as you face the pumpkin) differ. eye_ring (tan) is Enoch's rim, 111 mm outside and 11.5 mm wide; glue it into the step around the front's edge, flush with the shell's side. eye_back_l or eye_back_r is the cover, with a triangle plug that fits that eye's carved hole and a coarse thread. Also 4 × eye_spacer, washer_l/washer_r and nut.
  • Assemble: screen into the window, board on the standoffs, a spacer on each board hole, then the cover. Drive 4 M3×16 countersunk self-tapping screws through the cover, spacers and board into the standoffs. Stick a 3 mm foam strip around the shell's back edge.
  • Mount: push the plug through the hole from the front. From inside, slide the washer over the thread and spin the nut down by hand. The eye cable goes through the plug's 10 mm hole as single wires (peel the ribbon apart). Put the GX16 plug and socket inline, inside the pumpkin.
  • Test first: test_plug_l/test_plug_r is just the plug on a thin flange, to check the fit in the hole. Change plug_clear if it's tight or loose. After the first test fit, the key is 0.25" shorter (wall_t = 0.5"), so it stops just short of the inside face and the washer can snug against the wall.

Mouth (hardware/mouth_pod.scad): built like the eyes. A black pod in the shape of Enoch's grin, a nearly straight top that curls up at the corners and a deep round bottom, about 310 × 141 mm, covers the whole carved grin. The white teeth glow in a 176 × 76 mm window in its middle, and a tan ring runs around its outer edge. The front and ring are too big to print whole, so they print as left and right halves:

  • Test first: print mouth_test_teeth in the teeth's white filament, ribs and walls up. It's a 60 mm square of the 0.6 mm diffuser with a tooth line each way, on walls that hold it as far from the LEDs as the real teeth (13.4 mm). Stand it on the lit panel. If the LEDs show as dots, raise diffuse_gap; if it's too dim, try a lighter white. (mouth_test_across and mouth_test_down are the strips that checked the face's shape; that's done.)
  • Front: mouth_front_l and mouth_front_r, black, each standing on its cut face, with a brim and tree supports on the build plate only (for the window's ends and the tip of the skirt). It's a curved face with the window and a recess for the teeth, a skirt back to the pumpkin, a light box behind the window, and 10 screw standoffs. Glue the halves together at the cut faces.
  • Frame: mouth_frame_l and mouth_frame_r, standing on the cut face, brim, no supports. The same outline as the inside of the front. The LED panel lies on it between low ribs, and it's open behind the panel for the wires. It's split 40 mm right of the middle, so the left piece bridges the front's seam. The posts' hex sockets are on its back.
  • Ring: mouth_ring_l and mouth_ring_r, tan, standing on the cut face, brim, tree supports on the build plate. Glue them into the step around the front's edge, flush with its side.
  • Teeth: mouth_teeth, white, flat. It's 0.6 mm thin so the LEDs glow through, with Enoch's tooth lines as ribs that show dark. It bends to the curve. Glue it into the recess around the window, ribs toward the LEDs.
  • LED panel: cut the 8×32 panel down to 18 columns (7.1"), between two columns and on the end away from its input wires. Lay it on the frame between the ribs, LEDs forward. Its wires go through the opening behind it, into the head through the grin.
  • Assemble: set the frame pieces into the front. The light box's walls press the panel onto the frame. Drive 10 M3×12 pan-head self-tapping screws through the frame into the standoffs. Glue the hex ends of the two mouth_posts into the sockets on the frame's back. They're printed standing, so their threads are clean.
  • Mount: stick 6 mm foam around the skirt's back edge; it squashes to 3 mm and takes up the pumpkin's ribs. Push the posts into the smooth ends of the grin. From inside, put a mouth_washer across the grin on each post, then a nut (2 more from eye_pod.scad).

Nose: for now, paint the carved nose triangle black.

The firmware still draws the old carved face (see Software to do).

Eye boxes

Replaced by the Enoch face eye pods; kept for reference.

hardware/eye_box.scad holds one 2.8" eye screen behind its cutout. Print two. The box is about 91 × 81 × 29 mm, plus an ear at each corner.

  • Front: a window over the screen's lit area. Stick a foam gasket (part 12) around it, and press it against the inside of the eye cutout.
  • Back: a flat cover toward your face, held by 4 M3 screws in the corner columns. Nothing sticks out of it.
  • Socket: a GX16-10 in an edge wall, so the plug comes out sideways instead of toward your face. socket_edge puts it in the top wall (the default; the same print works for both eyes), or the left or right wall (seen from behind; print one of each).
  • Ears: bolt each corner through the mask (M3 with a fender washer), or use zip ties through the same holes.

Before printing, measure the eye board and set these variables: board_l/w, board_hole_inset, the screen outline lcd_* and its lit area aa_* (and their offsets, if the screen isn't centred on the board), hdr_xy (where the pin header sits), back_clear (header and wires behind the board), and the GX16 socket's gx_* sizes. If the model says the socket body hits the pin header, move the socket with gx_pos or socket_edge.

openscad -D 'part="front"' -o eye_front.stl hardware/eye_box.scad
openscad -D 'part="back"'  -o eye_back.stl  hardware/eye_box.scad

Print in PETG, front face down and the cover outside face down (as exported), no supports. Assemble:

  1. Melt the M3 inserts into the 4 corner columns.
  2. Mount the GX16 socket, with its nut inside.
  3. Wire the socket's cups to the eye board's pins with short leads, in the same order as the EYE L / EYE R socket (pin 1 = 5V; see Sockets). Leave MISO and TP_IRQ unconnected.
  4. Screw the board onto the standoffs, screen into the window.
  5. Close the cover.

Eye cable: a 10-wire IDC ribbon (part 31) with its plug in EYE L or EYE R. Cut the other end, peel the last ~4 cm into single wires, slide on the GX16 plug's collar and clamp, and solder wire n to pin n (red stripe = pin 1). In the ribbon, the clock (pin 3) runs between two GND wires, which keeps the 24 MHz SPI clean; keep the peeled-apart end short. If the eyes streak, lower EYE_SPI_HZ in config.h.

Head mount

hardware/head_mount.scad carries the pumpkin above your head. The weight sits on your shoulders, and the pumpkin turns when you turn your head. You see out through a dark mesh panel in the costume at face level.

              ┌─────── pumpkin ───────┐
              └──┬─────────────────┬──┘  rim zip-tied to the seat plate (¼" plywood oval)
   seat plate ═══╪═════════════════╪═══
                 │ [bearing]       │ peg (3/8" dowel, under the plate, in front)
                 │ [swivel]        │
     elbow ┌─arm─┘                 ▼
           │                   [fork] on your cap's brim
      post │                   (you)
           │ [box_saddle + brain box]
       tee ┴──── crossbar ─────┐
  [saddle L]               [saddle R]   on your shoulders, foam underneath
      chest strap + one underarm strap per side
  • Yoke: a straight 3/4" EMT crossbar runs behind your neck. Each end goes into a saddle: a curved pad that sits on top of the shoulder, with 6 mm foam glued underneath. Webbing holds it on: one strap across the chest, and one under each arm (front slot → back slot).
  • Post and arm: the tee in the middle of the crossbar holds the upright post. The elbow at the top turns it into a short arm that reaches forward over your head.
  • Swivel: a 6" lazy-susan bearing sits on the swivel at the end of the arm, over the centre of your head. The seat plate screws to the bearing's top, and the pumpkin sits on the plate.
  • Turning: a dowel peg hangs from the plate (peg_mount) down into the fork on your cap's brim. The fork only pushes the peg sideways, so:
    • turning your head turns the pumpkin, with almost no weight on your neck
    • nodding or bobbing just slides the peg up, down, in or out
    • to take it off, duck down and the peg slides out of the fork
  • Tube joints: every tube joint is the same printed socket, a split collar with 2 M5 pinch bolts. Each socket also has one cross hole. Once everything fits, drill through the tube there (5.5 mm) and add an M5×40 bolt, so the joint can't twist or slip.

Before printing, measure your parts and set the variables at the top of the file:

  • emt_od: your conduit (3/4" EMT is about 23.4 mm)
  • bearing_sq, bearing_t, bearing_hole_pitch, bearing_top_pitch, bearing_bore: your bearing (set for the Everbilt 49548)
  • peg_d: your dowel
  • shoulder_r: the curve of your shoulder top, front to back (55 fits most adults)
  • brim_r: your cap brim's curve, side to side
  • bed_max: your printer (set for the Bambu P1S, 256 mm). The largest part is the swivel, ~158 mm square.
for p in fit_test saddle_l saddle_r tee elbow swivel peg_mount fork box_saddle; do
  openscad -D "part=\"$p\"" -o $p.stl hardware/head_mount.scad
done

Print in PETG, no supports. The parts are exported in print orientation.

  • Load-bearing parts (saddles, tee, elbow, swivel): 4 walls, 40 % infill.
  • The rest: 3 walls, 20 %.

Print order, to wear something as soon as possible:

  1. fit_test (small and quick). Slide it onto a scrap of your conduit and your dowel.
    • The tube should slide in by hand and lock when the bolt is tight.
    • The dowel should be snug in the round hole, and loose in the fork slot.
    • If it's off, change fit_clear (tube) or slot_slack (fork) before printing the rest.
  2. tee, elbow, saddle_l, saddle_r: the bare frame
  3. swivel, peg_mount, fork
  4. box_saddle

Cut the tubes (hacksaw or pipe cutter; deburr the ends). Cut each one long first, try it on, then trim:

  • Crossbar (~36 cm): with both saddles on your shoulders, measure between their outer ends and subtract 6 mm.
  • Post (start ~35 cm): when you wear it, the arm should be ~5 cm above the top of your cap.
  • Arm (start ~10 cm): seen from above, the bearing's centre should be over the middle of your head.
  • Peg: from the plate down to the brim's fork, plus ~2 cm, so it stays in the slot when you stand up straight.

Assemble:

  1. Glue 6 mm foam under both saddles. Thread the webbing:
    • Chest strap: between the inner front slots, with a buckle in the middle.
    • Underarm straps: from each outer front slot, under your arm, to that saddle's back slot, with a tri-glide to adjust.
  2. Slide the tee onto the crossbar, then push the crossbar into both saddles. Put in the pinch bolts (nut in the hex pocket), but leave them loose for now.
  3. Add the post, the elbow and the arm, then the swivel. Bolt the bearing's lower plate onto the swivel (M4, with the nuts in the pockets underneath).
  4. Cut the seat plate from ¼" plywood: an oval about 1" bigger than the pumpkin's 11" × 9" bottom opening. Drill:
    • a 30 mm hole in the middle for the cables
    • pairs of holes around the edge for the zip ties that hold the shell Then screw the plate onto the bearing's upper plate (#6 wood screws). Its holes sit outside the swivel pad, so you can drive the screws up from underneath.
  5. Screw the peg_mount under the plate, peg_offset (132 mm) in front of the centre. Push in the dowel and tighten the M4 set screw. Its nut drops into the slot from the top.
  6. Zip-tie the fork onto the cap's brim, close to the crown, with the slot pointing front to back. Line the slot with felt.
  7. Strap the box_saddle to the post, just above the tee, with 2 hose clamps. Velcro the brain box onto it.
  8. Run the cables up the post and the arm in the sleeve (part 34). Lay them into the swivel's side notch and up through the bearing's middle and the plate. Leave a slack loop so the pumpkin can turn ±60°.
  9. Wear it, adjust everything, then tighten the pinch bolts. Drill the cross holes last.

Putting it on:

  1. Put on the cap.
  2. A helper lifts the yoke, with the pumpkin, onto your shoulders.
  3. Buckle the chest strap, then snug the underarm straps.
  4. Duck a little, line the fork up under the peg, and stand up straight. The flared slot guides the peg in.

To take it off, do the same in reverse: duck out of the peg first.

Tuning:

  • The pumpkin rocks: tighten the underarm straps. You can also run a strap from the tee's slot down to your belt.
  • The pumpkin lags behind your head: reduce slot_slack.
  • The peg binds when you tilt your head: increase slot_slack.
  • The post touches the back of your head: increase post_back.
  • The crossbar digs into your neck: make bar_angle more negative, so the crossbar sits lower on your back.
  • The peg hits the swivel when you turn: the model checks this. Keep peg_offset larger than the swivel pad's corners.

Power

The Teensy has its own supply. The screens, the speaker amps, the mouth and the fan all run from a separate 5 V circuit. Both come from one power bank, through two USB-C ports.

Bank USB-C 1 ──► box TEENSY ──micro-USB──► Teensy ──3.3V pin──► mic VDD only

Bank USB-C 2 ──► box 5V ──► 5 V bus ──┬─► POD ─► MAX98357A #1 VIN ─► speaker 1
                                      │        └► MAX98357A #2 VIN ─► speaker 2
                                      │   (470–1000 µF across VIN/GND on the pod board)
                                      ├─► 74AHCT125 pin 14
                                      ├─► mouth panel 5 V (1000 µF at the panel)
                                      ├─► fan
                                      └─► both eye 5V pins (each screen has its own 3.3 V regulator)

All GNDs tied together: 5V socket, Teensy, eyes, mic, both amps, '125, knob
(required, or the LED and screen data won't work)
  • No PD trigger is needed. Every USB-C port gives 5 V without negotiation, but only once the device presents 5.1 kΩ on its CC pins. That's why both box sockets must have the resistors (parts 14 and 15). If a port stays at 0 V with a C-to-C cable, try a USB-A→C cable, or add 5.1 kΩ from each CC pin to GND.

  • Never tie the 5 V bus to the Teensy's VIN. The two sockets stay separate inside the box; only the GNDs join.

  • The eyes run on 5 V. Each screen regulates its own 3.3 V and accepts the Teensy's 3.3 V signals. Leave MISO unconnected: it's the only pin that sends data back. TP_CS goes to the Teensy's 3.3V pin to keep the touch chip quiet.

  • The 5V port needs 5V⎓3A. Worst-case peak draw:

    • mouth, capped at MOUTH_MAX_AMPS = 1.2 A
    • two amps, ~0.5–0.8 A each
    • fan, ~0.1–0.2 A
    • eyes, ~0.2 A

    That worst case is just over 3 A. Real speech peaks are short and the mouth is rarely at full brightness, so the usual draw is ~1.5–2 A. If the eyes glitch or the Teensy resets on loud Demon shouts, turn the volume knob down a click or two.

  • Check your bank's label:

    • It needs 5V⎓3A on a USB-C port. Use that port for 5V.
    • Its combined rating with both ports in use must be at least ~17 W. Many banks drop to 5 V only and share the power when two ports are busy, which is fine.
  • Fallback if the bank only does 5 V at 1.5–2.4 A: put a USB-C PD trigger board set to 9 V behind the 5V socket, and a 5 A buck converter set to 5.1 V. They fit in the box's port bay.

  • Auto-shutoff: the Teensy alone draws only ~100 mA, which some banks treat as "nothing plugged in". Before closing the box, leave everything idle for 2 minutes and check the Teensy port stays on.

  • Plug in the 5V cable first, then TEENSY (or both together).

On the brain board

  • I2S: BCLK 21 → mic SCK, and → 47 Ω → POD pin 3. LRCLK 20 → mic WS, and → 47 Ω → POD pin 5. 7 → 47 Ω → POD pin 6. The resistors sit near the Teensy and only in the POD lines.
  • 74AHCT125: wire it as in Stage 4 of Bench wiring. 1Y goes straight to MOUTH pin 3; the 330 Ω resistor is at the panel end of the cable.
  • Eye sockets: wired per the socket table. 5V from the bus, TP_CS from the Teensy's 3.3V pin, pin 2 (backlight) to both.
  • Knob: POD pins 7, 8, 9 straight to Teensy 15, 16, 17. Their 1 kΩ resistors are on the pod board. POD pin 10 to the Teensy's 3.3V pin, like the eye sockets' pin 10.
  • One GND bus: Teensy, 5 V bus, every socket's GND and the '125.

Still to measure

For the head mount (variables in hardware/head_mount.scad, plus the tube cut lengths):

  • EMT outside diameter (emt_od), and the bearing's hole spacing and middle opening
  • The shoulder curve front-to-back (shoulder_r), and the crossbar length: the distance between the saddles' outer ends while they sit on your shoulders
  • Crossbar → top of your cap, for the post; and crossbar → centre of your head (seen from above), for the arm and post_back
  • The pumpkin's rim around its bottom opening (11" × 9"): flat enough to sit on a plate, or does it need shims?

Software to do (after the hardware)

The face is now Enoch's (see hardware/eye_pod.scad), but the renderer still draws the old carved jack-o'-lantern face. Once the pods are built:

  • Eyes: a round clip instead of the triangle (EYE_TRI_* in lib/face_render/face_geometry.h), filling the pod's window, which now shows the whole screen (65.2 × 46 mm). Pick the look: glossy black with a moving highlight and a faint ember rim, a glowing amber ball, or round flames. Keep the blinks and moods.
  • Mouth: Enoch's grin (see grin_shape() in hardware/mouth_pod.scad) with two rows of cream teeth that part when you talk, instead of the crescent (MOUTH_*). Fit it to the mouth front's window once that's printed.
  • Update the host preview and the README's eye and mouth descriptions to match.