Skip to the content
PCBKitNew board
4 layers80 × 60 mmBardsAssistant, the printed circuit board in 3D

A tiny “Vicious Mockery” companion built on an ESP32-S3 DevKitM-1.

Size
80 × 60 mm
Copper layers
4
Thickness
1.6 mm
Parts
77
Nets
92
Pads
291
Tracks, vias
517, 84
Pours
3
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
25 Dec 2025
Updated
3 Nov 2026

Overview

BardsAssistant is an open-source printed circuit board by jaylingelbach, from the jaylingelbach/BardAssistant repository on GitHub. It is a 4-layer board of 80 × 60 mm with 77 parts on 92 nets, routed with 517 tracks and 84 vias.

It is built around the ESP32-S3-MINI-1-N8, TPS63001DRC and MCP73831T-2ACI/OT-HXY, with the USBLC6-2SC6, CC0805KFX7R8BB105 and TS-1088-AR02016 among its other parts. Its parts include 21 capacitors, 19 resistors, 9 diodes, 6 switches and 4 ICs. It belongs with the ESP32 boards of this library.

Main components

12

README

Readme.md

BardAssistant – The Bard’s Assistant (ESP32-S3)

A tiny “Vicious Mockery” companion built on an ESP32-S3 DevKitM-1.

Right now it:

  • Uses buttons to request insults (Random, Next, Prev, Sleep (hold)).
  • Uses a NeoPixel as a simple state indicator:
    • Blue – Booting
    • Green – Idle (ready for button presses)
    • Yellow – Updating (pretending to “do work”)
    • **Magenta ** – Updating
  • Prints insults and status info over Serial (115200 baud).

Planned:

  • Add a Waveshare 2.13" E-Ink screen and render insults + header there.
  • Power stuff / sleep / wake on long-press.

Hardware

Current setup:

  • Board: ESP32-S3 DevKitM-1
  • LED:
    • 1x NeoPixel RGB LED
    • Data pin: GPIO 21
  • Buttons (tactile switches to GND, using INPUT_PULLUP in code):
    • Random: GPIO 4
    • Next: GPIO 5
    • Prev: GPIO 6
    • Sleep: GPIO 7

Planned display (not wired/used yet):

  • Waveshare 2.13" E-Ink Display HAT V4
    • 250x122, SPI, partial refresh
    • Will eventually show:
      • Title screen / logo
      • Current insult text
      • Basic “source” info (Random / Next / Prev)

Firmware Overview

All of this lives in src/main.cpp for now, plus small modules:

  • lib/button/ – debounced button input
  • lib/led/ – NeoPixel status LED

Application States

cpp
enum class ApplicationState { Boot, Idle, Updating };
  • Boot

    • LED: Blue (ledShowBoot())
    • After ~2 seconds, transitions to Idle
  • Idle

    • LED: Green (ledShowIdle())
    • Listens for button taps:
      • Random → start a “Random insult” operation
      • Next → move forward through insult history (or draw new)
      • Prev → move backward through insult history
  • Updating

    • LED: Yellow (ledShowUpdating())
    • Simulates “work” with a small delay (MOCK_WORK_MS)
    • When “done”, applies the insult index and goes back to Idle

Buttons & Events

Buttons are debounced and produce high-level events (from button module):

cpp
enum class ButtonEvent { None, Tap, HoldStart, HoldEnd };
  • Tap → triggers Random / Next / Prev operations while in Idle
  • Sleep:
    • HoldStart is wired to eventually trigger deep sleep (enterSleep()), currently just logs.

Insults, Deck, and History (Serial Only for Now)

  • insults[] – array of const char* insult strings.

  • Deck:

    • Shuffled list of indices, ensures “Random” doesn’t repeat until all have been used.
  • History:

    • Remembers which insults have been shown.
    • Next / Prev navigate the history when possible.
    • Next at the end of history draws a new insult from the deck.

Rendering is currently:

  • renderTitleScreen() – ASCII art + project name on boot (Serial only).
  • renderInsultAtIndex(...) – logs:
    • Which insult index is active
    • The insult text itself
    • Optional context (Random vs Next vs Prev)

Later, these will be redirected to the E-Ink screen instead of (or in addition to) Serial.


PlatformIO – Commands I Keep Forgetting

All commands assume you’re in the project root (where platformio.ini lives).

Build

Generic:

bash
pio run

Specific environment (ESP32-S3 DevKitM-1):

bash
pio run -e esp32-s3-devkitm-1

Upload Firmware

Generic upload for default env:

bash
pio run -t upload

Upload to ESP32-S3 DevKitM-1 explicitly:

bash
pio run -e esp32-s3-devkitm-1 -t upload

Erase Flash

Useful when things get weird or after changing flash layout / partitions:

bash
pio run -e esp32-s3-devkitm-1 -t erase

Then re-upload your firmware.


Clean Build Artifacts

If builds start acting cursed:

bash
pio run -t clean

Serial Monitor

On my Mac / current setup:

bash
pio device monitor -p /dev/cu.usbmodem1101 -b 115200

Generic form:

bash
pio device monitor -p <PORT> -b 115200

Hit Ctrl + C to exit.


Development Notes

  • Buttons are wired to GND and use INPUT_PULLUP:

    • Released → HIGH
    • Pressed → LOW
  • Long-press on Sleep is debounced and recognized.

  • State machine and insult logic are conceptually separate:

    • main.cpp handles:
      • Board setup
      • State transitions
      • Calling “work engine” functions
  • Insult/deck/history logic lives in lib/insults/


Sleep / Wake Behavior

Entering Sleep

  1. Hold the Sleep button to arm sleep mode (LED turns magenta).
  2. Release the button to enter deep sleep.

This "hold to sleep, release to confirm" gesture prevents accidental sleep entry.

Waking Up

  1. Tap or press the Sleep button while asleep — the pin goes LOW and triggers a wake.
  2. The ESP32-S3 boots from reset and runs setup() again.
  3. Optionally, wake reason can be detected via esp_sleep_get_wakeup_cause().

Setup (Fresh Clone)

bash
# Clone
git clone https://github.com/jaylingelbach/BardAssistant.git
cd BardAssistant

# Build (default env)
pio run

# Or build for the ESP32-S3 env explicitly
pio run -e esp32-s3-devkitm-1

# Upload
pio run -e esp32-s3-devkitm-1 -t upload

# Monitor
pio device monitor -p /dev/cu.usbmodem1101 -b 115200

Current display panel being used

  • GxEPD2_213_B74

Parts

77
QtyValueFootprintReferences
111uFCapacitor_SMD:C_0805_2012MetricC7, C8, C11, C12, C13, C15, C16, C17, C18, C19, C20
7TestPointTestPoint:TestPoint_Pad_2.0x2.0mmTP1, TP2, TP3, TP4, TP7, TP8, TP9
6SW_PushButton_Switch_SMD:SW_SPST_TS-1088-xR020SW1, SW2, SW3, SW4, SW5, SW6
510uFCapacitor_SMD:C_0805_2012MetricC1, C5, C6, C21, C22
410KResistor_SMD:R_0805_2012MetricR3, R5, R7, R8
31RResistor_SMD:R_0805_2012MetricR4, R9, R17
3330RResistor_SMD:R_0805_2012MetricR11, R14, R16
35K1Resistor_SMD:R_0805_2012MetricR1, R2, R10
3MBR0530Diode_SMD:D_SOD-123D6, D7, D8
2.1uFCapacitor_SMD:C_0805_2012MetricC2, C4
222RResistor_SMD:R_0805_2012MetricR18, R19
24.7uFCapacitor_SMD:C_0805_2012MetricC9, C10
2470RResistor_SMD:R_0805_2012MetricR12, R13
2ESD9B3.3Diode_SMD:D_SOD-923D3, D4
1100KResistor_SMD:R_0805_2012MetricR6
1100RResistor_SMD:R_0805_2012MetricR15
12.2uHBardAssLibrary:SMNR5040_2R2MT_BAL2
122uFCapacitor_SMD:C_0805_2012MetricC3
168uHInductor_SMD:L_Sunlord_SWPA6045SL1
1AO3401APackage_TO_SOT_SMD:SOT-23Q3
1BLM21PG221Inductor_SMD:L_0805_2012MetricFB1
1Conn_01x24BardAssLibrary:FPC-SMD_KH-FG0.5-H2.0-24PINJ2
1ESP32-S3-MINI-1-N8ESP32-S3-MINI-1-N8:ESP32S3MINI1N8IC1
1GNDTestPoint:TestPoint_Pad_2.0x2.0mmTP5
1JST-PH-2-SMT-RAConnector_JST:JST_PH_S2B-PH-SM4-TB_1x02-1MP_P2.00mm_HorizontalJ3
1LED GreenLED_SMD:LED_0805_2012MetricD9
1LED RedLED_SMD:LED_0805_2012MetricD5
1LOGOLOGOG***
1MCP73831/2Package_TO_SOT_SMD:SOT-23-5U3
1Polyfuse 1AFuse:Fuse_0805_2012MetricF1
1SM1210RGBBardAssLibrary:LED_XL-3227RGB-RFD1
1SS114Diode_SMD:D_SMAD2
1Si1308EDLPackage_TO_SOT_SMD:SOT-323_SC-70Q1
1TPS63001Package_SON:Texas_DRC0010J_ThermalViasU1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U2
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_GCT_USB4110J1

Questions

How big is the BardsAssistant PCB?

It measures 80 × 60 mm and has 4 copper layers, 1.6 mm thick.

What parts does the BardsAssistant use?

77 parts, built around the ESP32-S3-MINI-1-N8, TPS63001DRC, MCP73831T-2ACI/OT-HXY and USBLC6-2SC6. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the BardsAssistant KiCad files?

From the jaylingelbach/BardAssistant repository on GitHub, at the commit this page was made from: the board is KiCad/BardsAssistant/BardsAssistant.kicad_pcb and its schematic KiCad/BardsAssistant/BardsAssistant.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the BardsAssistant design in my own project?

Its repository states no licence, so its author keeps all rights: ask jaylingelbach before reusing the design.

Similar boards

  • 6 layers567.7 × 328.4 mmARX, the printed circuit board in 3D

    ARX

    lwa-project/analog_receiver

    Analog Receiver (ARX) Board

    2,771 parts1
  • 4 layers68.6 × 53.3 mmBDCMotorControlShield, the printed circuit board in 3D

    BDCMotorControlShield

    nunosousa/TelescopeMirrorTester

    This is an application intended to provide useful tools to perform Foucault or Wire testing on reflective telescope mirrors

    98 partsMIT
  • 4 layers68.6 × 53.3 mmRP2350-Eins, the printed circuit board in 3D

    RP2350-Eins

    red-scorp/RP2350-Eins

    RP2350-based board with Arduino Uno footprint

    72 parts5
  • 2 layers95 × 48 mmPrimis FaceTracker, the printed circuit board in 3D

    Primis FaceTracker

    Nieko27/Frame-Workshop

    A repo for all things steam frame hardware.

    50 parts93CERN-OHL-S-2.0
  • 4 layers153 × 48 mmSegway V7, the printed circuit board in 3D

    Segway V7

    jntaimo/2.004-Segway

    78 parts
  • 4 layers176 × 56 mm2.12 Mobile Robot, the printed circuit board in 3D

    2.12 Mobile Robot

    jntaimo/2.12-PCB

    This is the PCB design for the MIT Intro to Robotics class 2.12

    82 parts
  • 4 layers59 × 101 mmEnku mainboard r0.1, the printed circuit board in 3D

    Enku mainboard r0.1

    aliaksei-lameyka/ENKU-Base-reader

    Open enku-mainboard-r0.1.kicadpro with KiCad10.0.7. Matching PCB/root schematic and power.kicadsch, mcuio.kicadsch, epdhv.kicadsch, connectors.kicadsch are canonical.

    127 parts1CERN-OHL-W-2.0
  • 6 layers160 × 100 mmCourant.before colored actual models 20260918T190457, the printed circuit board in 3D

    Courant.before colored actual models 20260918T190457

    KrasForge/Courant

    A 2D finite-difference physical-modeling synthesis engine in structural VHDL: a vibrating membrane/plate/gong solved on FPGA fabric, with a nonlinear chaos term, playable polyphonically over MIDI/CV.

    199 partsMIT