20.4 Implementation
Fabrication and Assembly
The linkage mechanisms were fabricated using a combination of FDM-printed PLA, resin, and laser-cut film. Before full-scale assembly, a single-leg prototype was made and assembled to verify correct actuation. Once we validated the design, we proceeded with the complete fabrication and assembly of the whole system.
The links were produced using a Raise3D FDM printer located in TIW, while the joints were resin-printed and had laser-cut film to form compliant joints. These joints allowed for controlled flexibility without the need for traditional bearings or fasteners. The chassis, also 3D printed, housed the electronics and provided grounding for the legs.
The electronic system included an Arduino, a motor driver, and a battery. Actuation was achieved through a pulley system between the motor and a 6mm shaft that connects to both sides of the robot. Pulley tension could be adjusted via slotted mounts on the chassis for optimal motor alignment. An initial single-sided assembly was completed to test motor performance. When that side was successful, the second side was fabricated and assembled using the same process.
Bill of Materials
Part Name | Function | Source | Properties | Qty | Price Per Unit | Total Price |
|---|---|---|---|---|---|---|
Acrylic | Linkages | TIW | 1/4", 24"x24" | 2 | $27.64 | $55.28 |
PLA | Robot body/motor mounts | TIW | Polylactic Acid, Density=1.24 g/cm³ | 1 | $0.00 | $0.00 |
TPU | Joints | TIW | Thermoplastic Polyurethane, Shore hardness- 60A-90A | 20 | $0.10 | $2.00 |
Motor | Drives the robot | Amazon | Brand FLASH HOBBY | 1 | $19.99 | $19.99 |
Wires | Electrical connection | TIW/RMD | 20-24 guage | 10 | $0.00 | $0.00 |
Clear Resin | Test/Final Joints | TIW | Form Labs Form 4 Clear Resin V5 | 334 mL | $0.30 | $100.2 |
White Resin | Test/Final joints | TIW | Form Labs Form 4 White Resin V5 | 109 mL | $0.30 | $32.7 |
Electronics and Circuitry
The electronic system consists of an Arduino Uno, an L298N motor driver, and a DC motor with an integrated gearbox and wheel, all powered by a 9V battery. The Arduino sends PWM signals to the motor driver to control motor speed via the enable pin, and the initialization pins are controlled by cycling high/low pulses. A common ground is shared between the Arduino and motor driver to maintain proper logic-level referencing for control signals. For mechanical motion, the motor drives a GT2 timing belt with a 1:1 ratio using FDM-printed pulleys.
Software Development
The Arduino code is designed to control both the speed and the on/off state of the DC motor. It interfaces with the L298N motor driver using three digital pins: two for setting motor direction (IN1, IN2) and one PWM pin (ENA) for speed control. The system defaults to a fixed direction and starts with the motor turned off. Users can input serial commands such as "on", "off", or a specific speed percentage like "50%" to control the robot. The code interprets these commands, adjusts the PWM duty cycle accordingly, and provides feedback through the serial monitor. We wanted the speed to be able to be varied so we can test safely, and it allowed us to overcome the breakaway torque of the motor and run it at a lower speed afterward.
// === Pin Definitions ===
const int enaPin = 9; // ENA - Speed control (PWM)
const int in1Pin = 8; // IN1 - Direction control
const int in2Pin = 7; // IN2 - Direction control
void setup() {
Serial.begin(9600);
pinMode(enaPin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
// Set default direction
digitalWrite(in1Pin, HIGH);
digitalWrite(in2Pin, LOW);
analogWrite(enaPin, 0); // Start motor stopped
Serial.println("Type 'on', 'off', or a percentage like '30%':");
}
void loop() {
if (Serial.available() > 0) {
String command = Serial.readStringUntil('\n');
command.trim();
if (command.equalsIgnoreCase("on")) {
analogWrite(enaPin, 255);
Serial.println("Motor ON (100%)");
}
else if (command.equalsIgnoreCase("off")) {
analogWrite(enaPin, 0);
Serial.println("Motor OFF (0%)");
}
else if (command.endsWith("%")) {
command.remove(command.length() - 1); // Remove '%' character
int percent = command.toInt();
percent = constrain(percent, 0, 100);
int pwmValue = map(percent, 0, 100, 0, 255);
analogWrite(enaPin, pwmValue);
Serial.print("Motor set to ");
Serial.print(percent);
Serial.println("% speed.");
}
else {
Serial.println("Invalid command. Use 'on', 'off', or '50%' etc.");
}
}
}