2.5 - Implementation

2.5 - Implementation

Fabrication and Assembly

Mechanical

For the mechanical aspects of our mechanism, we were able to create every model with SOLIDWORKS, save the outline sketch as a dxf file (example seen in Figure 1), and laser cut every piece of wood and acrylic that we needed in Texas InventionWorks. Due to our earlier calculations and analysis, each of the lengths and sizes of the parts were correctly dimension whenever we went to laser cut the pieces out. We did however need to make test cuts for the press fits for the bearings in both the wood and acrylic. There were a few aspects that we forgot to incorporate into our initial base plate design, such as the holes for the red power button, Arduino bolts, motor controller bolts, and slots for zip ties to hold the wires in place. However, these were relatively easy adjustments to make later to finalize the base plate design.

image-20250501-051349.png
Figure 1: Example dxf file of Base Plate

Once every all of the pieces were laser cut, we just needed to insert the bearings and figure out the heights to set the shaft collars at for each rod, so the links did not make contact with each other as the mechanism was put into motion. After all of the heights were calculated, we assembled and tightened the set screws all by hand with the help of an Allen key sized for the set screws. Additionally, there is an alignment ring (visible in Figure 5) on the bottom side of the base plate that we fit to the pot used for the demonstration that we laser cut and glued to the base plate.

Below is a picture of our final mechanism once fully assembled:

Figure 2: Top View of Final Mechanism

One consideration that we wanted to highlight is the slot for a removable spoon that we considered if this were to become a real product. This would allow for the user to remove, clean, and replace the spoon without disassembling the entire product.

Figure 3: Slot for Spoon Housing

Electronics and Circuitry

For our electronics and circuitry, we utilized a motor controller, 9-Volt battery, 12-Volt motor, button, and Arduino to power the mechanism and control the motion we desired. We utilized the experience we gained with build assignment 2 in order to connect each component with wires and make sure that nothing was drawing too much current.

Below is a wiring diagram of our final circuit:

 

image-20250501-045758.png
Figure 4: Wiring Diagram for Circuitry

In an attempt for wire management, we housed all of our electronics on the bottom side of the base plate. This ensured all of the wires were out of sight for aesthetic purposes, but it also avoided any possible splashing water to damage any of components or wires by chance. Additionally, we bunched the wires and zip tied them in place to keep them organized and minimize any risk of accidentally pulled wires to disconnect components of the circuit.

Figure 5: Wire Management in Final Prototype

Software Development

The main purpose of the inclusion of the Arduino was to control the speeds of the motor with the button. We created an Arduino program that would allow for the motor to be turned on/off and set to 5 different speeds with each successive push of the button. These speeds help the user vary the stirring power depending on the viscosity of the object they are stirring.

 

To overcome the motor’s static friction, the code first delivers a “kick” at a PWM duty cycle of 150PWM (range of 0-255 PWM), using the constant pwmKick. That initial ‘motor kick’ runs at 150 PWM for 300 ms, then the motor switches to one of five PWM speed values. These are the different speeds mentioned earlier.

 

Below is the Arduino Code that we used to operate our mechanism:

 

#define enA       9 #define in1       3 #define in2       4 #define in3       5 #define in4       6 #define enB      10 const int  buttonPin      = A3; int        buttonState    = HIGH; int        lastButtonRead = HIGH; unsigned long lastDebounceTime = 0; const unsigned long debounceDelay = 50; // six stages: low, med, med-high, high, max, off const int  pwmLevels[5]  = {0, 120, 155, 205, 255}; const int  pwmKick       = 150;     // stiction-overcome duty const uint16_t kickTime  = 300;     // ms to hold kick int        stage         = 0; void setup() {   pinMode(enA, OUTPUT);   pinMode(in1, OUTPUT);   pinMode(in2, OUTPUT);   pinMode(in3, OUTPUT);   pinMode(in4, OUTPUT);   pinMode(enB, OUTPUT);   pinMode(buttonPin, INPUT_PULLUP);   Serial.begin(9600);   // forward direction   digitalWrite(in3, LOW);   digitalWrite(in4, HIGH); } void loop() {   int raw = digitalRead(buttonPin);   if (raw != lastButtonRead) {     lastDebounceTime = millis();   }   if (millis() - lastDebounceTime > debounceDelay) {     if (raw != buttonState) {       buttonState = raw;       if (buttonState == LOW) {         stage = (stage + 1) % 6;         // if low-speed stage, give it a quick high-PWM kick         if (stage == 0) {           analogWrite(enB, pwmKick);           delay(kickTime);         }         // then set to the steady PWM         analogWrite(enB, pwmLevels[stage]);         Serial.print("Stage ");         Serial.print(stage+1);         Serial.print(": PWM = ");         Serial.println(pwmLevels[stage]);       }     }   }   lastButtonRead = raw; }

 

Final Bill of Materials (BOM)

Finally, we created a bill of materials to keep track of what we purchased, the price, and source.

Below is an image and a link to our BOM:

image-20250501-035343.png
Figure 6: Final BOM

Final BOM Link: Final BOM

Previous Page: Kinematic Analysis

Next Page: Final Demonstration