Newer
Older
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Goal is to create a kitchen appliance that can wash and dry greens and
other vegetables via a pre set cycle both saving time (and potentially water)
## Project description
{: style="height:360px;width:720px"}
{: style="height:300px;width:300px"}
Here is a first cut at the base:

**There are 4 main parts to the appliance**
1. Water reservoir
2. Main container (Wash basin)- base is designed to have a gravity fed drain
3. Lid with build in sprinkler
4. Vegetable holding bowel that sites in the Wash basin and spins to dry
**There are 2 Motor/pump used**
1. Water pump to move water from reservoir to sprinkler head
2. Motor to spin Vegetable bowel
**There are 2 potential sensors**
1. Lid sensor - stop operation if lid is open mid cycle
2. Water level sensor to alert if reservoir is empty
**Microcontroller usage**
1. Control sequencing of pumps / motors
2. Interrupt operation if sensor is triggered
3. Manage GUI
**GUI**
1. Based display and buttons
2. Allow user to start cycle
- Wash only
- Dry only
- Wash/dry
3. Announce alerts (ready/water empty/finished)
Here is a another view of the merging design

## Align parts to Fab Academy weekly topics
| Weekly topics | Parts |
| ----------- | ----------- |
| Computer controlled cutting | Outbox / wash basin holder |
| Electronics production | Controller, motor ESC, Sensors |
| 3D Scanning and printing | Motor housing, water connectors, sprinkler head, sproket/chain for motor drive|
| Electronics design | sensors / controller board / Motor ESC |
| Computer controlled machining | Controller board |
| Embedded programming | Cycle design / User input |
| Molding and casting | Drain / Spinning plate |
| Input devices | GUI buttons / Sensors |
| Output devices | Screen |
Key component breakdown
Outer box - Plexiglass
Wash basin holder - Plexiglass / 3d print
Water reservoir - molding / buying
Electronic housing - 3D print
spinner mechanism - 3D print
Bowel - Molding / casting
Lid - 3D Print
Water pump / sprinkler mechanism - 3D print / electronics
Sensors - 1) Lid sensor 2) Water level sensor
Controller board -
Display/Buttons
Water connections - 3 Print or buy
First I set up some user parameters I will use in sizing the spinning plate and it base


To create the shape of the base I will create a new sketch on the top of the base leg. I then
create a circle and replicate it using the circular pattern tool followed but a cut.

I then sketched on top again and created a circle to create the plate itself

Here I made a mistake as I did not select the whole plate and where the handy timeline
tool come into play

And we are back on track. I wanted to create a downward facing lip in order to provide some water
protection for the spinning mechanism during the dry cycle.
To do this I am going to draw a sketch of the lip and have it rotate around the plate center axis
Start with sketch

Then used the revolve to create the lip and set it to join the plate base.

and there you go a first cut at the base plate


After 5 hours, here it is:
When I put it up to the salad spinner bowel I have it seemed to me that the overall size of the machine \
can be much smaller then I originaly planned.
I think a good approach is the max the size of the plate I can print on the MK3S

The original size had a 320mm diameter but I am going to resize it to a 200mm diameter

I used the scale command leaving the Z as is and scaling the X and Y to 62.5% of the original
Now that I liked that size in order to make every thing work in fusion I had to go back and resize the plate in fusion to match.


Now we are ready to create the bowel holders
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
## Out runner motor mounting
See below for discussion on the motor drive selection and decision to move to a direct drive mount on a outrunner motor. I am used a D3548.

I found a model of the motor I am planning to use on GrabCad

This an out runner and I would like to cut its shape into the bottom of the spinner to test a direct drive
As the CAD was made of many many pieces it was easier to create a similar shaped body. I traced the profile and used the revolved function to create an new body
s


Now I used the combined command to cut this out of the base of the plate for a direct mount

Creating a nice mount for the plate - i also think i do not need the spinner base any more.

I knew there was going to be a lot of stress on this when the plate spins so I filet everything I could to strength the joints.

Got it ready to 3D print

241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
## Bowel holder
Initially I printed a basic arm to get a physical sense of the shape and size

After have a basic shape in the early design I needed to have a pieces that was help in place on the plate.
I started by adding a wedge at the plate level and tweaking the shape but it was very unstable

I decided to use to features to do that.
1) Redesign the base to snugly fit on the shape of the plate


2) Create a threaded rod on the bottom and print a nut that will hold the are in place





<iframe width="560" height="315" src=../../images/Finalproject/Bowlfly.mp4 frameborder="0" allowfullscreen></iframe>
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
## Water skirt and drainage
My plan for water profing the motor and providing a gravity based drainage is to create a sloped rubber base for box with a rasied skirt.
The skirt will go between the motor and the plate lip thus stopping any water for getting into the motor.
I started with a fusion design

Added the drainage slopes

Unfortuntaly my prusa is too small to print the whole things at one so I had to cut it to be printed in parts


Printing in TPU is slow if you do not want stringing It is a 23 hour print !!

Here it is in progress

Fully printed

Printing went well but remove the print from the plate was nearly impossible and ended up destrying the plate.
This did not happen to me in smaller prints I did but after going back and reviewing the Prusa [materials guide](https://help.prusa3d.com/materials#_ga=2.250429327.883239654.1684193727-1420350994.1684193726) as well as reading some user form it seems that I missed the need to either
1) Add a layer of glue stick
2) Put down blue tape the print on
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
1. 12-24V power supply
2. 12-24V / 80W DC Motor
3. 12-24V Motor ESC

The ESC is controlled by a Potentiometer and once I got them connected they all worked well together. When
I turned the knob the motor speed changed.
I want to be able to control the ESC with the microcontroller so I can adjust the speed for the wash and
dry cycles.
First I need to understand how the Potentiometer works with the ESC. There is a plug with power and ground on either side
the middle wire voltage change based on the potentiometer position ranging from 0.5V to 3.6V.


I was not sure how to approach this, my initial plan was to use 2 resistors and some relays to switch between
2 speeds. After reviewing Dr. Gershenfeld class and reflecting on the transistor discussion I came up with the
idea of used a transistor to replace the potentiometer and a capacitor to smooth out the control signal from the
microcontroller.
I ran this by our local instructor Mr. Dubick and my classmate Adam Durrett that have strong electronics background and they
agreed it should work!!!
## Motor control circuit design
I decided the set up the board to control both the motor the spin the Vesgtable Basket as well as the Water pump even
though my focus this week was on the motor.
For each I would have a control signal come in from the micro controller on the main board. I would change the frequency of
the signal the change the speed, putting a capacitor on the line would smooth it and would replace the line in with the
potentiometer.

Not to get things a bit more organized. It is a relatively simple circuit

Not pushed it to the 2B Board and started tracing

## Motor control PCB design
Pushed to the 3D board get ready to mill


When I reviewing the milling it was very tight due to the tracing.



I reviewed the connectors and saw that by switch a few things around I could simplify the tracing
and provide more space between traces to make for easier milling


## Motor control board milling
Now I was ready to mill. I used the same set up with my Genmitsu 3020-Pro-Max from last week [here](https://fabacademy.org/2023/labs/charlotte/students/dan-stone/assignments/week09/#tool-path-set-up)
The tool path looked good

Got to cutting using a 0.8mm end mill


I deburred and washed the board

Now we are ready to stuff and solder

Here are all the components

And we are ready to test

After stripping the connectors on a number of boards and after rethinking the machine design I decided the break this board into
2 one for the motor and one for the pump.
I also increased the side of my traces to 30mil and replace the pad for my connector with A better connector from
the fab library
I started testing the board and it seemed like now matter what I did the Sources and Drain of the transistor was always connected.
I checked for shorts, I added a pull down resistor to ensure the gate is 0 and not joy. The source and drain are connected.
I went back to the lab and got another 2 transisotr (the lab only had 3 of them) and they all seemed to do that same.
I reviewed them with my instructure and fellow student who is an electrical engineer and they could not find why it was
acting this way other then it may be a bad batch of transistors. We put in an order for some more and for now this part
of the project is on hold until the arrive.
While this effort was on hold we completed Machine Building week and that changed my mind on how to set up the motor.
After a success full machine week I got appreciation for the out runner motor capabilities and so I decided to try and mount the plat directly on a out runner motor and see if that work.
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
I had a outrunner motor in the lab that was bigger then the one we used in machine week and I think would work well.
Here is it spec:

I coupled that with a large ESC with the following [user manual](https://www.rcelectricparts.com/classic-esc-user-guide.html#03)
I decided to test the motor using a potentiometer to control the speed so I can find out what are good speeds for my final project.
I set up the mounting bracket on the motor

I used a scrap piece of wood to mount the motor onto the frame

## ESC wiring
Power: The motor will connect directly to the 0-24V power supply I have

ESC control: the ESC will be connect to the BOD via 3 wires: 5V / GND / and PMW from pin 9
## Arduino code for potentiometer control
I wired a potentiometer to analog input A1 and the 5V/GND and ran the following code:
```c
# include <Servo.h>
// create a Servo object to control the ESC
Servo esc;
int potVal;
void setup() {
// set the baud rate for serial communication
Serial.begin(9600);
// attach the ESC to pin 9
esc.attach(9, 1000, 2000); // the second and third parameters are the minimum and maximum pulse widths
int potVal;
esc.write(0); //arm ESP
delay(1000);
}
void loop() {
// set the speed to half of the maximum (which is 180)
potVal = analogRead(A1); // read input from potentiometer.
int speed = map(potVal,0, 1023, 0, 180); // maps potentiometer values to PWM val
// send the speed to the ESC
esc.write(speed);
// print the speed to the serial monitor
Serial.print("Speed: ");
Serial.println(speed);
// pause for a moment before starting again
}
```
This will both printout in the serial monitor the speed variable so I can see the which value I would want to use in the final code.
## First time ESC calibration
When you plug the ESC in for the first time it need to go via a calibration process.
1) You put it to full throttle
2) Connect motor to power
3) Move to zero throttle
You can see the motor first run
<iframe width="560" height="315" src=../../images/Finalproject/ESCcalib.mp4 frameborder="0" allowfullscreen></iframe>
## Motor speed test
I mounted the plate on the motor and ran the motor
<iframe width="560" height="315" src=../../images/Finalproject/spiningplate.mp4 frameborder="0" allowfullscreen></iframe>
I started moving the potentiometer while look at the serial monitor to see the speed.
<iframe width="560" height="315" src=../../images/Finalproject/speed.mp4 frameborder="0" allowfullscreen></iframe>
Answer is pretty straight forward.
The lowest speed that will run is with the Servo Angle value of 24.
A good increased speed for drying is 40.
These will be the two value I will use in the cycles
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
## Code basic set up
To keep this week in sync with my final project I decided to test a set up for the basic VMS functionality
replacing the water pump and motor with LED and the sensors with buttons.
Here is the functionality I was aiming for:
| Button | Label | FUnctionality |
|---|---|---|
| Button 1 | Wash cycle | 1. Check Lid / Water sensor -> 2. Turn on Water pump and motor for a set time |
| Button 2 | Dry cycle | 1. Check Lid -> 2. Turn on motor for a set time |
| Button 3 | Total cycle | 1. Run Wash cycle -> 2. Run Dry cycle |
| Sensors | If either sensor is triggered then stop and turn on error LED | |
Here is my updated code:
```c
// Define the pin numbers for the sensors and actuators
const int LED_PIN = 7;
const int WASH_BUTTON_PIN = 11;
const int DRY_BUTTON_PIN = 10;
const int FULL_BUTTON_PIN = 9;
const int WATER_SENSOR_PIN = 2;
const int LID_SENSOR_PIN = 3;
const int DRUM_PIN = 4;
const int WATER_PUMP_PIN = 5;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(WASH_BUTTON_PIN, INPUT);
pinMode(DRY_BUTTON_PIN, INPUT);
pinMode(FULL_BUTTON_PIN, INPUT);
pinMode(WATER_SENSOR_PIN, INPUT);
pinMode(LID_SENSOR_PIN, INPUT);
pinMode(DRUM_PIN, OUTPUT);
pinMode(WATER_PUMP_PIN, OUTPUT);
}
void loop() {
// Wait for the wash button press
if (digitalRead(WASH_BUTTON_PIN) == HIGH) {
// Check the water level and lid status
if (digitalRead(WATER_SENSOR_PIN) == LOW && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
digitalWrite(DRUM_PIN, HIGH);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(600);
digitalWrite(DRUM_PIN, LOW);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(400);
digitalWrite(WATER_PUMP_PIN, LOW);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
// Wait for the dry button press
if (digitalRead(DRY_BUTTON_PIN) == HIGH) {
// Start the slow spin
if (digitalRead(LID_SENSOR_PIN) == LOW) {
digitalWrite(DRUM_PIN, HIGH);
delay(600);
// Start the fast spin
digitalWrite(DRUM_PIN, LOW);
delay(300);
digitalWrite(DRUM_PIN, HIGH);
delay(300);
digitalWrite(DRUM_PIN, LOW);
} else {
Serial.println("lid is open.");
digitalWrite(LED_PIN, HIGH);
}
}
// Wait for the full cycle button press
if (digitalRead(FULL_BUTTON_PIN) == HIGH) {
// Perform the wash cycle
if (digitalRead(WATER_SENSOR_PIN) == LOW && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
digitalWrite(DRUM_PIN, HIGH);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(600);
digitalWrite(DRUM_PIN, LOW);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(400);
digitalWrite(WATER_PUMP_PIN, LOW);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
return;
}
// Perform the dry cycle
// Start the slow spin
if (digitalRead(LID_SENSOR_PIN) == LOW) {
digitalWrite(DRUM_PIN, HIGH);
delay(200);
// Start the fast spin
digitalWrite(DRUM_PIN, HIGH);
delay(200);
digitalWrite(DRUM_PIN, LOW);
delay(200);
digitalWrite(DRUM_PIN, HIGH);
delay(100);
digitalWrite(DRUM_PIN, LOW);
} else {
Serial.println("Not enough water or lid is open.");
digitalWrite(LED_PIN, HIGH);
return;
}
}}
```
Here is the basic circuit I am planning

I followed this diagram (except for the different colored wires) and it went pretty smoothly
Here is the one I built in action:
<iframe width="560" height="315" src="https://www.youtube.com/embed/PIB-q0JtLqo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
## New board - Moving to RO2040
After a while I decided to move to a working iwht th eRP2040
I am going to follow the same break out board design and so I started to work on a schematic. I am planning to use
4 pin wire to board connectors and 2 pin for the power as an alternative to the USBC.

I have the 2D Board set up

Now we are ready to mill

Here we are in action











761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
I used this board in a number of weeks but decided to redo it so it has a shape of a vegetable
## Button board
To connected the control button, lid sensor and water level sensor I created a break out board.
I started with a basic schematic

I think routed the board and decided to make the board the shape of a carrot.

I had to shorten the carrot so it fit on the PCB I had.

And now it is ready to mill

Here we go

No we just have to clean it up

I got that parts soldered in and set up with the motor.
## Button turning motor
I soldered the wire for the button as well as the 4 pin connector to the button board

803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
## Pump breakout board
I initialy toughts this should be pretty traight forward.
Breakout board would drive a relay with a GPIO from the main board that would be activated but the button push similar to the motor. The relay would connect the pump to the 12V power supply.

I decided to use a mushroom design

got it ready to cut


I misjudged the size and so after overshotting

I redesigned the board


Got it cut

Not it fit

Got it stuffed and soldered

When I pressed the button the motor turned byut instead of the rely switching to turn on the pump nothing happened.
I got out the multimeter and saw that when not connected to the relay the D1 pin went up to 3.3V when I pressed the button but when connected to the relay it only went to 1.8V and the relay did not activate.
I researched this I found out the RP2040 GPIO do not have enough current to drive the relay so I needed to make a driver.
I found this basic driver schematic on the [raspberrypi forum](https://forums.raspberrypi.com//viewtopic.php?t=63578&p=470362#p470625)

I only had through hole components to make this and so decided to make a through hole board for this. I never made one and so was interested to see how it worked.
First I tested it on a breadboard to make sure it worked

Updated the schematic to include the driver.

Retraced everything

Got it ready to mill
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910

Milling took a few attempts as this was the first time I was using the drilling function and I kept setting the Z too low (this is a manual process on my mill) and the drill would break the trace

I got a hang of the calibration needed and we have a board

Added components

Soldered

And we are ready to test

The test showed me that I ended up connected to the Normally open legs of the relay vs. the Normally closed and so the pump ran contently. The mistake was due to my not flipping the components to the other side of the board for the drill through layout.
I ended up cutting that trace with a knife and added a jumper which worked well.

I also redesigned the board and will remill once if needed later

## sensors
**Lid Sensor**
The open lid sensor is a simple mounted switch
I used the M3 T nuts I had to mount the switch directly onto the frame.

I used the casted plastic mushroom I casted from Molding and Casting week as the counter edge on the LID


The wiring is run through the button break out board

And here you can see it in action
<iframe width="560" height="315" src=../../projects/pumpboard/openlid.mp4 frameborder="0" allowfullscreen></iframe>
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
## Final code
Here is the final code once I got all the wiring, pins and sensors locked in
```c
# include <Servo.h>
// Define the pin numbers for the sensors and actuators
const int LED_PIN = 7;
const int WASH_BUTTON_PIN = D6;
const int DRY_BUTTON_PIN = D5;
const int FULL_BUTTON_PIN = D4;
const int WATER_SENSOR_PIN = D3;
const int LID_SENSOR_PIN = D1;
const int DRUM_PIN = D0;
const int WATER_PUMP_PIN = D2;
const int DRUM_SLOW = 24;
const int DRUM_FAST = 30;
const int DRUM_STOP = 0;
int potVal;
Servo esc;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(WASH_BUTTON_PIN, INPUT_PULLUP);
pinMode(DRY_BUTTON_PIN, INPUT_PULLUP);
pinMode(FULL_BUTTON_PIN, INPUT_PULLUP);
pinMode(WATER_SENSOR_PIN, INPUT_PULLUP);
pinMode(LID_SENSOR_PIN, INPUT_PULLUP);
pinMode(DRUM_PIN, OUTPUT);
pinMode(WATER_PUMP_PIN, OUTPUT);
Serial.begin(9600);
esc.attach(DRUM_PIN, 1000, 2000); // the second and third parameters are the minimum and maximum pulse widths
esc.write(DRUM_STOP); //arm ESP
delay(1000);
}
void loop() {
// Wait for the wash button press
if (digitalRead(WASH_BUTTON_PIN) == LOW) {
// Check the water level and lid status
if (digitalRead(WATER_SENSOR_PIN) == HIGH && digitalRead(LID_SENSOR_PIN) == LOW) {
// Start the wash cycle
esc.write(DRUM_SLOW);
Serial.println("wash");
digitalWrite(WATER_PUMP_PIN, HIGH);
delay(800);
esc.write(DRUM_STOP);
digitalWrite(WATER_PUMP_PIN, LOW);
delay(400);
digitalWrite(WATER_PUMP_PIN, HIGH);
esc.write(DRUM_FAST);
delay(800);
digitalWrite(WATER_PUMP_PIN, LOW);
esc.write(DRUM_STOP);
} else {
Serial.println("Not enough water or lid is open.");