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.
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:
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.
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:
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.
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:
Final BOM Link: Final BOM