Introduction: Automatic Dog Dispenser
With my project I make sure that when you leave your dog alone at home, he / she is never without food.
The automatic feeder will be "hacked" from a cornflakes dispenser. The dispenser is the reservoir for dog food, the wheel at the bottom will be connected to a servo motor that automatically drops food when the crib is nearly empty and when the dog is close enough. At the bottom of the dispenser there will be a PVC tube attached that will drop the dog food nicely into the crib. This project will therefore have 3 sensors, 2 of which are not covered in class and 1 of which is an actuator.
The first sensor is the RFID reader. This sensor checks when the dog comes close to the crib. The RFID will be incorporated in the dog's collar. If this sensor notices that the dog is close enough, it will transmit a signal to the second sensor. The second sensor is the weight sensor (not covered in class) that measures the food in the crib, if this sensor detects that the weight is too low, it will send a signal to the servo motor that will drop the food into the crib (with confirmation of the RFID and the weight sensor). In short, the dog only gets extra food when he / she is close enough to the crib and when the crib is almost empty. Of course there is also a limit set that you can set yourself via the web server; so that the dog does not get too much food per day. The third sensor is a light sensor that illuminates an LED floodlight when it is too dark around the crib. The actuator will therefore be a servo motor connected to the wheel in the dispenser.
This project is meant for dogs, you can also use it for other small pets.
Supplies
Raspberry Pi 3
Load cell (1KG)
HX711 load cell amplifier
Food bowl
Cereal dispenser
Wood ( + screws and screwdriver)
Light sensor
Led
RFID reader rc522
Jumper wires
16*2 LCD (display)
Servo motor
5V power adapter
Resistor 470 Ohm
PVC tube
Breadbord
Potentiometer
Saw
Sanding paper
Silicon gun
Step 1: Pi Setup
Setup
To get started we’ll first need to set up your Pi.
You’ll need two things:
- Win32 Disk Imager from https://sourceforge.net/projects/win32diskimager/...
- Raspbian OS image from https://www.raspberrypi.org/downloads/raspbian/
Download the ZIP file and extract it to wherever you want.
The installation
1. Select your image via the folder icon
2. Select your SD card via the dropdown
3. Click on write
Now we’ll need to do some extra tinkering with some settings so we’ll be able to access the Pi.
1. Go to the SD card’s boot directory
2. Open the file "cmdline.txt"
3. Add ip=169.254.10.1 At the end of the long line of text separated with a space (on the same line).
4. Save the file.
5. Create a file named ssh with no extension in the same directory
Now you can eject the SD card and put it in your Pi.
Connecting
Now we will need to setup the software.
First plug in a LAN cable, one end in your desktop/laptop and the other in your Pi.
Now boot the Raspberry Pi.
1. Install Putty from https://www.putty.org/
2. Enter 169.254.10.1 in the IP box.
3. Make sure SSH is selected and port 22 is filled in.
4. Click open
5. Fill in the username: pi
6. Fill in the password: raspberry
Raspi-config
Open the Raspi-config utility by using:
sudo raspi-config
Enable the following options in the interfaces category
- 1-Wire
- SPI
Disable the following options in the boot options category
- Splash screen
Lastly set the Desktop/CLI setting in the boot options category to Desktop Autologin.
WiFi
For the dog feeder we need to have a wifi connection so make sure you have your wifi credentials close.
1. Go into root mode
sudo -i
2. Paste this line but make sure that the SSID and Password are both filled in
wpa_passphrase "SSID" "PASSWORD" >> /etc/wpa_supplicant/wpa_supplicant.conf
3. Enter the WPA Client.
Wpa_cli
4. Select the interface
Interface wlan0
5. Reload the config
Reconfigure
Make sure you are connected correctly by typing ip a and seeing if you have an IP on the WLAN0 interfaces.
Packages
Now that we are connected to the internet we'll have to install some packages.
First we'll need to refresh the package lists for the latest one.
sudo apt update
Python
We'll force Raspbian to use Python 3
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --install /usr/bin/python python /usr/bin/python3 2
MariaDB
Paste the following line to install the database.
sudo apt install mariadb-server
Then we'll need to secure our installation.
mysql_secure_installation
It will ask us for current root password since we don't have one just press enter.
Next it's asking if we want a root password type in y since we want one.
For the next questions just enter Y.
Next we'll be creating a user that we'll be able to use for the mirror.
Enter the mysql shell by doing:
- Elevate ourselves to root
Sudo -i
- Enter the mysql shell
Mysql
- Replace with your own username and the same with
grant all privileges on *.* to ''@'%' identified by '';
- grant all privileges on *.* to ''@'%' identified by '';
Next we’ll be adding our database.
Apache Webserver
To install the Webserver run the line below.
sudo apt install apache2 -y
Python packages
We're going to install these packages
- Flask
- Flask-Cors
- Flask-MySQL
- Flask-SocketIO
- PyMySQL
- Gevent
- Gevent-websocket
- Httplib2
- Python-socketio
- Requests
- Wsaccel
- Ujson
By doing
pip install Flask Flask-Cors Flask-MySQL Flask-SocketIO PyMySQL gevent gevent-websocket httplib2 python-socketio requests wsaccel ujson mfrc522 hx711 Adafruit-CharLCD
Step 2: Led and Light Sensor
Hooking up the led
- S -> GPIO15 (rxd0)
- + -> 5V
- G -> Resistor 470 ohm and GND
Hooking up the light sensor
- OUT -> GPIO17
- VCC -> 3.3V
- GND -> GND
Now we can test if our led and light sensor works with this little script
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(15, GPIO.OUT)
GPIO.setup(17, GPIO.IN)
try: while True:
if GPIO.input(17) == 0:
GPIO.output(15, GPIO.HIGH)
if GPIO.input(17) == 1:
GPIO.output(15, GPIO.LOW)
except KeyboardInterrupt: GPIO.cleanup()
Step 3: Servo Motor
Hooking up the servo motor
- OUT -> GPIO18
- VCC -> 5V
- GND -> GND
Now we can test if our led and light sensor works with this little script
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
p = GPIO.PWM(18, 50)
p.start(12.5)
try:
while True:
p.ChangeDutyCycle(12.5)
time.sleep(1)
p.ChangeDutyCycle(2.5)
time.sleep(1)
except KeyboardInterrupt:
p.stop()
GPIO.cleanup()
Step 4: RFID Reader RC522
Hooking up the RFID
- RST -> GPIO6
- MISO -> GPIO9 (MISO)
- MOSI -> GPIO10 (MOSI)
- SCK -> GPIO11 (SPISCLK)
- SDA -> GPIO8 (SPICS0)
- 3.3V -> 3.3V
- GND -> GND
Now we can test if our RFID reader works with this little script
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
text = input('New data:')
print("Now place your tag to write")
reader.write(text)
print("Written")
Step 5: Load Cell HX711
Hooking up the Load cell to the HX711 driver board
- Red -> E+
- Black -> E-
- Green -> A+
- White -> A-
Hooking up the Load cell
- DT-> GPIO27
- SCK -> GPIO22
- RED -> 3.3V
- GND -> GND
Now we can test if our load cell works with this little script
import RPi.GPIO as GPIO
import time import sys from klasses.HX711 import HX711
def cleanAndExit(): print( "Cleaning...") GPIO.cleanup() print("Bye!") sys.exit()
hx = HX711 (22, 27)
hx.set_reading_format ("LSB", "MSB")
hx.set_reference_unit (2167)
hx.reset()
hx.tare()
while True:
try:
val = max(0, int(hx.get_weight(5)))
print(val)
hx.power_down()
hx.power_up()
time.sleep(0.5)
except (KeyboardInterrupt, SystemExit): cleanAndExit()
Step 6: LCD (16*2)
Hooking up the LCD
- RS -> GPIO21
- RW -> GND
- E-> GPIO20
- D0 -> GPIO16
- D1 -> GPIO12
- D2 -> GPIO6
- D3 ->GPIO24
- D4 -> GPIO23
- D5 -> GPIO26
- D6 -> GPIO19
- D7 -> GPIO13
- VSS -> GND
- VDD -> 5V
- A -> 5V
- K -> GND
- V0 -> middle potentio pin
Now we can test if our LCD screen works with this little script
import Adafruit_CharLCD as LCD
lcd_rs = 21
lcd_en = 20
lcd_d4 = 23
lcd_d5 = 26
lcd_d6 = 19
lcd_d7 = 13
lcd_columns = 16
lcd_rows = 2
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows)
lcd.message('169.254.10.1')
Step 7: Full Circuit
here you can check again if the entire circuit is correct
Step 8: Start of the Case
I used a cornflake dispenser as a reservoir for the dog food
I connected the wheel in the dispenser to my servo motor
Now I can control the wheel with my servo motor and drop food out of the reservoir
At the end of the reservoir there is a PVC tube connected that drops the food nicely into the crib
I use wood as a casing
Step 9: Putting It Together
Step 10: The Website
Now our machine works we need to get the website onto the pi.
Now everything is up and running some few instruction on how the site works.
You can connect you're pi to the wifi by plugging in an hdmi cable and activate this way
The first page is the home page, here you can see:
- Realtime info about the light
- Realtime info about the food that is left in the bowl
- You can drop food
- Info about the dog
The second page is the edit page, here you can edit:
- the name of your pet
- the age of your pet
- the weigth of your pet
- the photo of your pet
The third page is the history page, here you can see:
- when the light did go on
- when the dog has eaten
- when the food has dropped
The fourth page is the settings page, here you can edit:
- when the food needs to drop
- the amount of food to drop
- max food/day
- the light