That is the code i use in my project, consist in hand what is controlled by a glove with sensors flex. I will explain all the factors and the tips i use in my code.

Dependencies:   flex_sensor mbed Servo

Here we have the code of the both sides of the project, the part will control the arm and the part will move our arm.

gloveSensorSend/gloveSensorSend.cpp

Committer:
Ronjea
Date:
2015-07-01
Revision:
2:0f0535b697ce

File content as of revision 2:0f0535b697ce:

#include "mbed.h"
#include "flex_sensor.h"

Serial xbee1(PA_11, PA_12); //Initalise xbee_lib
Serial pc(USBTX, USBRX); //Initalise PC serial comms

// Declaramos los pines analogicos de los cuales vamos a leer los valores que necesitamos
flex_sensor chico_flex(A0);
flex_sensor gordo_flex(A1);
flex_sensor indice_flex(A2);
flex_sensor corte_flex(A3);
flex_sensor anillo_flex(A4);

//Variable donde guardaremos de la posicion de nuestros dedos y con las que vamos a operar
int chicoPosicion, gordoPosicion, anilloPosicion, indicePosicion, cortePosicion,
		chicoCerrado, gordoCerrado, anilloCerrado, indiceCerrado, corteCerrado,
		chicoAbierto, gordoAbierto, anilloAbierto, indiceAbierto, corteAbierto;
/* Estas variables son las que vamos a mandar a traves del XBee, como solo se pueden mandar bytes
 y nuestro numero a enviar es de menos de 1 byte siempre le hacemos la conversion al final*/
int8_t chicoPosicionMandar, gordoPosicionMandar, anilloPosicionMandar,
		indicePosicionMandar, cortePosicionMandar;
unsigned int hextoint(const char *hex);
uint8_t reescala(int value, int inMin, int inMax, int outMin, int outMax) {
	return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
}

int main() {
	xbee1.baud(38400);
	chicoAbierto = 3600;
	gordoAbierto = 3200;
	anilloAbierto = 3220;
	indiceAbierto = 3400;
	corteAbierto = 3400;

	chicoCerrado = chico_flex.get_raw_value();
	gordoCerrado = gordo_flex.get_raw_value();
	anilloCerrado = anillo_flex.get_raw_value();
	indiceCerrado = indice_flex.get_raw_value();
	corteCerrado = corte_flex.get_raw_value();

	while (1) {

		//Traducimos el valor analogico de entrada del sensor a grados
		//con el reescalado y asi obtener la posicion
		//Estos son los valores que van a ser mandados
		chicoPosicion = chico_flex.get_raw_value();
		gordoPosicion = gordo_flex.get_raw_value();
		anilloPosicion = anillo_flex.get_raw_value();
		indicePosicion = indice_flex.get_raw_value();
		cortePosicion = corte_flex.get_raw_value();
		pc.printf("Valor minimo o maximo indice %d\r\n", indicePosicion);
		pc.printf("Valor minimo o maximo gordo %d\r\n", gordoPosicion);
		pc.printf("Valor minimo o maximo  anillo %d\r\n", anilloPosicion);
		pc.printf("Valor minimo o maximo  chico %d\r\n", chicoPosicion);

		//Abierto
		if (gordoPosicion > 3200) {
			gordoAbierto = 3200;
			gordoPosicion = gordoAbierto;
		} else if (gordoPosicion < gordoAbierto) {
			gordoAbierto = gordoPosicion;
		}
		if (indicePosicion > 3300) {
			indiceAbierto = 3300;
			indicePosicion = indiceAbierto;
		} else if (indicePosicion > indiceAbierto) {
			indiceAbierto = indicePosicion;
		}
		if (cortePosicion > 3400) {

			corteAbierto = 3400;
			cortePosicion = corteAbierto;
		} else if (cortePosicion > corteAbierto) {
			corteAbierto = cortePosicion;
		}
		if (anilloPosicion > 3220) {
			anilloAbierto = 3220;
			anilloPosicion = anilloAbierto;
		} else if (anilloPosicion > anilloAbierto) {
			anilloAbierto = anilloPosicion;
		}
		if (chicoPosicion > 3600) {
			chicoAbierto = 3600;
			chicoPosicion = chicoAbierto;
		} else if (chicoPosicion > chicoAbierto) {
			chicoAbierto = chicoPosicion;
		}

		//Cerrado
		if (gordoPosicion < 2450) {
			gordoCerrado = 2450;
			gordoPosicion = gordoCerrado;
		} else if (gordoPosicion < gordoCerrado) {
			gordoCerrado = gordoPosicion;
		}
		if (indicePosicion < 2500) {
			indiceCerrado = 2500;
			indicePosicion = indiceCerrado;
		} else if (indicePosicion < indiceCerrado) {
			indiceCerrado = indicePosicion;

		}
		if (cortePosicion < 2500) {
			corteCerrado = 2500;
			cortePosicion = corteCerrado;
		} else if (cortePosicion < corteCerrado) {
			corteCerrado = cortePosicion;
		}
		if (anilloPosicion < 2360) {
			anilloCerrado = 2360;
			anilloPosicion = anilloCerrado;
		} else if (anilloPosicion < anilloCerrado) {
			anilloCerrado = anilloPosicion;
		}
		if (chicoPosicion < 2450) {
			chicoCerrado = 2450;
			chicoPosicion = chicoCerrado;
		} else if (chicoPosicion < chicoCerrado) {
			chicoCerrado = chicoPosicion;
		}
		//Cerrado significa que esta sin fuerza y abierto forzado
		chicoPosicionMandar = reescala(chicoPosicion, chicoCerrado,
				chicoAbierto, -10, 90);
		gordoPosicionMandar = reescala(gordoPosicion, gordoCerrado,
				gordoAbierto, -10, 90);
		anilloPosicionMandar = reescala(anilloPosicion, anilloCerrado,
				anilloAbierto, -25, 90);
		indicePosicionMandar = reescala(indicePosicion, indiceCerrado,
				indiceAbierto, -35, 90);
		cortePosicionMandar = reescala(cortePosicion, corteCerrado,
				corteAbierto, -20, 90);
		pc.printf("%d", cortePosicionMandar);

		xbee1.printf("%c%c%c%c%c%c%c", 0x7E, chicoPosicionMandar,
				gordoPosicionMandar, anilloPosicionMandar, indicePosicionMandar,
				cortePosicionMandar, 0x0D);
		pc.printf("%c,%d,%c", 0x7E, chicoPosicionMandar, 0x0D);

		wait_ms(30);

	}
}