Final Project¶
Inspiration¶
I really liked the boston dynamics robot dog and I ever the genius think I can make a smaller verison of it. I also have a really fast dog and I want to understand why she is so fast.
For an overall base of what Im going to build this robot off I found this pervious Fab Final Project which was of a more spiderlike robot
Sketch¶
This week I worked on defining my final project idea and started to getting used to the documentation process. My final project is based off my dog on the front page. She is very fast. So fast that I cant keep up with her, but I wanted to see if I could build something to compete with her. The idea for the project is a robot similar to the boston dynamics dog that uses servos to move its limbs.
This is a rough draft of what I think it will look like
This is just an AI generated design to give a better perscpetive becuase I not a good artist
Midterm Review¶
As a part of the midterm, I planed out the rest of the stuff I needed to do for the final and put together my bill of materials for it.
Bill of Materials¶
Item # | Component | Description | Quantity | Where to Buy |
---|---|---|---|---|
1 | Double-Sided Copper PCB | Blank PCB for custom milling | 1 | Adafruit |
2 | Servo Motor (SG90) | Micro servos | 5 | Amazon |
3 | ESP32-S3 Microcontroller | Main controller board | 1 | Seeed Studio |
4 | PLA Filament | 3D printing material | 1 spool | Polymaker on Amazon |
5 | 5V 5A Power Supply | DC power adapter | 1 | Amazon |
Gantt Chart¶
Planing¶
For this to project to work I went through several design options, the first idea was to make it a remote control dog using a web server as the controller the next was to try and put ai in it to act like a dog you could interact with through a touch sensor, what I landed on though was making simple versions of both that could be swapped out. This way I could do both versions of the dog I wanted to do, without having to make two models. To acomplish this, I used an esp32s3 for the autonoumus/controlable mode where the only thing the person would need to do is upload a diffrent code to swithc between modes. Once I had this idea in mind, I figured out what my biggest issues were. These issues summed up into one category was legs. This included making them, moving them and probably the biggest challenge balance.
Weekly Assignments¶
2D and 3D Modeling¶
Electronic Production¶
Heres what the two sides looked like in Bantam
This is the parts I put into my F cuts, I left the outline out since when I did try to put the edge cuts on the outline, the tracks went over the edge cuts
PCB and Rivets¶
Heres what my board looks like on the front and back
Heres the machine I used to have current flow to the bottom of the board. I used rivets which were in the holes that I had through hole drilled.
These rivets are really small, so I used tweezers to put them into the holes
Interface¶
Learing about interfaces¶
I have already had previous experience using the esp32 web servers since I had used one for a porject in school a few months prior. Heres a link to that experiance. Because of that, I was able to make an interface quickly for controlling a servo. I used my output board to test out my interface.
I decided to make another web server on httml using the esp32c3 on my output board. Heres what the board looked like for refrence:
Heres what the interface looks like:
Code¶
#include <WiFi.h>
#include <ESP32Servo.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
Servo myServo;
const int servoPin = 3; // Servo on GPIO 3
WiFiServer server(80);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.print("Connected. IP: ");
Serial.println(WiFi.localIP());
myServo.setPeriodHertz(50); // Standard 50Hz servo
myServo.attach(servoPin, 500, 2400); // Calibrate for your servo
myServo.write(90); // Start centered
server.begin();
}
void wagTail() {
for (int i = 0; i < 2; i++) {
myServo.write(60); // Move to one side
delay(200);
myServo.write(120); // Move to the other side
delay(200);
}
myServo.write(90); // Return to center
}
void loop() {
WiFiClient client = server.available();
if (client) {
String req = client.readStringUntil('\r');
client.flush();
if (req.indexOf("angle=") != -1) {
int angleIndex = req.indexOf("angle=") + 6;
int angle = req.substring(angleIndex).toInt();
angle = constrain(angle, 0, 180);
myServo.write(angle); // Move servo to mapped angle
}
if (req.indexOf("/wag") != -1) {
wagTail();
}
String html = R"rawliteral(
<html><head>
<style>
body { text-align: center; font-family: sans-serif; }
#joystick {
width: 200px; height: 200px;
border: 2px solid #555;
border-radius: 50%;
margin: 30px auto;
position: relative;
touch-action: none;
}
#stick {
width: 50px; height: 50px;
background: #2196F3;
border-radius: 50%;
position: absolute;
top: 75px; left: 75px;
touch-action: none;
cursor: pointer;
}
button {
padding: 10px 20px;
font-size: 16px;
margin-top: 20px;
}
</style>
</head><body>
<h2>ESP32-C3 Servo Joystick</h2>
<div id="joystick"><div id="stick"></div></div>
<button onclick="fetch('/wag')">🐶 Wag Tail</button>
<script>
const joystick = document.getElementById("joystick");
const stick = document.getElementById("stick");
const radius = 100;
const center = { x: radius, y: radius };
let dragging = false;
function updateStick(clientX, clientY) {
const rect = joystick.getBoundingClientRect();
const dx = clientX - rect.left - center.x;
const dy = clientY - rect.top - center.y;
const dist = Math.min(Math.sqrt(dx * dx + dy * dy), radius - 25);
const angleRad = Math.atan2(dy, dx);
const angle360 = (angleRad * 180 / Math.PI + 360) % 360;
const mapped = Math.round(angle360 / 2); // 360° → 180°
fetch("/?angle=" + mapped);
const x = center.x + dist * Math.cos(angleRad) - 25;
const y = center.y + dist * Math.sin(angleRad) - 25;
stick.style.left = `${x}px`;
stick.style.top = `${y}px`;
}
function resetStick() {
stick.style.left = "75px";
stick.style.top = "75px";
fetch("/?angle=90");
}
// Mouse
stick.addEventListener("mousedown", e => { dragging = true; e.preventDefault(); });
document.addEventListener("mousemove", e => { if (dragging) updateStick(e.clientX, e.clientY); });
document.addEventListener("mouseup", () => { if (dragging) { dragging = false; resetStick(); } });
// Touch
stick.addEventListener("touchstart", e => { dragging = true; e.preventDefault(); });
document.addEventListener("touchmove", e => { if (dragging) updateStick(e.touches[0].clientX, e.touches[0].clientY); });
document.addEventListener("touchend", () => { if (dragging) { dragging = false; resetStick(); } });
</script>
</body></html>
)rawliteral";
client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n");
client.print(html);
client.stop();
}
}
Video¶
Test with Simple Code¶
Final Code Test¶
System Intergration¶
Dog Body Design¶
I used Fusion 360 to design my body since I wanted to laser cut test the body and the parameter button would allow me to use the same design for different material. The first model is very simple, it has 5 holes: two on each long side for the legs and then one in the back for the tail. Besides that everything else is part of my press fit design. I made it about the size of a portable charger since thats how Im currently trying to power my electronics and then about double the width of a portable charger to try and account for the pcb. Heres the fusion design:
And heres the first test cut in cardboard:
After seeing how poorly that came out I decided to switch over to a 3D printed. I used calipers to measure the board and its componets to make a 3 part body. The middle would be where all the electronics would be located. I have places for the servo wires to run where they will end up at a open up part of the body for the servo to move. The top part is the cover for the electronics, it covers up all the running wires and PCB, while also having a jetted out slot for the step responce touch point. The bottom part of the body is the holder for the portable charger thats powering the servos and board. Heres the current design I have:
And heres the pieces printed out:
These parts were to big and confusing so I chose to go for a different design in the end
Board Design¶
This week I also worked on designing my board for the final project. I took what I learned from Output and Machine Week to make the board. It has 4 pinheaders that are 3x1 for the legs and another 3x1 for the tail servo. I also have two pinheaders that are 2x1. One is for the external power supply and the other is for the rx and tx pinouts for the step responce. Finally I have the ESP32C3 as my microcontroller as it gives easy access to a web server and I have been using them for all the weeks up to now.
Heres the schematic view:
Heres the PCB Design
Code¶
Web Server and Remote Control¶
To control the Dog, I made 3 unique walking sequences, 1 for going forward, 1 for going left, and 1 for going right. To go forward, the front leg on one side and the back leg on the other would move forward and then pull back while the other two legs move forward. For the
Step Responce¶
For the input on my board, I wanted to have a way to interact with the dog, the answer to me was a type of touch sensor, origanlly this led to me using an ESP32S3 and using its touch pin, but that felt to simple, so I switched over to the C3 and
Electronics¶
For my project, I wanted to make the dog portable, but I realized that to provide the correct amount of power, I could use the UCB-C port on the ESP32C3. To solve this, I used a trigger module with another USB-C port to provide power to the board. The board houses my ESP32C3, 5 servos, two wires for step responce, a resistor and capacitor. Heres a block diagram of all the wiring:
PCB¶
For my final project I knew that the board needed to be double sided, the issue was that the fab lab had gone through all the double sided pcbs during machine week. My solution was simple, I took a single sided pcb and milled both sides of the board as two different pieces. This meant they were the same size and had the holes in the same place. Once they were both milled this is what they looked like side by side:
After looking at them and test lining them up I was able to see through both holes to the other side. Once that was acomplished, I used hot glue to press the boards together. Afterwards, I soldered a wire through the holes so that the boards were connected. Finally I soldered on the pinheaders for all my external electronics. This is what both sides looked like:
Now that the board was finished I was able to plug in all my servos into the board and the once very messy breadboard filled with wires became this:
Heres a wide view of the servos connected to the board:
I made a new design with large holes in vacant areas of the board for screws so the board is locked into the body of the dog. Heres what the new design looks like:
I made another design later with a surface mount resistor and capacitor for the step responce. Heres the schematic view:
And heres the PCB design:
3D Prints¶
Body¶
After making one press fit moc design and one 3d print moc design, I decided that I would use screws to hold all the componets together, First I designed the upper part of the body that would house the pcb, I used calipers to find the points for where the screws should go and this is what that part looked like, from thier I designed the rest of the body with screw holes on the ends of it for the next part. Heres what the first part looked like:
After the pcb holder was made, I worked on the part bellow that would hold the Trigger Module and Portable Charger. This is where the screw holes on top came into play as they were spaced out far enough so that the power supply could be put snuggly in between the coulums where the screws would go. Their are 5 colums, two on the left, two on the right, one in the back, and in the front is a holster for the Trigger Moudle that doubles as the last part to keep the portable charger in place. Besides that, it has holes in the corners on it to secure the lid ontop of the body. I didnt make anything to hold the servos in at the time but I found a fix later on. Heres what the final design for it looked like:
Finally was the lid which I designed using the size of the protbale charger holder. I then made it 2.4 inches tall to allow room for the electronics. I also added the same screw holes to the same areas where they are. Finally I shelled the rest of the body, and added holes for the servos and this is what it looked like:
Heres what the body looks assembled without the lid:
Other 3D Printed Elements¶
Legs¶
To make the legs, I took a 3d file of a servo, and removed everything except for the gear part and then, I traced it and made a cut. Thankfully it was centered on the middle, so I was able to then design a leg similar to the ones on a Boston Dynamic Dog, and exturde it. Heres what the final file looked like:
After printing the first test leg, I realized that the servo file I had used, had been made around a bigger servo, so I messed with the scaling a bit until I arrived at 80% its origanl size which fit very well. I might even say too well, as I am not able to remove them from the servos anymore. Heres what the final product looked like on a servo:
Servo Holder¶
Something I forgot to acount for when designing the body was how I was going to hold the servos. Looking back at it though, I glad I was able to design the servo holsters seperatly, since it allowed me to make multiples tests before making the final design, I used calipers to make the holder almost press fit so that the servo wouldnt move, and then added extinsions on each sides for screws to put the body together. Heres what the final file looked like:
Heres what the servo holder looked like holding a servo very well:
Tail¶
With having a fifth servo, I needed to design a different
Final Project Requeirements¶
What does it do?¶
Its a quadroped robot that is controled using a web server that can be interacted with through a copper board that has step responce imbeded into it
Who’s done what beforehand?¶
This Fab Final Project by Karam Kharis is similar to mine but he made his more spiderlike as his final product
What did you design?¶
I desgined a pcb where the ESP32C3 would send signals to the servos, the leg attachment on the servos and the body that all of the electornics are put in. The PCB was designed in KiCAD and the Body and Leg were designed in Fusion360
What sources did you use?¶
What materials and components were used?¶
I used a double sided PCB, Bambu PLA and Servos for a majority of the project
Where did they come from?¶
The PLA came from the Bambu Website, the servos came from _ and the Double Sided PCB came from _
How much did they cost?¶
The project curretly will cost $46.44 dollars. This acounts for the board, microcontroller, servos, and power trigger. Since I’m using PLA and Wood thats at the Lab in a unique amount, I dont know how to add that to the cost
What parts and systems were made?¶
What processes were used?¶
I have milled to make the board, an interface to control the robot, addatice manufacuting to make the body and legs along with 3D design to create them.