8.4 | Fabrication
Finalizing CAD
After our last prototype, we did some thinking and decided to take some inspiration from our very first project and use the steel rails and linear bearings we had lying around in our box for the bottom joint instead of a pin and slot!
Additionally, we started to work on the final model for our oar system.
We added 3D printable threads to one end for easy removal and finalized the clamp design, taking some learnings from the first prototype model to improve it.
We settled on the below design, with a small divot for the pin to rest in, pivoting oars, and threads for the top to screw on to.
We then started to assemble everything into a final CAD with some… less than optimal assemblies initially. We found a few bevel gears from a previous project that we wanted to use so we added those in to reduce space usage.
Finally, we got a semi-functional CAD and got started on the electronics.
Finalizing Electronics
The electronics were needed to turn the motor, and we wanted to include some LED lights on the project to emulate the waves splashing.
We drew up an electronic diagram to make sure we had everything we needed.
In the video we also attached a speaker because we wanted the whole project to be able to turn on with just the flip of a switch, but we elected to just play music during our demo.
Wiring everything up and writing some basic code, we were able to get the motor moving and the LEDS turning on!
Finalizing the code
We worked on the code a little bit after this, implementing an animation for the LEDs.
#include <Adafruit_NeoPixel.h>
#include <math.h>
const int IN1 = 9;
const int IN2 = 10;
const int ENA = 11; // PWM pin
const int LED_PIN = 13;
const int NUM_LEDS = 300;
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
unsigned long lastFrame = 0;
const unsigned long FRAME_MS = 20; // animation speed
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENA, OUTPUT);
strip.begin();
strip.setBrightness(70);
strip.show();
// Motor forward
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 255);
}
void setOceanEffect() {
float t = millis() / 400.0; // faster animation
for (int i = 0; i < NUM_LEDS; i++) {
float x = (float)i / NUM_LEDS;
// Strong wave motion
float wave1 = sin(t + x * 20.0);
float wave2 = sin(t * 1.7 + x * 35.0);
float wave3 = sin(t * 2.3 + x * 60.0);
// Combine waves for chaos
float combined = (wave1 + wave2 + wave3) / 3.0;
// Make contrast sharper (nonlinear boost)
combined = combined * combined * (combined > 0 ? 1 : -1);
// Extreme color mapping (high contrast)
uint8_t r = (uint8_t)(10 + 120 * max(0.0, -combined));
uint8_t g = (uint8_t)(20 + 200 * max(0.0, combined));
uint8_t b = (uint8_t)(50 + 255 * fabs(combined));
strip.setPixelColor(i, strip.Color(r, g, b));
}
strip.show();
}
void loop() {
// Keep motor running forward
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 255);
// Update LED animation
if (millis() - lastFrame >= FRAME_MS) {
lastFrame = millis();
setOceanEffect();
}
}Finalizing the Trireme
As the mechanism grew and changed shape, we redesigned the ship as well, eventually settling on the below (slightly overkill) design.
Assembly
While that was happening, we 3D printed our mechanism, combining our CAD work, manufacturing of new parts, current hardware, and existing electronics to get our final prototype made!
Now, we knew that something would break, and we really wanted to have a reliable demo come Demo Day so we tested it. For 300 cycles.
After 300 cycles we had a bearing pop out. Our press-fits weren’t as sturdy as we wanted them to be. Additionally, there were a few small spacing issues, so we decided to 3D print spacers and got some lock collars to hold everything down in place with the hope that we wouldn’t experience a similar issue on Demo Day.
Presentation
Additionally, we knew we wanted to have as presentable a project as possible, so we designed an electronics box to hold our main components down and hide some wires.
Finally, right before demo day we were having some trouble with the plastic base pieces, so we laser cut a wooden plate to hold everything instead.