loading

This Instructable is designed to take the sounds a dog makes and determine if they should be approached or not with indicator LED's. Most dog owners know their pets and can read the signals that they give off so this Instructable is mostly directed toward strangers that may come in contact with your dog.

Step 1: Parts

You will need:

  • Raspberry Pi
  • Red/Green LEDs (X2)
  • Monitor
  • Keyboard/mouse with USB
  • WiFi Dongle
  • External USB Microphone
  • 330 ohm Resistor (X2)

Optional Parts

  • External Raspberry Pi Power Supply
  • Dog Collar

Step 2: Procedure

The first step to beginning this project is to observe the behaviors and patterns associated with your dog. You can click HERE for a simple guide on what you should be looking for. In my case, my dog howls whenever she is excited or happy to see someone and barks intermittently when nervous or aggravated. In the next few steps I will explain how to modify my program in order to accommodate the behaviors of your dog.

Step 3: Programming

Below is the Python program I used for my dog. In the next step I will explain how to modify the program for your dog's behavior. Don't run the program just yet as it won't work until you do the next step.

<p>#!/usr/bin/python<br>import pyaudio
import sys
import thread
from time import sleep
from array import array
import RPi.GPIO as GPIO</p><p>bark=0
howl=False
hold=0
barkLength=5
delay=0
wait = 2
flag = 0
red = 7
green=5
exitFlag = False</p><p>def toggleLightRed(c):
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(red,GPIO.OUT)
        GPIO.output(c,True)
        sleep(10)
        GPIO.output(c,False)
        print("Red toggled")</p><p>def toggleLightGreen(c):
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(green,GPIO.OUT)
        GPIO.output(c,True)
        sleep(10)
        GPIO.output(c,False)
        print("Green toggled")</p><p>def main():
        global bark
        global howl
        global hold
        global barkLength
        global delay
        global flag
        global red
        global green</p><p>        chunk = 8192
        FORMAT = pyaudio.paInt16
        CHANNELS = 1
        RATE = 44100
        threshold = 3000
        max_value = 0
        p = pyaudio.PyAudio()
        stream = p.open(format=FORMAT,
                                        channels=CHANNELS,
                                        rate=RATE,
                                        input=True,
                                        output=True,
                                        frames_per_buffer=chunk)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(red,GPIO.OUT)
        GPIO.setup(green,GPIO.OUT)
        try:
                print "Detection initialized"
                while True:
                        try:
                            data = stream.read(chunk)
                        except IOError as ex:
                            if ex[1] != pyaudio.paInputOverflowed:
                                raise
                            data = '\x00' * chunk
                        as_ints = array('h', data)
                        max_value = max(as_ints)
                        while max_value>threshold:
                            delay=0
                            hold=hold+1
                            try:
                                data = stream.read(chunk)
                            except IOError as ex:
                                if ex[1] != pyaudio.paInputOverflowed:
                                    raise
                                data = '\x00' * chunk
                            as_ints = array('h', data)
                            max_value = max(as_ints)
                        if hold>=barkLength:
                            howl=True
                            print "HOWL DETECTED"
                            toggleLightGreen(green)
                            GPIO.cleanup()
                        elif hold>0 and hold<barklength:  ="" bark+="1" print="" "bark="" detected"="" togglelightred(red)="" gpio.cleanup()="" hold="0" delay+="1" except="" (keyboardinterrupt,="" systemexit):="" "\rexiting"="" stream.stop_stream()="" stream.close()="" p.terminate()="" gpio.cleanup()<="" p=""></barklength:></p><p>if __name__ == '__main__':
        main()</p>

Step 4: Troubleshooting and Modifying

Setup

Before you run the program you will need to type the following into the Terminal to install PyAudio:

<p>sudo apt-get intall python-pyaudio</p>

After this you can test-run the program to make sure it is functioning properly.

Troubleshooting

You may experience the following error:

IOError: [Errno Input overflowed] -9981

To fix this, simply increase the number assigned to the variable chunk until the error no longer appears.

Modifying

The variable barkLength dictates the number of times the program loops before a noise is no longer seen as a bark, but as a howl. If your dogs howls but does so only for a short burst then you should decrease this number.

The variables red and green refer to the output ports that will be used for the LED indicators. These can be changed to fit your needs.

Although I don't use the variable delay actively in my program, it can be observed to indicate the frequency of barking or howling.

The variable hold refers to how many times the program loops where the noise level is above the threshold and is used to determine if a howl is taking place. This variable should not be modified in any way as howls are detected through the manipulation of the barkLength variable.

The threshold variable can be lowered if the bark is not very loud or raised if there is background noise that could be misinterpreted as noise emanating from the dog.

Step 5: Hardware

It is at this point that you should have a fully functioning program that displays to the screen what the hardware will be doing. This point in the project is where you should decide whether this will be a stationary microphone that is set in one place (ex. a place in the house where the dog normally frequents or comes into contact with visitors) or if the project will be minimized and attached to the dog's collar to provide immediate feedback to the person interacting with the dog.

Stationary

The easiest thing to do is to leave everything on a breadboard since there will be no movement that could detach wires. Connect the cathodes of the Red LEDs to the Ground pin on the Raspberry Pi and the Anodes either through a 330 ohm resistor or straight into pin 7 of the Raspberry Pi. Do the same with the Green LEDs but connect the Anodes to pin 5. Run the program and you should have a completed project once you have modified the code to your needs.

Non-Stationary

I would recommend completing the stationary version first just to ensure that everything is working and then move on from there by soldering together everything so that no wires will become unconnected from the dog's movement.

Attach the LEDs to the collar so that they are both in a comfortable position and are able to be seen by someone as they approach.

Next connect your external power supply such as the one seen HERE to the raspberry pi and secure it to the collar in a manner that is comfortable for the dog.

Once everything is secured in place go ahead and run the program, attach the collar to the dog, and you're done!

About This Instructable

497views

6favorites

License:

Bio: Electrical Engineering Major
More by searx:Sonar Collar for Blind Dogs Dog Mood Detector (Raspberry Pi) Running Videos on a TI84 Calculator 
Add instructable to: