Sparkfun: Flex Sensor

Revision as of 07:11, 24 September 2012 by Popenhjc (talk | contribs) (Bone Usage)
Jump to: navigation, search


The: product. The datasheet.

Inputs and Outputs

As for inputs and outputs, the sensor is basically a resistor and thus should be read from the analog input pins. To work with the analog input, you must put 1k ohm resistor from analog ground to the analog input you choose then connect the sensor from the analog VDD to the analog input you choose. The input voltage can then be read by the processor to determine how far the flex sensor is being bent (flexed).

Bone Usage

To interface this with the BeagleBone you just need to connect the flex resistor from the analog VCC to an analog input and another resistor (I used 1.1kohms) from analog input to analog ground. From there you can read the voltage input and manipulate it using code however desired. In my case I basically took the number that the analog input gave me and manipulated it to average about 1000 samples per second, and display the averaged value. When you bend the resistor the value increases, and when you relax the resistor the value decreases. You can see this in the sample code provided.

Reading and Interpreting Analog Input Data

Sample C Code

* James Popenhagen
* MiniProject02_FlexResistor.c
* 9/23/12
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <poll.h>
#include <signal.h>
#include <unistd.h>

* Constants
#define MAX_BUF 64

* Global Variables
int keepgoing = 1;

void signal_handler(int sig)
	printf( "Ctrl-C pressed, cleaning up and exiting..\n" );
	keepgoing = 0;
 * read_ain
int read_ain(char* ain){
	FILE *fp;
	char ainPath[MAX_BUF];
	char ainRead[MAX_BUF];

	snprintf(ainPath, sizeof ainPath, "/sys/devices/platform/omap/tsc/%s", ain);

	if((fp = fopen(ainPath, "r")) == NULL){
		printf("Cannot open specified ain pin, %s\n", ain);
		return 1;

	if(fgets(ainRead, MAX_BUF, fp) == NULL){
		printf("Cannot read specified ain pin, %s\n", ain);
	return atoi(ainRead);	

 * Main
int main(int argc, char **argv){

	int ainPin;
	char ain[MAX_BUF];
	float duty_cycle = 0;
	float avgDutyCycle = 0;
	int avgCount = 1;
	if (argc < 2){
		printf("Usage: ./MiniProject02 <ainpin>");

	signal(SIGINT, signal_handler);
	ainPin = atoi(argv[1]);
	snprintf(ain, sizeof ain, "ain%d", ainPin);

	while (keepgoing) {
		duty_cycle = read_ain(ain);
		duty_cycle = duty_cycle/4095 * 100;
		duty_cycle = 30 - duty_cycle;
		duty_cycle = duty_cycle*4;
		duty_cycle = duty_cycle - 28.6;
		if(duty_cycle <= 6) duty_cycle = 0;
		avgDutyCycle += duty_cycle;
		if (avgCount == 250) {
			printf("Calculating.  \r");
		if (avgCount == 500) {
			printf("Calculating . \r");
		if (avgCount == 750) {
			printf("Calculating  .\r");
		if(avgCount >= 1000){
			avgDutyCycle = avgDutyCycle/avgCount;
			avgDutyCycle = avgDutyCycle * 100;
			printf("                                 \r");
			printf("Calculating    %d\r",(int)avgDutyCycle);
			if(avgDutyCycle >= 9000) printf("Calculating    It's over 9000!!!!\r");
			avgDutyCycle = 0;
			avgCount = 0;
	return 0;

You must specify the ain pin number as the first argument when executing this code after it is compiled.