Project Development
Timeline
- 08/05/2025- Made a lasercut cardboard mockup of my final project
- 09/05/2025- Made a user flow diagram. I also working and refresh rate of TFT LCD screen
- 10/05/2025- Updated a sketch showing an exploded view of of my final project and how each compenent will be integrated
- 11/05/2025- Started CAD designing that integrated various electronics
- 12/05/2025- Tested kerf bending, dovetail joint for laser cut wooden frame.
- 13/05/2025- Made functional flow diagram, finalised audio system, confirmed pinouts for using ESP32-WROOM 32E, I updated the BOM, arranged the SD card reader in CAD
- 14/05/2025- Checked library compatibility and storage with alternate libraries, completed 70% of CAD design related to arranging of electroics
- 15/05/2025-
- Made changes on electronics placement in CAD based on instructor feedback
- Finalized arrangemnt of speaker and how to connect different boards together
- Changed assembly mechanism to two piece 3d printed housing attached with a lip and 5 mm magnets, decided on making a 2 piece mold using vaccum forming to make buttons for Lumi
- 16/05/2025-
- Completed 80% of CAD for arranging electronics, except servo placement and legs
- 45% of PCB designing for mounting the PCB
- 17/05/2025- TV Driver PCB schematic design completed
- 19/05/2025-
- Master PCB schematic design done
- Made lasercut mockup of mount PCB to confirm placement of screw holes of the TFT display
- 20/05/2025- TV Mount PCB layout design done, 3D model done, Vaccuum forming of potential molds for silicone buttons ended up in failure
- 21/05/2025-Redesign TV Mount PCB with connections for servos, Master PCB layout design is ongoing
- 22/05/2025-
- There are lots of potential problems with using rivets for connections in a double sided PCB, so the Master PCB has to be redesigned to be single sided
- Testing 3D printed standoffs
- Modified TV mount PCB schematic to use 2x5 pin SMD headers to provide two different 3.3V sources (one for the ESP32 and the other for all other electronics) and holes for 3D printed standoffs
- 23/05/2025-TV Mount PCB schematic redesign based on new design constraints
- 24/05/2025-
- Changes in CAD model due to change in choice of speaker and PCB
- Start fresh as Lumi V2; started CAD design of walking mechanism
- 28/05/2025- Completed assembly of the servo legs
- 29/05/2025- Made a basic walk cycle using the Xiao ESP32 C6
- 30/05/2025-
- Was able to integrate servos and TFT onto Xiao ESP32 C6, ended up breaking TFT display and hence had to replace it
- 80% done in programming a basic animation in TFT display, stuck due to a logical error using millis function
- Tested ToF sensor limit at 3.3V and 5V
- A seperate PCB will be required for servos controlled by a Attiny 1614 acting as a node in I2C communication
- PCB design of TV Driver and Servo Legs Driver PCB started
- 31/05/2025- PCB design of Servo Legs Driver done. PCB design of TV Driver completed by 50%
- 01/06/2025- PCB design of TV Driver done
- 02/06/2025- CAD design of TV head completed by 90%
- 03/06/2025- PCB production started
- 05/06/2025- A second PCB for TV Driver PCB milled and produced due to errors in flipping pnouts for the DF Player Mini and TFT display
- 07/06/2025- Due to serious changes in positioning of various elements of the PCB, TV Head had to be redesigned. The position of the TFT display and the Xiao USB C has been corrected
- 10/06/2025-Positioning of buttons, TOF TOF LiDAR sensor, battery charger, mounting screw holes between TV_case and TV_top, locator pin placement, SD card slot placement, hole for FTDI pins of Servo Driver PCB has been corrected, TV_case sent for 3D printing
- 11/06/2025-
- TV lid printed
- Vinyl Wrapper applied
- Mistakes in PCB corrected manually using enamel coated copper wire
- 12/06/2025-Programming started
- 13/06/2025-Minimum programming done.
Time Management
I made multiple attempts at scheduling my work, and I failed most of the time. The biggest reason being I underestimated the time I would required to complete a specific task

You can see my schedule here
Week 18: Assessing Project Progress
This is an assessment of my progress as of 29-05-2025:
-
What tasks have been completed, and what tasks remain?
- Master PCB design ✖
- Mount PCB design ✖
- Master PCB production ✖
- Mount PCB production ✖
- Master PCB production ✖
- CAD Add screw mounts in TV head ✖
- CAD Modify the external design of the TV Head ✖
- Confirm position of servos and add space for wire management for TV head ✖
- Design legs based on Otto reference ✔
- Test TOF TOF LiDAR sensor enclosure ✖
- Program TOF TOF LiDAR sensor ✖
- 3D print enclosure - 50%; Printed legs
- Assemble everything - 30%; Assembled legs
- Move one leg ✖
- Program a forward walk cycle ✖
Because I was struggling to design an integrated PCB and electronics enclosure that is easily dissassemblable for repairing, my instructor advised me to rethink my approach and start with the servo controlled legs. Also I greatly overestimated my speed and efficiency.
-
What's working? what's not?
At this point in time:
- The servos are not rotating 180 degrees completely
- The speakers can be operated using the MAX98357A amplifiers
- Kerf bending cannot be used to make the lasercut enclosure from birchwood without some kind of supporting material to strengthen the wood layer.
- I was not successful in making silicone molds from vacuum forming.
-
What questions need to be resolved?
- Can my robot walk successfully now that I know that the servos cannot rotate complete 180 degrees?
- Can I finish a minimum viable project in time; A TOF TOF LiDAR input, Display anf servo output, and a LiPo battery for charging.
- To simplify my design, I plan to change my microcontroller to a Xiao ESP32 to be able to easily program it without a programmer and to charge it with a LiPo battery.
-
What will happen when?
I am cutting out a lot of features. Right now all I have is a TFT display that can display some emotions, servo legs that help it walk, and a TOF TOF LiDAR input. The microcontroller will likely be a Xiao ESP32. I will be making a new schedule with the deadline of finishing within 6th June 2025
-
What have you learned?
Time management is crucial to successfully complete a project. This is one aspect I need more practice in.
Sketching an Exploded View
10-05-2025: Updated a sketch showing an exploded view of of my final project and how each compenent will be integrated

CAD Design
I made a finalised CAD model of my design that integrates all the electronics. To do this I first arranged all the electronics placement, then went to KiCAD if connections can be made in the desired arrangement, make minor changes, then reintegrate thos changes in the CAD model

Making Mockups in Cardboard
08-05-2025: I lasercut a mockup design of my final project.

To test screw hole placement, I made laser cut mockups of my PCB design

Testing TFT display
09-05-2025: Testing refresh rate of LCD screen to play animations and video footage
PCB Design


I designed two PCBs, the bigger 'mount' PCB that holds the front facing electronics; the LCD display and the switches, along with the battery on the back side. On this PCB, I stacked another doublesided PCB that holds all the internal electronics; including the microcontroller, the buck converter, the amplifer, along with the USB port and the micro SD card reader
I used this schematic that connected the
microSD card directly to their microcontroller. I adapted this for my Use
Question: Will the SD card work without pullup resistors between MOSI, MISO and SCK connections.
After I arranged all the components in Fusion, I projected a sketch of placements into KiCAD and used that as a reference to make my final PCB design, Due to pads and spaces for traces, the design will be slightly modified from original. Once my mount PCB design was done, I exported a CAD model back into Fusion, projected all reference geometries including from the battery, 2x3 pin headers, JST connectors and screw holes and edge cut of mount PCB into a new sketch that I exported as a DXF that I brought once again into KiCAD to repeat the steps.

To make sure I align the male pins and female sockets of both PCBs, I copy and paste PCB layout from PCB mount and line it up on top of my DXF sketch. I then delete all the components apart from the pin sockets and lock it to prevent it from being removed when I update the design. Then I manualluy adjusted the position of the headers by looking at the 3D view to get the best possible alignment. Since the pads are long enough, minor adjustments can be made as long as the header is nearly on top of the sockets






I then modified the Audio Amplifer Pads to be an SMD type

Since I did not find any datasheet for the BEC buck converter except external dimensions, I made an educated guess that since the module mostly likely uses 2.54 mm pitch header pins, the spacing of the holes will also be the same as other components like header pins.




Speaker Testing
I was able to successfully test the functioning of the SD card player with the MAX98357A audio amplifer and the iPhone 6 Plus speaker with the help of Revi's code

Fabrication
I was able to start fabrication and I sorted some issues with the servo leg. I was succesful in fully assembling one pair of servo upper leg and feet


Programming a Walk Cycle
29/05/2025- I was not able to use the <Otto>
library and its example
code due to a problem with the <SoftwareSerial.h>
library. To speed
things up, I used the help of ChatGPT
Prompt 1: Generate Arduino code for 4-servo walking gait based on _execute function logic
Based on your `_execute()` function in Otto's library, here is an adapted Arduino code that uses oscillation for 4 servos to generate a walking gait:
#include <ESP32Servo.h> #include <math.h>
// Create servo objects
Servo R2, R1, L2, L1; // Right Foot, Right Hip, Left Foot, Left Hip
// Define servo pins
int R2pin = D1;
int R1pin = D2;
int L1pin = D3;
int L2pin = D4;
// Oscillation parameters
float amplitude[4] = {30, 30, 20, 20}; // Swing amplitude (degrees)
float offset[4] = {0, 0, 4, -4}; // Neutral position offset
float phase[4] = {0, 0, -PI/2, -PI/2}; // Phase difference (feet lag behind hips)
int T = 1000; // One gait cycle in ms
unsigned long startTime;
void setup() {
Serial.begin(9600);
// Allocate all timers
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
// Set frequency for each servo
R2.setPeriodHertz(50);
R1.setPeriodHertz(50);
L1.setPeriodHertz(50);
L2.setPeriodHertz(50);
// Attach servos to pins
R2.attach(R2pin, 1000, 2000);
R1.attach(R1pin, 1000, 2000);
L1.attach(L1pin, 1000, 2000);
L2.attach(L2pin, 1000, 2000);
// Center all servos at 90°
R2.write(90);
R1.write(90);
L1.write(90);
L2.write(90);
delay(1000); // Give servos time to center
startTime = millis();
}
void loop() {
walkCycle(1.0); // One step
delay(50); // Short delay before repeating
}
// --- Function to oscillate the servos in a step ---
void walkCycle(float steps) {
float t;
float theta[4];
unsigned long currentTime;
while ((millis() - startTime) <= T * steps) {
currentTime = millis();
t = (currentTime - startTime) / float(T);
for (int i = 0; i < 4; i++) {
theta[i] = amplitude[i] * sin(2 * PI * t + phase[i]) + offset[i];
}
// Centered around 90°
L1.write(90 + theta[0]);
R1.write(90 + theta[1]);
L2.write(90 + theta[2]);
R2.write(90 + theta[3]);
}
startTime = millis(); // Reset time for next step
}
- The hips (L1, R1) swing with 30° amplitude, feet (L2, R2) with 20° amplitude.
- Feet lag behind hip swing by 90° phase shift to simulate realistic stepping.
- Each servo oscillates around its center (90°), creating a walking pattern.
- This mimics the Otto _execute() and oscillateServos() logic in a simple standalone sketch.
#include <ESP32Servo.h>
#include <math.h>
// Create servo objects
Servo R2, R1, L2, L1; // Right Foot, Right Hip, Left Foot, Left Hip
// Define servo pins
int R2pin = D1;
int R1pin = D2;
int L1pin = D3;
int L2pin = D4;
// Oscillation parameters
float amplitude[4] = {30, 30, 20, 20}; // Swing amplitude (degrees)
float offset[4] = {0, 0, 4, -4}; // Neutral position offset
float phase[4] = {0, 0, -PI/2, -PI/2}; // Phase difference (feet lag behind hips)
int T = 1000; // One gait cycle in ms
unsigned long startTime;
void setup() {
Serial.begin(9600);
// Allocate all timers
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
// Set frequency for each servo
R2.setPeriodHertz(50);
R1.setPeriodHertz(50);
L1.setPeriodHertz(50);
L2.setPeriodHertz(50);
// Attach servos to pins
R2.attach(R2pin, 1000, 2000);
R1.attach(R1pin, 1000, 2000);
L1.attach(L1pin, 1000, 2000);
L2.attach(L2pin, 1000, 2000);
// Center all servos at 90°
R2.write(90);
R1.write(90);
L1.write(90);
L2.write(90);
delay(1000); // Give servos time to center
startTime = millis();
}
void loop() {
walkCycle(1.0); // One step
delay(50); // Short delay before repeating
}
// --- Function to oscillate the servos in a step ---
void walkCycle(float steps) {
float t;
float theta[4];
unsigned long currentTime;
while ((millis() - startTime) <= T * steps) {
currentTime = millis();
t = (currentTime - startTime) / float(T);
for (int i = 0; i < 4; i++) {
theta[i] = amplitude[i] * sin(2 * PI * t + phase[i]) + offset[i];
}
// Centered around 90°
L1.write(90 + theta[0]);
R1.write(90 + theta[1]);
L2.write(90 + theta[2]);
R2.write(90 + theta[3]);
}
startTime = millis(); // Reset time for next step
}
Conclusion
Notes for the Future
Add Mistakes only in Mistakes and Solutions section to avoid break in flow
References
References to help reader understand in detail
Look at previous year documentation