Introduction: Pet Feeder
This is my digitally fabricated auger based pet food dispenser. You simply load the pitcher with pet food and it is automatically pushed with the auger screw into the dish to feed your pet. This has been tested to work with cat food and designed with a cat in mind. Actually this is going to be a Christmas present for my sisters cat.
In the past year I have been working to up my game when it comes to fabricating parts for my projects. If you were to check out some of my older Instructables you would see most things I made were built with three basic tools, a drill, a saw of some sort and a dremel. These tools serve me well but I had to limit my material choices and construction techniques to match the tools. I was always designing parts around these limits and trying to source pre-made parts whenever possible. I had some success with this but always thought it would be nice if I could make cuts a little straighter and make things with more complex geometry.
So during the end of 2011, I started working on a cnc router. I finished it in Febuary 2012 and posted all the plans for it here on Instructables DIY CNC Router It has been an awesome tool and I have used it many times. I've made things for my aunt, my sister, my cousin's eagle scout project and a fishing poll rack for my Dad. Around the same time I was finishing up the router, MakerBot released the Replicator and I got caught up in all the hype of 3d printing. I poured myself into this new subculture I found on the internet and I when I emerged from my fasination with these cnc hot glue guns I decided to buy my own 3d printer. There are many DIY level 3d printers available but the one I decided to get was an M2 from MakerGear. It is my opinion that this printer has the highest quality components and uses the best manufacturing techniques of any DIY level 3d printer currently available.
So now that I have a CNC router and a 3d printer I decided to work on a project specifically geared toward using these tools to take advantage of their capabilities. The pet feeder is that project and in this instructable I will to explain how I used the machines to create some unique parts.
This design for an auger screw based kibble dispenser was inspired by Tunell and kitlaan of Thingiverse but I created all of my own 3d models for this design. I have uploaded the design files to Thingiverse as well Pet Feeder Thingiverse #34100
Step 1: Materials and Tools
The parts needed for the pet feeder are easy and cheap
- 2" PVC Plumbing Tee
- Dollar store drink pitcher
- PLA plastic filament for 3d printing (ABS could also be used)
- 3/4" Oak Hardwood board (any sheet material could be used, 1/4" Acrylic could replace this)
- 4-40 machine screws, nuts and washers
- Continuous Rotation Standard Hobby Servo (I used a Parallax servo)
- Exacto Knife (for cleaning up the prints)
- Drill
- 3d printer
- CNC router (or laser cutter)
Step 2: 3D Printed Parts
The general software tool chain used to create 3d printed parts is like this: design a 3d model on the computer, slice the model into layers and write G-code which is used by the printer, send the G-code to the printer as the parts is being made. This requires 3 different pieces of software(design, slice, send). I did all the design work for the pet feeder using Solidworks. This is a really great 3d modeling software but is very expensive. I will not always access to this software so I have been looking into the cheaper/free options. Autodesk 123D, OpenSCAD, FreeCAD are three programs I have been considering. After I designed the parts I exported them from Solidworks in the .stl format. The stl format is basically a list of numbers that define the points of many triangles in 3d space. The triangles are placed so that they match the outside surface of the part designed in the 3d modeling software. Now that I have the .stl file it can be brought into the slicer program. I used Slic3r but some other options are Skeinforge and Kisslicer. In the Slic3r program I input the parameters of the M2 printer, the filament I am using, and the settings that control how the part will be made. Slic3r takes that information and cuts the model into thin slices. The shape of each slice is then used to create the G-code needed to run the printer. The output of Slic3r is a text file but is normally given an extension .GCODE. The G-code is a list of instructions that tell the printer to move from one position to the next while also turning the extruder motor to force plastic out of the nozzle and onto the previous layer of plastic. This list of instructions can be very long, tens or hundreds of thousands of lines long, but don’t worry because you’ll probably never have to go though them. You may sometimes need to edit the few lines at the beginning and end of the file but its not a big deal. I then loaded the G-code file into Ponterface which is the program that sends the G-code to the printer. Ponterface is also used to manually control the printer’s movement and temperatures. Once the G-code is imported and the extruder is hot you can hit the print button and the printer will begin to make the part.
These are the general Slic3r settings I used to make the parts. These settings make structurally sound parts needed for the pet feeder. I used Slic3r version 0.9.3.
Layer Height=0.2mm
Perimeters=2
Solid Layers=3
Infill is rectilinear with 0.2 density every layer at 45deg
Perimeter Speed=90mm/s
Infill Speed=100mm/s
Bridge Speed=100mm/s
Travel Speed=200mm/s
2 Loops for the skirt
The parts needed for the pet feeder are listed below with quantities and actual print times based on the settings already mentioned:
- Pitcher Funnel - Size 97x97x58mm - QTY 1 - Print Time: 2hr 57min
- Servo Mount - Size 67x93x26mm - QTY 1 - Print Time: 1hr 16min
- Wood Support - Size 79x32x32mm - QTY 2 (printed at the same time) - Print Time 1hr 15min
- Auger Screw Cut 1 - Size 59x124x30mm - QTY 1 - Print Time: 1hr 11min
- Auger Screw Cut 2 -Size 59x124x30mm - QTY 1 - Print Time: 1hr 11min
- Kibble Dish - Size 108x97x23mm - QTY 1 - Print Time: 1hr 32min
I've included the stl files for your printing enjoyment. All should be scaled and orientated correctly, let me know if there are any issues. If you would like to view the files easily download NetFab Studio Basic which a great program to view and prep stl files for 3d printing.
Step 3: CNC Parts
There are two identical parts for the pet feeder that I cut on my CNC router. They are made to fit around the PVC Tee and and act as stands for the whole device. I made the parts from 3/4" oak hardwood because I had a piece of this left over from a previous project. Any sheet material could be used and I think 1/4" acrylic or wood could work fine, you could cut this on a laser cutter. I have provided the .dxf file(scaled in inches) for easy fabrication and modification.
Just like in 3d printing there are 3 basic software packages used to create a part. You must first design the part, write the G-code and then send it to the cnc machine. Like the 3d printed parts I designed the cnc parts in Solidworks and then exported them in .dxf format. This is a widely accepted format used to exchange 2d drawings. This format is often used to write G-code using a CAM program(CAM=Computer Aided Manufacturing). The CAM software I used to write the G-code for these parts is CAMBAM When cutting wood or any material with a cnc router there are many different software settings that go into creating the G-code. Just like with all the settings available in the slicing programs for 3d printing there are just as many, if not more, settings available in CAM programs that are used to write G-code for cnc machines. Basically you import your dxf file, which is a 2d drawing of the shape you want to cut. You select the shape, choose the diameter of the bit you will be using and decide how the part will be cut. With cnc machining you have to know how much material you can take off in one pass. In 3d printing you decide how thick each layer is and with cnc you decide how deep the router bit will cut on each pass. Layer Height is to 3d printing as Pass is to cnc machining. Layer height adds material and Pass subtracts material. Generally a pass with a CNC machine has a depth of cut and a percent overlap, which is how wide the cut will be compared to the width of the bit. CNC machining has been around much longer than 3d printing and many standards have been written for deciding how to cut material. Making this is decision is often referred to as figuring out speeds and feeds. Speeds and feeds calculator programs are avaiable and one good one is G-Wizard from CNC Cookbook. You input your bit size and type, material, pass depth and the power of your router and the program tells you how fast the router should be spinning and how fast it should move through the material. This is for the ideal cutting situation and can often be tweaked for the best results. If your settings are to far off the limits of your machine you can easily break bits or stall the router and stepper motors. This is not a good thing and cnc machines are much less forgiving than 3d printers in this regard. Once the G-code is finished I used Mach3 to control the router and send the G-code. This software is widely used by people with home built cnc machines.
Here are the basic settings I used when cutting the two parts:
Cutting Bit: 1/4" diameter 2-flute down spiral router bit
Depth of cut: 0.100"
Cut feed rate: 40 in/min
Plunge feed rate: 10 in/min
Rapid speed: 200 in/min
If you decide to use a thicker material and cut it with a router, like I did, I want to give you a tip. I cut the two parts together which saves time and makes sense. I spaced them out to give just enough clearance for the 1/4" bit I was using to make the cut. This was not a good decision, I should have spaced them out even more. The first part went just as planned and the router was cutting the second part out just as well. On the final pass the entire board broke loose, sending the first part flying and the second part got jammed into the router bit. This stalled the router and the stepper motors. I hit the e-stop once I realized what had happened but it was stalled for at least a second or two. The part was not completely ruined so I finished it with my dremel.
Step 4: Assembly and Operation
To assemble the pet feeder you'll first need to clean up the printed parts. Scrape off any loose filament and drill out the holes with a 1/8" drill bit. Insert the nuts into the funnel and the wood support 3d printed parts. The screws used for everything are 4-40 size with 1/4" nuts. I used 1/2" long screws to attach everything but the wood stands for which I used longer 1-3/8" screws. I drilled out the holes on the stands by hand because I don't have a drill bit that will fit in the router. The wood supports and the funnel attach to the PVC tee by drilling and tapping the tee itself. Use the printed parts as a guide to position the holes correctly. Make sure the ends of the screws don't protrude into the PVC tee. The auger screw connects to a standard X -shaped servo horn and already has the holes designed into the part. Use screws and nuts to attach the screw to the horn while it is attache to the servo. Then bolt the servo to the servo mount. Just use the top two holes to mount the servo.
I am still working on the operation of the feeder. Right now I know that in order to drive the auger screw and not get kibble jammed, the screw must be reversed to free up the kibble. I am using a basic stamp to drive the servo and through testing have determined a sequence of moves for the screw to avoid jams. The sequence is first a 60 degree turn backward then 120 degrees forward and repeat. This has not jammed yet and can be repeated as many times as needed to dispense the desired amount of kibble. There are so many options for controlling the feeder that I have not made the final decision about I how i want to do this. I also might include a button that the pet could press to dispense food, don't know if this would work.

First Prize in the
Digital Fabrication Contest
47 Comments
Question 3 years ago
Can someone help me with preventing the jamming of food?
Answer 3 years ago
I found through testing that you need to quickly reverse the screw right before feeding the food out with forward rotation of the screw. reverse maybe a half a turn before going forward
Question 3 years ago
Can I purchased the auger part from you ?
3 years ago
Checkout this fork for this project:
https://www.youtube.com/watch?v=0UilLpRADHw
Arduino https://github.com/alvarotorijano/aut...
Android:
https://github.com/alvarotorijano/aut...
3D:
https://www.thingiverse.com/thing:377...
7 years ago
Last update, I have added a second mini servo to open and close an auger door. Cats keep picking out food all day long. Door actions is to allow it to close without getting caught up on food stacked up at the edge.
One other addition was to modify the timer so I could switch the digital display off as it was drawing too much current for the solar charger to keep up if we had a couple days of cloudy weather.
Reply 6 years ago
I was looking for inspiration to something similar and when i saw this original build i thought "That could be improved!" but then i saw your post and i was like "that is improved!" i am properly gonna do something like yours with the extra door to keep the cat out and possible make it more or less air tight so the food don't get's to dry.
I can only say to your comment about 3D printer. GET ONE! since i got mine i have been able to make automatic greenhouse controllers, candlelight powered phone charger and many other things! :) and don't forget cheep gift for younger parts of the family ;)
Reply 7 years ago
Just wanted to say great work on the pet feeder, you've taken it to a new level! You're build looks great.
Reply 7 years ago
Thanks, I actually just added yet another option yesterday with the addition of a toggle switch to select more = 1 cup or less = 1/2 cup of food. very simple with the arduino as the controller.
Hope to get me a 3D printer next year some time.. just not sure if I have the time to learn the software.. I keep finding things where I say.. If I had 3D printer I could fix that! ;-)
Doug
7 years ago
Still working on the finished product but have the controls done. Will be timer based and on-demand.
Here is a real short video of the timer triggering and unit running
The Arduino code and be change very simply to output more or less food, this is the amount for my 3 cats at bed time. I foresee the need for a flapper door at the end of the auger as the cats will be pawing out the food.
Will outline the electronics and code when finished.
Reply 7 years ago
Code arduino??? Please
Reply 7 years ago
I have since added an additional switch to allow for 2 feeding amounts as I have started using this at 2x a day and it was too much food. The code reflects this change. Not sure how it will paste into this comment
Keep in mind, my arduino is only powered on for a few more seconds than it takes to run the code since it is controlled by an external timer.
Good luck
// This sketch will operate a servo in the auto cat feeder as soon as it boots.
// The Arduino is powered on and off with an external timer and relay
// this was done to save battery power, the Arduino, External 5v regulator, and servo power
// are all provided 12v when the timer goes off and closes the relay. The boot and ontime of the servo
// is approximately 13 seconds, the timer on time is about 15 seconds. A momentary push button can be
// depressed and held to provide voltage for an demand run.
// Updated 8-14-2016 Feeder now runs 2x day so reducing output changing for loop from a count of 18 to 10 which is 1/2 cup
// Next update will be to install a switch, set a pin to pinMode(#, INPUT_PULLUP) then when gounded (switch closed) pin is low so set value for loop.
#include <Servo.h> // include the servo lib
Servo my_servo; // define my server object
Servo door_servo;
int ledPin = 13; // LED connected to digital pin 13 can remove before going live
int input_value = 1; // when power up set value
int pos = 0; // variable to store the servo position
int check_pin = 0; // temp var to read pin value
int loop_cnt = 0; // var to hold max number of loops (for loop)
int lessfood = 0; // pin 0 will be input_pullup so when it goes low less food
int morefood = 2; // pin 2 will be input_pullup so when it goes low more food
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output so I know it is working with no servo
my_servo.attach(9); //Attach pwm signal wire to pin 9
door_servo.attach(8); //Attach pwm signal wire to pin 8 for door servo
pinMode(lessfood, INPUT_PULLUP); // Switch to gound for less food (1/2 cup = 10 iterations)
pinMode(morefood, INPUT_PULLUP); // Switch to gound for less food (1/2 cup = 10 iterations)
}
void loop()
{
// soon as powered up run
check_pin = digitalRead(lessfood);
if (check_pin == HIGH){
loop_cnt = 10;
check_pin = LOW;
check_pin = digitalRead(morefood);
if (check_pin == HIGH){
loop_cnt = 18;
check_pin = LOW;
}
if (input_value > 0) { // Open door in front of auger
door_servo.write(20);
for (int cnt = 0; cnt < loop_cnt; cnt++) {
if (input_value > 0 ) {
digitalWrite(ledPin, input_value);
my_servo.writeMicroseconds(1425); // Backup
delay(250);
my_servo.writeMicroseconds(1600); // Forward
delay(350);
} // end if
} // end for
digitalWrite(ledPin, 0); // Turn off LED
my_servo.writeMicroseconds(1425); // Backup
delay(250);
my_servo.writeMicroseconds(1500); // stop servo
delay(500);
door_servo.write(90);
delay(500);
door_servo.write(20);
delay(500);
door_servo.write(90);
delay(500);
door_servo.write(20);
delay(500);
door_servo.write(90);
delay(500);
door_servo.write(20);
delay(500);
door_servo.write(90);
delay(500);
}
input_value = 0; // All done so set value so nothing happens in the next loop.
} // End void loop()
Reply 7 years ago
thank airscapes. but I need a simple code to my servo feeder can feed without others. help me!!!!!!!
Reply 7 years ago
This is the simplest version I have.
// This sketch will operate a servo in the auto cat feeder as soon as it boots.
// The Arduino is powered on and off with an external timer and relay
// this was done to save battery power, the Arduino, External 5v regulator, and servo power
// are all provided 12v when the timer goes off and closes the relay. The boot and ontime of the servo
// is approximately 13 seconds, the timer on time is about 15 seconds. A momentary push button can be
// depressed and held to provide voltage for an demand run.
// Updated 8-14-2016 Feeder now runs 2x day so reducing output changing for loop from a count of 18 to 10 which is 1/2 cup
// Next update will be to install a switch, set a pin to pinMode(#, INPUT_PULLUP) then when gounded (switch closed) pin is low so set value for loop.
#include <Servo.h> // include the servo lib
Servo my_servo; // define my server object
Servo door_servo;
int ledPin = 13; // LED connected to digital pin 13 can remove before going live
int input_value = 1; // when power up set value
int pos = 0; // variable to store the servo position
int check_pin = 0; // temp var to read pin value
int loop_cnt = 0; // var to hold max number of loops (for loop)
int lessfood = 0; // pin 0 will be input_pullup so when it goes low less food
int morefood = 2; // pin 2 will be input_pullup so when it goes low more food
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output so I know it is working with no servo
my_servo.attach(9); //Attach pwm signal wire to pin 9
door_servo.attach(8); //Attach pwm signal wire to pin 8 for door servo
pinMode(lessfood, INPUT_PULLUP); // Switch to gound for less food (1/2 cup = 10 iterations)
pinMode(morefood, INPUT_PULLUP); // Switch to gound for less food (1/2 cup = 10 iterations)
}
void loop()
{
// soon as powered up run
check_pin = digitalRead(lessfood);
if (check_pin == HIGH){
loop_cnt = 10;
check_pin = LOW;
check_pin = digitalRead(morefood);
if (check_pin == HIGH){
loop_cnt = 18;
check_pin = LOW;
}
if (input_value > 0) { // Open door in front of auger
door_servo.write(20);
for (int cnt = 0; cnt < loop_cnt; cnt++) {
if (input_value > 0 ) {
digitalWrite(ledPin, input_value);
my_servo.writeMicroseconds(1425); // Backup
delay(250);
my_servo.writeMicroseconds(1600); // Forward
delay(350);
} // end if
} // end for
digitalWrite(ledPin, 0); // Turn off LED
my_servo.writeMicroseconds(1425); // Backup
delay(250);
my_servo.writeMicroseconds(1500); // stop servo
delay(500);
door_servo.write(90);
delay(500);
door_servo.write(20);
delay(500);
door_servo.write(90);
delay(500);
door_servo.write(20);
delay(500);
door_servo.write(90);
delay(500);
door_servo.write(20);
delay(500);
door_servo.write(90);
delay(500);
}
input_value = 0; // All done so set value so nothing happens in the next loop.
} // End void loop()
Reply 7 years ago
thank you!!!! I tried but my servo spin forever. I do not know there is a problem with your servo
Reply 7 years ago
dear airscapes!!!!Helppppp!!!! My servo rotation is not like yours. I don't know why???
Reply 7 years ago
Not sure I can help, I used the exact same model the as the original instructions say to use. Code makes it move forward and back. You must zero your servo with a little program found in the library, you run that program and turn the screw ever so slowly till it stops moving. Then reload the code you want to run.. may be the problem.. not an expert learned what I needed as I did the project using google..
Reply 7 years ago
Thank airscapes. I use servo mg 995 hacked, i dont know it active isn't
7 years ago
Ok, figured that out. There are 2 kinds of PVC schedule 40 Tees, a Sanitary Tee and a Regular Tee. The regular Tee has much less plastic inside that will need to be removed with the drum sander.
7 years ago
I am a bit freaked out.. had the parts printed and the auger is not 2" but 2 5/16. Is this how bit it is supposed to be???
7 years ago
Ordered the same servo, holes in the horn are very small maybe 1/6" in dia. Holes in the auger are at lest 1/8 or 3/16" What sized and type screw was used to attache the auger and the servo?