Skip to content

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

Presentation

Files

All the project files can be found here

2D and 3D Modeling

Design Evolution

Design Step 1

Design Step 2

Design Step 3

Design Step 4

Design Step 5

Design Step 6

Electronics Design

Board

Schematics

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

Milling

Wood Cutting using Shopbot

Cutting details are documented in Assignment 8

Cutting

Finishing using Power tools

Various saws and drills were used to finish the box

Finishing

Logo Cutting using Trotec 100 Laser Machine

Laser cutting was used in making the wooden logo of the ShooBot.

Laser

Materials used

 

NO ITEM PRICE  QNTY

 TOTAL

 PRICE

SOURCE
 1 ATMega328 Microcontroller  200  200 Lab Inventory
 2  XTAL Resonator   1   Lab Inventory
 3 A4988 Stepper Motor Driver     Lab Inventory
 4  Voltage Regulator     Lab Inventory
 5  HCSR04 Ultrasonic Sensor   1   Lab Inventory
 6 Resistor 499 Ohm   1   Lab Inventory
Resistor 0 Ohm   1   Lab Inventory
 Resistor 10 Kilo Ohm     Lab Inventory
 LED     Lab Inventory
10 Stepper Motor     Lab Inventory
11 Servo Motor     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     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)     Lab Inventory
21 Plywood piece(3mm,10cmX10cm)     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);
}