Final Project: JeLamp Expressive Robotic Lamp

My final project, JeLamp, is an expressive robotic desk lamp inspired by Pixar-style lamps, giraffe-like form language, and research on non-anthropomorphic robot behavior. The system combines mechanical motion, light interaction, embedded vision, and a custom carrier PCB to create a lamp that is both functional and emotionally expressive.

Project Overview

What is this project?

This is a robotic arm lamp pet that lives on your desk. It is more than just a light — it behaves like a small living companion. It senses its environment, understands where you need light, and actively points itself toward the right spot. At the same time, it expresses its "mood" and "attention" through movement and light changes.

You can interact with it: when you approach, it turns to face you; when you point at a surface, it recognizes the gesture and directs its beam there; when you have been away for a while, it settles into a resting posture. It responds to touch and gesture commands, reacting the way a small pet would.

Key Features

Who is it for?

Project Concept

I built the project around an ESP32-based controller, serial bus servos, a custom carrier PCB, and custom mechanical parts designed in Fusion 360. The structure is fabricated through 3D printing and laser cutting.

The design direction is a giraffe-like silhouette with approximately 5 degrees of freedom (5-DOF). Besides basic movement, I want to focus on expressive motion quality: smooth transitions, attentive turns, and posture-based interaction.

Research and References

Apple’s ELEGNT research on expressive and functional movement for non-anthropomorphic robots is a key reference for this project. It shows how movement can communicate intent and personality, not only execute tasks.

Apple expressive movement research Apple interaction behavior research

I also studied open-source projects such as LeLamp and other Luxo-inspired robotic lamps. These references are useful for practical mechanism design, servo layout, and reproducible maker workflows.

LeLamp open-source reference LeLamp open-source reference

Modeling and Prototyping

I practiced by reviewing and partially replicating the LeLamp structure to understand joint arrangement and servo requirements. This helped me estimate the number of servos and validate assembly feasibility for my own design.

The final integration work focuses on reliable joint motion, readable wiring, electronics mounting, and a compact PCB that connects the controller, servo bus, NeoPixel lighting, and power system.

Fusion 360 concept model 1 Fusion 360 concept model 2 JeLamp concept rendering

The final project also connects to my system integration plan, including mechanical structure, electronics, wiring, software behavior, packaging, and final testing: Week 16 System Integration Plan.

Final System Architecture

Final Project Electronics: JeLamp Carrier PCB

This section follows my original JeLamp Carrier PCB — Simplified Schematic Instructions file closely, but it is included here as part of the final project integration. The carrier PCB is the main electronics board for JeLamp. Its goal is to build only what the final lamp actually needs: power input, protection, a 5V buck converter, XIAO ESP32-S3 Sense, two servo bus connectors, a NeoPixel connector, and spare expansion pins.

JeLamp carrier PCB system block diagram and 3D view.

JeLamp carrier PCB system block diagram JeLamp carrier PCB 3D view
Total components on PCB: 15
Board size: ~50 x 40 mm

The simplified design has 15 components and does everything JeLamp needs: servo control, NeoPixel lighting, camera/mic/WiFi through the XIAO, and a few spare GPIOs.

PART 1 — Software & Library Setup

Step 1.1 — Install KiCad 8

Download: https://www.kicad.org/download/
Install and launch to verify it works.

Step 1.2 — Download Fab Academy Library

cd ~/Documents/KiCad/
mkdir fab_library && cd fab_library
git clone https://gitlab.fabcloud.org/pub/libraries/electronics/kicad.git

# Result:
# kicad/
#   - fab.kicad_sym       schematic symbols
#   - fab.pretty/         PCB footprints

Step 1.3 — Add Fab Library to KiCad

  1. Symbol Library: Preferences → Manage Symbol Libraries → Global tab → add fab.kicad_sym.
  2. Footprint Library: Preferences → Manage Footprint Libraries → Global tab → add fab.pretty.
  3. Verify in Symbol Editor by searching fab. You should see parts like fab:Res_1206, fab:Cap_1206, and fab:LED_1206.

PART 2 — Create Project

1. File -> New Project
2. Name: "jelamp-carrier-v1"
3. Choose working folder
4. Save

5. Double-click "jelamp-carrier-v1.kicad_sch" to open schematic

6. File -> Page Settings:
   Title:    "JeLamp Carrier Board"
   Revision: "v1.0"
   Date:     today
   -> OK
KiCad page setting for JeLamp carrier board

PART 3 — Draw Schematic (Component by Component)

Keyboard Shortcuts Reference

A = Add symbol          P = Place power symbol
W = Draw wire           L = Place net label
R = Rotate              M = Move
E = Edit properties     C = Copy
Q = No-connect flag     Ctrl+Z = Undo

Schematic Layout Plan

JeLamp carrier schematic section map
We organize into 4 clear sections:

SECTION 1: Power Input + Buck Converter
SECTION 2: XIAO Module + Power Symbols
SECTION 3: NeoPixel Drive + Bypass Caps
SECTION 4: Connectors: Servo, NeoPixel, Expansion

SECTION 1 — Power Input (Top-Left)

Step 3.1 — Place Barrel Jack: Press A, search Conn_01x02 or Barrel_Jack, place it in the top-left area, and set Reference to J1, Value to DC_7-8V.

KiCad add connector symbol search KiCad J1 power input connector

Step 3.2 — Place Polyfuse: Press A, search fab:Res_1206, place it to the right of J1, and set Reference to F1, Value to 3A PTC.

Step 3.3 — Place Reverse Protection Diode: Add fab:Diode or D_Schottky, set Reference to D1, Value to SS34, and label the output VIN_SERVO.

J1 pin1 -> F1 -> D1(A->K) -> VIN_SERVO
J1 pin2 -> GND

Step 3.4 — Place Buck Converter Header: Use a 1x04 header named J6 BUCK_MODULE.

J6 Pin 1 -> VIN_SERVO
J6 Pin 2 -> GND
J6 Pin 3 -> +5V
J6 Pin 4 -> GND

Step 3.5 — Place Output Capacitor for Buck: Add C1 100uF between +5V and GND.

Step 3.6 — Place PWR_FLAG: KiCad needs PWR_FLAG symbols on +5V and GND to pass ERC.

SECTION 2 — XIAO Module (Top-Right)

Step 3.7 — Place XIAO Symbol: Press A, search XIAO, select jelamp_custom:XIAO_ESP32S3_Sense, and set Reference to U1.

XIAO Pin 1  D0/GPIO1  -> SERVO_TX
XIAO Pin 2  D1/GPIO2  -> SERVO_RX
XIAO Pin 3  D2/GPIO3  -> NEO_CTRL
XIAO Pin 14 5V        -> +5V
XIAO Pin 13 GND       -> GND
XIAO Pin 12 3V3       -> +3V3

Step 3.8 — Handle Unused XIAO Pins: GPIO4, GPIO5, GPIO8, and GPIO9 go to the expansion header. Unused pins can receive no-connect flags.

Step 3.9 — Place 3V3 Bypass Capacitor: Add C4 100nF between +3V3 and GND.

SECTION 3 — NeoPixel Drive (Bottom-Left)

WHY NO LEVEL SHIFTER:

The ESP32-S3 outputs 3.3V logic on GPIO pins.
WS2812B NeoPixels spec minimum logic high = 0.7 x VDD.
At 5V power: 0.7 x 5V = 3.5V needed.

In practice, 3.3V direct drive works reliably when:
- LED strip is short
- Wire between PCB and first LED is short
- A 330 ohm series resistor protects the data line

Step 3.10 — Place NeoPixel Series Resistor: Add R2 330 ohm. Connect NEO_CTRL to R2 pin 1 and NEOPIXEL_DATA to R2 pin 2.

Step 3.11 — Place 5V Bypass Capacitor: Add C5 10uF between +5V and GND.

SECTION 4 — Connectors (Bottom-Right)

J2 SERVO_1:
Pin 1 -> GND
Pin 2 -> VIN_SERVO
Pin 3 -> SERVO_DATA

J3 SERVO_2:
Pin 1 -> GND
Pin 2 -> VIN_SERVO
Pin 3 -> SERVO_DATA

J4 NEOPIXEL:
Pin 1 -> +5V
Pin 2 -> NEOPIXEL_DATA
Pin 3 -> GND

J5 EXPANSION:
Pin 1 -> +3V3
Pin 2 -> EXP_GPIO4
Pin 3 -> EXP_GPIO5
Pin 4 -> EXP_GPIO8
Pin 5 -> EXP_GPIO9
Pin 6 -> GND

Step 3.12 — Place Servo Bus Resistor: The STS3215 servos use half-duplex UART. XIAO TX and RX share one data wire. A 1k ohm resistor on TX prevents bus contention.

SERVO_TX -> R1 1k -> SERVO_DATA
SERVO_RX ----------> SERVO_DATA

Step 3.13 — Place NeoPixel Bulk Capacitor: Add C3 470uF/10V near J4. This capacitor is polarized, so mark the positive side clearly.

PART 4 — Complete Schematic Verification

Step 4.1 — Final Schematic Overview

Final schematic view after connecting the power input, XIAO module, servo bus, NeoPixel output, and expansion header.

Final JeLamp carrier PCB schematic
Ref Value Description
U1XIAO ESP32S3Main MCU module
R11k ohmServo bus protection
R2330 ohmNeoPixel data series
C1100uFBuck regulator output
C3470uFNeoPixel bulk cap
C4100nF3V3 rail bypass
C510uF5V rail bypass
D1SS34Reverse polarity protection
F13A PTCOvercurrent protection
J1DC_7-8VBarrel jack / 2-pin input
J2, J3SERVO_1, SERVO_2Servo bus connectors
J4NEOPIXELNeoPixel strip connector
J5EXPANSIONSpare GPIO breakout
J6BUCK_MODULEExternal buck converter pads

Step 4.2 — Visual Check

PATH 1 — Battery to Servos:
J1 -> F1 -> D1 -> VIN_SERVO -> J2 pin2, J3 pin2

PATH 2 — Battery to 5V:
VIN_SERVO -> J6 pin1 -> Buck Module -> J6 pin3 -> +5V

PATH 3 — 5V to XIAO:
+5V -> U1 pin 14

PATH 4 — XIAO to Servos:
U1 pin1 TX -> R1 -> SERVO_DATA -> J2 pin3, J3 pin3
U1 pin2 RX -> SERVO_DATA

PATH 5 — XIAO to NeoPixels:
U1 pin3 -> NEO_CTRL -> R2 -> NEOPIXEL_DATA -> J4 pin2

Step 4.3 — Annotate Components

Menu → Tools → Annotate Schematic → click Annotate. This assigns final R1, R2, C1, C3, etc. numbers.

Step 4.4 — Run ERC

Menu → Inspect → Electrical Rules Checker → Run ERC. Keep fixing until there are 0 errors.

PART 5 — Assign Footprints

Step 5.1 — Open Footprint Assignment

Menu → Tools → Assign Footprints. The window has libraries on the left, components in the center, and available footprints on the right.

Step 5.2 — Assign Each Footprint

Reference Component Footprint
U1XIAO_ESP32S3jelamp_custom:XIAO_ESP32S3_Sense_TH
R1, R21k ohm, 330 ohmfab:R_1206 or fab:Res_1206
C1100uFfab:C_1206 or radial electrolytic
C3470uFCapacitor_THT:CP_Radial_D8.0mm
C4, C5100nF, 10uFfab:C_1206 or fab:Cap_1206
D1SS34fab:D_SMA or Diode_SMD:D_SMA
F13A PTCfab:R_1812
J2, J3, J41x3 headersfab:PinHeader_1x03_P2.54mm
J51x6 expansionfab:PinHeader_1x06_P2.54mm
J61x4 buck padsfab:PinHeader_1x04_P2.54mm

Step 5.3 — Apply and Save

Click Apply, Save Schematic & Continue, then save the schematic.

PART 6 — PCB Layout

Step 6.1 — Transfer to PCB Editor

In Schematic Editor, go to Tools → Update PCB from Schematic, then click Update PCB. All components will appear in a pile with ratsnest lines.

Step 6.2 — Set Board Outline

Layer: Edge.Cuts
Board outline: 50mm x 40mm
Example coordinates:
Start: X = 100, Y = 80
End:   X = 150, Y = 120

Step 6.3 — Set Design Rules

FOR JLCPCB ORDERING:
Minimum track width: 0.25 mm
Minimum clearance:   0.25 mm
Minimum via drill:   0.3 mm
Minimum via diameter: 0.6 mm

FOR FAB LAB MILLING:
Minimum track width: 0.5 mm
Minimum clearance:   0.5 mm
Prefer single-sided, no vias

Step 6.4 — Place Components on Board

JeLamp carrier PCB component placement guide

Front and back PCB views from KiCad after component placement and routing.

JeLamp carrier PCB front view JeLamp carrier PCB back view
STRATEGY:
- Connectors at edges because cables come from outside.
- XIAO near top, with USB-C accessible.
- Power flow: left to right or top to bottom.
- Keep related parts together.

All connectors on bottom edge -> cables route downward.
USB-C on top edge -> programming access.

Step 6.5 — Route Traces

ROUND 1: Power Traces
Select track width: 1.5mm
Route J1 -> F1 -> D1 -> VIN_SERVO
Route VIN_SERVO -> J2 pin2
Route VIN_SERVO -> J3 pin2
Route VIN_SERVO -> J6 pin1

Select track width: 0.8mm
Route J6 pin3 -> +5V
Route +5V -> U1 pin14
Route +5V -> J4 pin1
Route +5V -> C1, C3, C5 positive pads

ROUND 2: Signal Traces
Select track width: 0.4mm
Route U1 pin1 -> R1 -> J2 pin3
Route J2 pin3 -> J3 pin3
Route U1 pin2 -> junction on servo data bus
Route U1 pin3 -> R2 pin1
Route R2 pin2 -> J4 pin2
Route U1 pin4/pin5/pin8/pin9 -> J5 expansion pins

Step 6.6 — Add Ground Pour

1. Select layer F.Cu.
2. Click Add Fill Zone.
3. Net: GND.
4. Clearance: 0.3mm.
5. Pad connections: Thermal relief.
6. Draw the zone around the board.
7. Press B to fill all zones.

Step 6.7 — Add Silkscreen Labels

Near J1: "7-8V DC"
Near J2: "SERVO1" and "G V D"
Near J3: "SERVO2" and "G V D"
Near J4: "NEOPIXEL" and "5V D G"
Near J5: "EXPANSION"
Near J6: "BUCK 5V"
Near U1: "USB up"
Board title: "JELAMP v1.0"

PART 7 — Verify and Check

Step 7.1 — Run DRC

1. Menu -> Inspect -> Design Rules Checker.
2. Click Run DRC.
3. Fix errors:
   - Unconnected -> route the missing trace.
   - Clearance violation -> move trace/pad apart.
   - Track too thin -> widen the trace.
   - Silkscreen over pad -> move text.
4. Repeat until: 0 Errors.

Step 7.2 — Visual Check in 3D Viewer

Check:
- XIAO module fits in its socket area.
- USB-C end reaches board edge.
- All connectors are at board edges.
- No components overlapping.
- Silkscreen text is readable.
- Board looks reasonable.

Step 7.3 — Net Connectivity Check

In PCB Editor, go to Inspect → Board Statistics. Verify unrouted connections are 0 and all components are present.

PART 8 — Generate Manufacturing Files

Option A — For JLCPCB / PCB House

GERBER FILES:
1. File -> Fabrication Outputs -> Gerbers.
2. Output directory: ./production/
3. Check layers:
   F.Cu, B.Cu, F.SilkS, B.SilkS, F.Mask, B.Mask, Edge.Cuts, F.Paste
4. Use Protel filename extensions.
5. Click Plot.

DRILL FILES:
6. Click Generate Drill Files.
7. Format: Excellon.
8. Merge PTH and NPTH.
9. Generate Drill File.

PACKAGE:
10. Select all .gbr and .drl files.
11. ZIP them as "jelamp-v1-gerbers.zip".

Option B — For Fab Lab Milling

1. File -> Plot.
2. Format: SVG.
3. Layer: F.Cu only -> Plot.
4. Plot Edge.Cuts separately.
5. Convert SVG to PNG at 1000 DPI using Inkscape.
6. Use mods.cba.mit.edu for SRM-20 PCB traces and outline.

PART 9 — Soldering Order

SOLDER FROM LOWEST TO TALLEST:
  1. R1, R2 — 1206 resistors. No polarity.
  2. C4, C5 — 1206 ceramic capacitors. No polarity.
  3. D1 — SS34 Schottky diode. Cathode band faces toward output, VIN_SERVO.
  4. F1 — PTC fuse. No polarity.
  5. Female pin headers for XIAO socket. Insert XIAO on the headers first to keep alignment, then solder headers to PCB and remove XIAO after.
  6. J2, J3, J4 — 1x3 pin headers.
  7. J5 — 1x6 pin header.
  8. J6 — 1x4 pin header.
  9. J1 — barrel jack, the tallest through-hole part.
  10. C1 — 100uF electrolytic capacitor. Negative stripe goes to GND.
  11. C3 — 470uF electrolytic capacitor. Negative stripe goes to GND.
  12. Set MP1584 buck module to 5.0V output with a trimpot and multimeter before connecting the XIAO.
  13. Solder wires from buck module to J6 pads.
  14. Plug XIAO into socket. USB-C faces board edge.

PART 10 — Testing

JeLamp carrier PCB testing workflow
TEST 1: Before Powering On
- Visual check: no solder bridges.
- Multimeter continuity:
  +5V to GND should NOT beep.
  VIN_SERVO to GND should NOT beep.
- Check all diode/cap polarities.

TEST 2: Power On Without XIAO
- Connect 7.4V battery/supply to J1.
- Measure J6 pin1: should read ~7.4V.
- Measure J6 pin3: should read ~5.0V.
- Measure U1 pad14 area: should read ~5.0V.
- If anything wrong, power off immediately.

TEST 3: Insert XIAO
- Power off.
- Insert XIAO, USB-C at top.
- Power on, XIAO onboard LED should glow.
- Connect USB-C, it should appear on computer.
- Upload test sketch and blink XIAO onboard LED.

TEST 4: Test Each Output
- Servo test: connect one STS3215 to J2 and run servo sweep.
- NeoPixel test: connect strip to J4 and run rainbow sketch.
- If both work, JeLamp carrier board is complete.

Quick Reference — Complete Net List

VIN_SERVO:
D1 cathode, J2-2, J3-2, J6-1

+5V:
U1-14, J4-1, J6-3, C1+, C3+, C5+

+3V3:
U1-12, C4+, J5-1

GND:
U1-13, J1-2, J2-1, J3-1, J4-3, J5-6, J6-2, J6-4,
C1-, C3-, C4-, C5-

SERVO_TX:
U1-1, R1 pin1

SERVO_RX:
U1-2, SERVO_DATA

SERVO_DATA:
R1 pin2, U1-2, J2-3, J3-3

NEO_CTRL:
U1-3, R2 pin1

NEOPIXEL_DATA:
R2 pin2, J4-2

EXP_GPIO4 / EXP_GPIO5 / EXP_GPIO8 / EXP_GPIO9:
XIAO GPIO pins to J5 expansion header

Final Project Materials

Qty Description Use in Final Project Notes
1 XIAO ESP32-S3 Sense Main controller Provides control, camera, microphone, WiFi, and USB programming.
1 Custom JeLamp carrier PCB Electronics integration board Connects power, servo bus, NeoPixel output, buck converter, and expansion pins.
3 STS3215 serial bus servos Motion system Used for base, arm, and head movement.
1 NeoPixel strip / LED module Expressive lighting Connected through the carrier PCB NeoPixel output.
1 7-8.4V battery or DC power supply Main power source Feeds servo voltage rail and 5V buck converter.
1 MP1584 buck converter module 5V regulation Adjusted to 5.0V before connecting the XIAO.
1 set 3D-printed and laser-cut mechanical parts Lamp body and joints Custom structure for the giraffe-like robotic lamp form.
1 set Wires, headers, capacitors, resistors, diode, fuse, connectors PCB assembly Used to assemble and test the carrier PCB.