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
- Smart lighting: Detects the user's position and automatically adjusts the beam angle for optimal illumination.
- Gesture and touch interaction: Control movement and brightness through touch or simple hand gestures.
- Expressive motion: Pet-like body language — nodding, turning, leaning — communicates the lamp's current state.
- Ambient awareness: Senses surrounding light levels and adapts brightness accordingly to save energy.
- Personality modes: Switchable modes such as Focus, Relaxed, and Sleep that change both motion and light behavior.
Who is it for?
- Desk workers and students: Anyone who spends long hours at a desk and wants smart, adjustable lighting that follows their needs.
- Tech and design enthusiasts: People interested in robot aesthetics and human-machine interaction who want a functional yet playful desktop object.
- People who enjoy companionship: A lamp with a sense of life adds warmth and character to any workspace or room.
- Makers and educators: A hands-on prototype for learning about robotic motion, sensor integration, and interactive product design.
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.
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.
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.
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
- Controller: XIAO ESP32-S3 Sense, used for control, wireless capability, camera, and onboard sensing.
- Custom electronics: JeLamp carrier PCB for power input, protection, buck converter pads, servo bus, NeoPixel output, and expansion GPIOs.
- Actuation: STS3215 serial bus servos for expressive body, arm, and head movement.
- Lighting: NeoPixel / LED output for expressive color feedback and lamp behavior.
- Fabrication: 3D-printed parts and laser-cut structural parts for the lamp body.
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.
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
- Symbol Library: Preferences → Manage Symbol Libraries → Global tab → add
fab.kicad_sym. - Footprint Library: Preferences → Manage Footprint Libraries → Global tab → add
fab.pretty. - Verify in Symbol Editor by searching
fab. You should see parts likefab:Res_1206,fab:Cap_1206, andfab: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
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
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.
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.
| Ref | Value | Description |
|---|---|---|
| U1 | XIAO ESP32S3 | Main MCU module |
| R1 | 1k ohm | Servo bus protection |
| R2 | 330 ohm | NeoPixel data series |
| C1 | 100uF | Buck regulator output |
| C3 | 470uF | NeoPixel bulk cap |
| C4 | 100nF | 3V3 rail bypass |
| C5 | 10uF | 5V rail bypass |
| D1 | SS34 | Reverse polarity protection |
| F1 | 3A PTC | Overcurrent protection |
| J1 | DC_7-8V | Barrel jack / 2-pin input |
| J2, J3 | SERVO_1, SERVO_2 | Servo bus connectors |
| J4 | NEOPIXEL | NeoPixel strip connector |
| J5 | EXPANSION | Spare GPIO breakout |
| J6 | BUCK_MODULE | External 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 |
|---|---|---|
| U1 | XIAO_ESP32S3 | jelamp_custom:XIAO_ESP32S3_Sense_TH |
| R1, R2 | 1k ohm, 330 ohm | fab:R_1206 or fab:Res_1206 |
| C1 | 100uF | fab:C_1206 or radial electrolytic |
| C3 | 470uF | Capacitor_THT:CP_Radial_D8.0mm |
| C4, C5 | 100nF, 10uF | fab:C_1206 or fab:Cap_1206 |
| D1 | SS34 | fab:D_SMA or Diode_SMD:D_SMA |
| F1 | 3A PTC | fab:R_1812 |
| J2, J3, J4 | 1x3 headers | fab:PinHeader_1x03_P2.54mm |
| J5 | 1x6 expansion | fab:PinHeader_1x06_P2.54mm |
| J6 | 1x4 buck pads | fab: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
Front and back PCB views from KiCad after component placement and routing.
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:
- R1, R2 — 1206 resistors. No polarity.
- C4, C5 — 1206 ceramic capacitors. No polarity.
- D1 — SS34 Schottky diode. Cathode band faces toward output,
VIN_SERVO. - F1 — PTC fuse. No polarity.
- Female pin headers for XIAO socket. Insert XIAO on the headers first to keep alignment, then solder headers to PCB and remove XIAO after.
- J2, J3, J4 — 1x3 pin headers.
- J5 — 1x6 pin header.
- J6 — 1x4 pin header.
- J1 — barrel jack, the tallest through-hole part.
- C1 — 100uF electrolytic capacitor. Negative stripe goes to GND.
- C3 — 470uF electrolytic capacitor. Negative stripe goes to GND.
- Set MP1584 buck module to 5.0V output with a trimpot and multimeter before connecting the XIAO.
- Solder wires from buck module to J6 pads.
- Plug XIAO into socket. USB-C faces board edge.
PART 10 — Testing
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. |