ShooBot-Automated Cat Litter System¶
Shoobot is an automated cat litter solution that takes the hassle out of maintaining your feline friend’s toilet space. Designed with the well-being of both cats and their owners in mind, Shoobot utilizes wooden pellets made from compressed sawdust, effectively managing moisture and odor control. This innovative self-cleaning litter box not only ensures a fresh and clean environment for the cat but also simplifies the cleanup process for the human. Shoobot employs a combination of DC and servo motors to swiftly remove cat waste into a separate waste bin, activated by a motion sensor that detects when the cat has finished using the box. With its dual-level design, fresh litter sits on the upper level, while waste collects in the lower level, making disposal a breeze. Say goodbye to the daily chore of scooping and experience the convenience and hygiene of Shoobot - the solution for your cat’s litter needs.
“Shoo” or ശൂ (Susu in Hindi) is a colloquial term used in malayalam for Urine, mostly as a sweet word to talk about urine to kids. So I decided to call my project ShooBot.
Presentation¶
Files¶
All the project files can be found here
2D and 3D Modeling¶
Electronics Design¶
Making Process¶
I used various Additive and Subtractive processes in making the ShooBot. It was fun to learn all these.
PCB Milling using Roland Modela MDX 20¶
Wood Cutting using Shopbot¶
Cutting details are documented in Assignment 8
Finishing using Power tools¶
Various saws and drills were used to finish the box
Logo Cutting using Trotec 100 Laser Machine¶
Laser cutting was used in making the wooden logo of the ShooBot.
Materials used¶
NO | ITEM | PRICE | QNTY |
TOTAL PRICE |
SOURCE |
1 | ATMega328 Microcontroller | 200 | 1 | 200 | Lab Inventory |
2 | XTAL Resonator | 1 | Lab Inventory | ||
3 | A4988 Stepper Motor Driver | 2 | Lab Inventory | ||
4 | Voltage Regulator | 1 | Lab Inventory | ||
5 | HCSR04 Ultrasonic Sensor | 1 | Lab Inventory | ||
6 | Resistor 499 Ohm | 1 | Lab Inventory | ||
7 | Resistor 0 Ohm | 1 | Lab Inventory | ||
8 | Resistor 10 Kilo Ohm | 1 | Lab Inventory | ||
9 | LED | 1 | Lab Inventory | ||
10 | Stepper Motor | 2 | Lab Inventory | ||
11 | Servo Motor | 2 | Lab Inventory | ||
12 | Pcb board | 1 | Lab Inventory | ||
13 | LED Strip | 50 | 4 mtr | 200 | Matha Electricals |
14 | Header pins | 20 | Lab Inventory | ||
15 | Smooth Rod | 2 | Lab Inventory | ||
16 | Threaded Rod | 2 | Lab Inventory | ||
17 | Wires | 2 mtr | Lab Inventory | ||
18 | Nut and Bolt | 25 | Lab Inventory | ||
19 | PLA for 3D printing | 100gm | Lab Inventory | ||
20 | Plywood Sheet(12mm, 8x4) | 1 | Lab Inventory | ||
21 | Plywood piece(3mm,10cmX10cm) | 1 | Lab Inventory | ||
22 | Perforated Sheet | 270 | 1 mtr | 270 | Broadway |
23 | GI Wire | 10 | 2 mtr | 20 | Broadway |
24 | Brass Wire | 100 | 1 mtr | 100 | Broadway |
25 | PVC Pipe(½ inch) | 15 | 2 mtr | 30 | Broadway |
26 | Fevicol Gum | 200 | 1 | 200 | Broadway |
27 | Fabric Paint | 340 | 1 | 340 | Broadway |
28 | Aerosol Can Spray Paint | 250 | 1 | 250 | Home |
29 | Paint Brush | 50 | 1 | 50 | Broadway |
30 | Wooden Pellet | 25 | 1 kg | 25 | Home |
Programming¶
#include <SoftwareSerial.h> #include <Servo.h> #define TO_MM(X) X*50 //Ultrasonic #define ECHO 3 #define TRIGGER 4 //servo #define SERVO_L 9 #define SERVO_R 10 #define UP 1 #define DOWN 0 //Stepper #define STEPPER_STEP 5 #define STEPPER_DIR 7 #define MS1 A2 #define MS2 A1 #define MS3 A0 #define FORWARD 1 #define BACKWARD 0 SoftwareSerial mySerial(1, 0); Servo servol; Servo servor; int now = 90; void setup() { mySerial.begin(9600); mySerial.println("Start"); //Ultrasonic pinMode(TRIGGER, OUTPUT); pinMode(ECHO, INPUT); //Servo pinMode(SERVO_L, OUTPUT); pinMode(SERVO_R, OUTPUT); servol.attach(SERVO_L); servor.attach(SERVO_R); //Stepper pinMode(STEPPER_STEP, OUTPUT); pinMode(STEPPER_DIR, OUTPUT); set_micro_stepping(0, 0, 1); // (MS1, MS2, MS3) servo_mov(90); delay(3000); } void loop() { mySerial.print("distance = "); mySerial.println(read_ultrasonic()); if (read_ultrasonic() < 15) { mySerial.println("Triggered"); int tme = 0; while (read_ultrasonic() < 15) { delay(1000); mySerial.println("Wait"); tme++; } if (tme > 5) { delay(5000); mySerial.println("Move"); moves(); } } else { delay(3000); } } int read_ultrasonic() { long duration; int distance; digitalWrite(TRIGGER, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(TRIGGER, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(ECHO, HIGH); // Calculating the distance distance = duration * 0.034 / 2; return distance; } void moves() { servo_move(150); stepper_move(FORWARD , TO_MM(105)); servo_move(90); servo_move(10); stepper_move(FORWARD , TO_MM(200)); servo_move(90); stepper_move(BACKWARD , TO_MM(190)); servo_move(180); delay(3000); stepper_move(BACKWARD , TO_MM(115)); servo_move(90); } void servo_mov(int angle_l) { int angle_r = 180 - angle_l; servol.write(angle_l); servor.write(angle_r); delay(1200); } void servo_move(int angle) { int to_move = now - angle; //90 ->0 =90 if (to_move > 0) { for (int i = now ; i >= angle ; i--) { servol.write(i); servor.write(180 - i); delay(8); } } if (to_move < 0) { //0 ->180 ->-180 for (int i = now ; i <= angle ; i++) { servol.write(i); servor.write(180 - i); delay(8); } } now = angle; } void stepper_move(bool dir , int steps) { digitalWrite(STEPPER_DIR, dir); for (int i = 0; i < steps; i++) { digitalWrite(STEPPER_STEP, HIGH); delayMicroseconds(800); digitalWrite(STEPPER_STEP, LOW); delayMicroseconds(800); } } void set_micro_stepping(bool in0, bool in1, bool in2) { pinMode(MS1, OUTPUT); pinMode(MS2, OUTPUT); pinMode(MS3, OUTPUT); digitalWrite(MS1, in0); digitalWrite(MS2, in1); digitalWrite(MS3, in2); }