Difference between revisions of "Sparkfun: PIR Motion Sensor"
m (Added Grade) |
|||
(11 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | [[Category: | + | [[Category:ECE497]] |
+ | [[Category:SparkFun]] | ||
+ | |||
+ | <pre style="color:red"> | ||
+ | Overview: 2 | ||
+ | Wiring: 2 | ||
+ | Code: 1, Comment you code and give details of how to use it. | ||
+ | git: 2, put in git | ||
+ | Demo: 2 | ||
+ | Total: 9-1=8 (-1 for second try) | ||
+ | Comments: Much better | ||
+ | </pre> | ||
== Overview == | == Overview == | ||
Line 7: | Line 18: | ||
''Easy-to-use motion detector with an analog interface. Power it with 5-12VDC, and you'll be alerted of any movement.'' | ''Easy-to-use motion detector with an analog interface. Power it with 5-12VDC, and you'll be alerted of any movement.'' | ||
− | [http://bildr.org/2011/06/pir_arduino/ Arduino Tutorial] | + | I found this tutorial very helpful: [http://bildr.org/2011/06/pir_arduino/ Arduino Tutorial] |
− | == | + | == Wiring == |
+ | [[File:PIRMotionSensor.jpg|thumb|]] | ||
− | This unit works great from 5 to 12V (datasheet shows 12V). You can also install a jumper wire past the 5V regulator on board to make this unit work at 3.3V. Sensor uses 1.6mA@3.3V. | + | This unit works great from 5 to 12V (datasheet shows 12V). You can also install a jumper wire past the 5V regulator on board to make this unit work at 3.3V. Sensor uses 1.6mA@3.3V. For the best results I found that I needed to power the sensor using the constant 5V power source on the BeagleBoard Bone Rail. This has the side effect of the device producing a 5V signal, which is to high to run through the gpio pins on the rail. To fix this the output signal needs to be reduced. Also, when wiring up the device the power pin needs a 10k pull-up resistor. |
− | == | + | === Sample C Code === |
+ | The GPIO pins the you connect the senor to, is taken in as an argument to the program. | ||
+ | Program found at https://github.com/atniptw/ECE497/tree/master/MiniProjects/Project2 | ||
+ | <pre> | ||
− | + | /*Standard C Libraries*/ | |
− | |||
− | |||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
Line 29: | Line 42: | ||
#include <signal.h> | #include <signal.h> | ||
#include <unistd.h> | #include <unistd.h> | ||
+ | |||
+ | /*Library I made to assist with GPIO handling*/ | ||
#include "gpio.h" | #include "gpio.h" | ||
Line 38: | Line 53: | ||
#define POLL_TIMEOUT (3 * 1000) /* 3 seconds */ | #define POLL_TIMEOUT (3 * 1000) /* 3 seconds */ | ||
#define MAX_BUF 64 | #define MAX_BUF 64 | ||
− | |||
/**************************************************************** | /**************************************************************** | ||
Line 104: | Line 118: | ||
printf("."); | printf("."); | ||
} | } | ||
− | + | /* From the example code for doing interupts */ | |
if (fdset[1].revents & POLLPRI) { | if (fdset[1].revents & POLLPRI) { | ||
lseek(fdset[1].fd, 0, SEEK_SET); // Read from the start of the file | lseek(fdset[1].fd, 0, SEEK_SET); // Read from the start of the file | ||
len = read(fdset[1].fd, buf, MAX_BUF); | len = read(fdset[1].fd, buf, MAX_BUF); | ||
+ | /* A change in the signal means that there was motion detected */ | ||
printf("\nMotion Detected, value=%c, len=%d\n", | printf("\nMotion Detected, value=%c, len=%d\n", | ||
buf[0], len); | buf[0], len); | ||
+ | /* The sensor needs a moment to re-calibrate after it was been tripped */ | ||
usleep(5000000); | usleep(5000000); | ||
} | } |
Latest revision as of 12:39, 14 November 2012
Overview: 2 Wiring: 2 Code: 1, Comment you code and give details of how to use it. git: 2, put in git Demo: 2 Total: 9-1=8 (-1 for second try) Comments: Much better
Overview
The PIR Motion Sensor can be purchased from SparkFun. The datasheet describes it:
Easy-to-use motion detector with an analog interface. Power it with 5-12VDC, and you'll be alerted of any movement.
I found this tutorial very helpful: Arduino Tutorial
Wiring
This unit works great from 5 to 12V (datasheet shows 12V). You can also install a jumper wire past the 5V regulator on board to make this unit work at 3.3V. Sensor uses 1.6mA@3.3V. For the best results I found that I needed to power the sensor using the constant 5V power source on the BeagleBoard Bone Rail. This has the side effect of the device producing a 5V signal, which is to high to run through the gpio pins on the rail. To fix this the output signal needs to be reduced. Also, when wiring up the device the power pin needs a 10k pull-up resistor.
Sample C Code
The GPIO pins the you connect the senor to, is taken in as an argument to the program. Program found at https://github.com/atniptw/ECE497/tree/master/MiniProjects/Project2
/*Standard C Libraries*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <poll.h> #include <signal.h> #include <unistd.h> /*Library I made to assist with GPIO handling*/ #include "gpio.h" /**************************************************************** * Constants ****************************************************************/ #define SYSFS_GPIO_DIR "/sys/class/gpio" #define POLL_TIMEOUT (3 * 1000) /* 3 seconds */ #define MAX_BUF 64 /**************************************************************** * Global variables ****************************************************************/ int keepgoing = 1; // Set to 0 when ctrl-c is pressed /**************************************************************** * signal_handler ****************************************************************/ // Callback called when SIGINT is sent to the process (Ctrl-C) void signal_handler(int sig) { printf( "Ctrl-C pressed, cleaning up and exiting..\n" ); keepgoing = 0; } /**************************************************************** * main ****************************************************************/ int main(int argc, char **argv) { struct pollfd fdset[2]; int nfds = 2; int gpio_fd, timeout, rc; char *buf[MAX_BUF]; unsigned int gpio; int len; if (argc < 2) { printf("Usage: gpio-int <gpio-pin>\n\n"); printf("Waits for a change in the GPIO pin voltage level or input on stdin\n"); exit(-1); } // Set the signal callback for Ctrl-C signal(SIGINT, signal_handler); gpio = atoi(argv[1]); gpio_export(gpio); gpio_set_dir(gpio, 0); gpio_set_edge(gpio, "falling"); // Can be rising, falling or both gpio_fd = gpio_fd_open(gpio); timeout = POLL_TIMEOUT; while (keepgoing) { memset((void*)fdset, 0, sizeof(fdset)); fdset[0].fd = STDIN_FILENO; fdset[0].events = POLLIN; fdset[1].fd = gpio_fd; fdset[1].events = POLLPRI; rc = poll(fdset, nfds, timeout); if (rc < 0) { printf("\npoll() failed!\n"); return -1; } if (rc == 0) { printf("."); } /* From the example code for doing interupts */ if (fdset[1].revents & POLLPRI) { lseek(fdset[1].fd, 0, SEEK_SET); // Read from the start of the file len = read(fdset[1].fd, buf, MAX_BUF); /* A change in the signal means that there was motion detected */ printf("\nMotion Detected, value=%c, len=%d\n", buf[0], len); /* The sensor needs a moment to re-calibrate after it was been tripped */ usleep(5000000); } if (fdset[0].revents & POLLIN) { (void)read(fdset[0].fd, buf, 1); printf("\npoll() stdin read 0x%2.2X\n", (unsigned int) buf[0]); } fflush(stdout); } gpio_fd_close(gpio_fd); return 0; }