Sparkfun: PIR Motion Sensor

Revision as of 16:05, 17 October 2012 by Atniptw (talk | contribs) (Inputs and Outputs)
Jump to: navigation, search

Overview: 1, Don't just repeat the manual, tell me what you did.
Wiring:   0, Give details on how to wire it up.  Show a diagram.
Code:     1, Comment you code and give details of how to use it.
git:      0, put in git
Demo:     2
Total:    4/10
Comments: Many details are missing.  What would you need to tell a beginner
how to get this to go?


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


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.

Bone Usage

Sample C Code

#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>
#include "gpio.h"

 * Constants
#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define POLL_TIMEOUT (3 * 1000) /* 3 seconds */
#define MAX_BUF 64
/* {"gpio1_6", "gpio1_7", "gpio1_2", "gpio1_3", "gpio1_13", "gpio1_12", "gpio1_15", "gpio1_14"} */

 * 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");

	// Set the signal callback for Ctrl-C
	signal(SIGINT, signal_handler);

	gpio = atoi(argv[1]);

	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) {
		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);
			printf("\nMotion Detected, value=%c, len=%d\n",
				 buf[0], len);

		if (fdset[0].revents & POLLIN) {
			(void)read(fdset[0].fd, buf, 1);
			printf("\npoll() stdin read 0x%2.2X\n", (unsigned int) buf[0]);


	return 0;