Difference between revisions of "Sparkfun: Flex Sensor"

From eLinux.org
Jump to: navigation, search
(Inputs and Outputs)
(Fixed Grade)
 
(5 intermediate revisions by 2 users not shown)
Line 3: Line 3:
  
 
<pre style="color:red">
 
<pre style="color:red">
Overview:  1, show a picture of the device that shows what pins it has.
+
Overview:  2
Wiring:   0, Give a specific example of how to wire it.  What pins go where?  Which bone header are you using?  P8, P9? 
+
Wiring:   2
You are using a voltage divider, show a diagram of it.
+
Code:     2
Code:     2
+
git:       2
git:   0 put in git
+
Demo:     2
Demo:     0
+
Total:    10/10
Total:    3/10
+
Comments:  Thanks for the quick fix. Both on this and your other page.
Comments:  More details are needed.  I think someone else in the class would have trouble
+
reproducing what you have done.
+
 
+
 
</pre>
 
</pre>
  
 
== Overview ==
 
== Overview ==
 +
[[File:FlexSensor.jpg|thumb|Inputs and Outputs for FlexSensor]]
  
 
The [https://www.sparkfun.com/products/10264 product]. The [http://www.sparkfun.com/datasheets/Sensors/Flex/FLEXSENSOR(REVA1).pdf datasheet].
 
The [https://www.sparkfun.com/products/10264 product]. The [http://www.sparkfun.com/datasheets/Sensors/Flex/FLEXSENSOR(REVA1).pdf datasheet].
Line 27: Line 25:
 
[[File:FlexSensorWiring.jpg|thumb|Wiring example for the Flex Sensor on a Bone]]
 
[[File:FlexSensorWiring.jpg|thumb|Wiring example for the Flex Sensor on a Bone]]
  
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.1k&Omega; ) 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.
+
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.1k&Omega; ) from analog input to analog ground(on P9). 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. There is also a picture included that will aid in wiring the sensor to the bone.
  
 
== Reading and Interpreting Analog Input Data ==
 
== Reading and Interpreting Analog Input Data ==
Line 33: Line 31:
  
 
== Sample C Code ==
 
== Sample C Code ==
 +
The following code can be found through github.
 +
 +
https://github.com/popenhjc/popenhjc_ECE497
 +
 +
You can do a git clone of this repository which includes MiniProject02 folder. Using the make command will make the two c files.
 
<pre>
 
<pre>
  

Latest revision as of 19:58, 3 October 2012


Overview:  2
Wiring:    2
Code:      2
git:       2 
Demo:      2
Total:    10/10
Comments:  Thanks for the quick fix. Both on this and your other page.

Overview

Inputs and Outputs for FlexSensor

The product. The datasheet.

This is a simple flex sensor that measures 4.5" in length. As the sensor is flexed, the resistance across the sensor increases. What you do with this resistance is totally up to whatever you can come up with.

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Ω 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

Wiring example for the Flex Sensor on a Bone

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.1kΩ ) from analog input to analog ground(on P9). 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. There is also a picture included that will aid in wiring the sensor to the bone.

Reading and Interpreting Analog Input Data

Reading the analog input data is pretty simple. Basically, with the way I described hooking the component up, as you bend the flex senor the value of its resistance increases. So, you receive a lower value for the voltage read from the ain pin. The resistance of the flex sensor is approximately 10kΩ when flat, and increases to approximately 110kΩ whe bent as far as possible.

Sample C Code

The following code can be found through github.

https://github.com/popenhjc/popenhjc_ECE497

You can do a git clone of this repository which includes MiniProject02 folder. Using the make command will make the two c files.


/****************************************************************
* 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);
	}
	
	fclose(fp);
	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>");
		exit(-1);
	}

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

	while (keepgoing) {
		usleep(1000);
		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");
			fflush(stdout);
		}
		if (avgCount == 500) {
			printf("Calculating . \r");
			fflush(stdout);
		}
		if (avgCount == 750) {
			printf("Calculating  .\r");
			fflush(stdout);
		}
		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");
			fflush(stdout);
			avgDutyCycle = 0;
			avgCount = 0;
		}
		avgCount++;
	}
	
	fflush(stdout);
	return 0;
}

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