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); } }