domingo, 31 de julio de 2016

Tutorial: Aprender a usar un sensor Flex con Arduino


Bienvenido a un nuevo tutorial de Lunegate, hoy vamos a prender a usar un componente un tanto diferente, y que las aplicaciones estarán focalizadas en sitios muy explícitos, y es ahí donde entra en juego vuestra imaginación.

INTRODUCCIÓN

Este sensor de unos 8cm de largo aumenta su resistencia al ser flexionado y es perfecto para entornos donde se necesita este tipo de sensores como por ejemplo en guantes inteligentes. Es una tecnología patentada por Spectra Symbol y fue utilizado en el Power glove de Nintendo.

El conector tiene un espaciado de 0.1 pulgadas por lo que se puede conectar directamente a una protoboard. Hay que tener en cuenta que no se debe flexionar demasiado su base ya que se recomienda hacerlo únicamente a partir de su superficie útil de trabajo para que no sufra daños.

Es importante mencionar, que la forma de doblarse es en la dirección que se muestra en la imagen.


Las dimensiones son 8 cm x 0.75 cm aunque la parte útil que medirá la resistencia doblado es de 6 cm. El precio de estas resistencias es bastante elevado, rondan los 10€ la unidad.

Su dataSheet podéis descargaroslo aquí.

Para este tutorial, se requerirá
Dificultad:

           Tiempo:  15 minutos (montarlo y programarlo)


MATERIAL NECESARIO

A continuación os describo el material necesario para realizar el tutorial y donde conseguirlo:

Imagen
Nombre producto
Donde comprarlo
Sensor Flex
Arduino Uno
Resistencia de 47k ohms (Amarillo, morado, naranja, oro)
Cualquier tienda de electrónica
Conectores universales


MONTAJE

Bien una vez que disponemos de todos los componentes, vamos a ponernos manos a la obra. Para ello os dejo a continuación un esquemático de como debéis interconectar los diferentes componentes para que esto funcione.


Como podéis ver, la conexión es muy sencilla, el Vcc del sensor flex (que es la linea continua del sensor) a 5v de Arduino, el GND a tierra de Arduino y por último estará comunicada en serie nuestra entrada analógica 0 a una resistencia de 47k ohms con tierra.


PROGRAMACIÓN

Una vez montado todo correctamente (verificar las conexiones que eso trae mucho de cabeza). Conectamos nuestro Arduino a el ordenador y añadimos el código que os pongo a continuación:

const int FLEX_PIN = A0; // Pin connected to voltage divider output

// Measure the voltage at 5V and the actual resistance of your
// 47k resistor, and enter them below:
const float VCC = 4.98; // Measured voltage of Ardunio 5V line
const float R_DIV = 47500.0; // Measured resistance of 3.3k resistor

// Upload the code, then try to adjust these values to more
// accurately calculate bend degree.
const float STRAIGHT_RESISTANCE = 37300.0;
const float BEND_RESISTANCE = 90000.0;

void setup()
{
        Serial.begin(9600);
        pinMode(FLEX_PIN, INPUT);
}

void loop()
{
          // Read the ADC, and calculate voltage and resistance from it
          int flexADC = analogRead(FLEX_PIN);
         float flexV = flexADC * VCC / 1023.0;
          float flexR = R_DIV * (VCC / flexV - 1.0);
          Serial.println("Resistance: " + String(flexR) + " ohms");
 
          Serial.println("flexADC: " + String(flexADC) + " ohms");

          // Use the calculated resistance to estimate the sensor's
          // bend angle:
         float angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE,
                   0, 90.0);
         Serial.println("Bend: " + String(angle) + " degrees");
          Serial.println();
 
          delay(500);
}

Bien, ¿cómo funciona este código?, es sencillo y a la vez desquiciante, para poder conseguir que la resistencia mida correctamente, debemos "calibrarla" primero. ¿Como haremos esto?, sencillo hay que a través de prueba error afinarla.

Para ello debemos ajustar 2 valores: STRAIGHT_RESISTANCE (resistencia sin doblar) y BEND_RESISTANCE (resistencia doblada). Primero ajustaremos la STRAIGHT_RESISTANCE, hasta que marque cero grados, en mi caso cuando empecé con los 37300, me marcaba -22 grados, así que simplemente empecé a bajar hasta que para cero grados usé 23500. y posteriormente ajustamos BEND_RESISTANCE.


PUNTUACIÓN

Calidad Componentes
4,5
Montaje
4,5
Precio
2,0
Características
3,5
Puntuación Global
4,0


Tags: , , ,

Ude

Eduardo Parada Pardo

Soy desarrollador e investigador en robótica, me gusta aprender nuevas tecnologías y todo lo relacionado con el mundo de la robótica. Si te gusta este blog, no dudes en preguntar cualquier duda.

12 comentarios:

Unknown dijo...

Hola, el tutorial es excelente,

Consulta como puedo exportar los datos entregados del sensor a un excel?

Unknown dijo...

Hola, el tutorial es excelente,

Consulta como puedo exportar los datos entregados del sensor a un excel?

Ude dijo...

Muy buenas, pues se me ocurren 2 formas asi rapidamente, una es a traves de un wemos o un Arduino con wifi, ya que puedes a traves de HTML generar una web dinamica que vaya recogiendo dichos datos y exportarlos a excel.

Otra forma, es que pintes en el serial print el valor y lo dejes un rato el tiempo que necesites, copies y pegues todo el contenido un excel. Depende un poco de que cantidad de datos quieras mostrar.

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

hola una pregunta de donde se obtiene este valor¿?

const float R_DIV = 47500.0;

Ude dijo...

Buenas tardes, si te fijas en el diseño marca que elegimos una resistencia de 47k ohms. De ahi los 47500 del R_DIV.

9acca9 dijo...

Buenas, muchas gracias por tu tutorial. Me funcionó a la perfección. Ahora bien, quería pedirte si me podés dar una mano u orientar un poco para lograr esto (algo que ya te preguntaron...).
Me gustaría que ciertos valores se vayan registrando, los que duren más de determinado tiempo. Es decir, el sensor está en posición de 0 grados y cuando alcanza 3 grados por más de 3 segundos esos datos se guarden así los puedo revisar luego. Podría ser con un wemos como leí que sugeriste. Pero qué es lo que tendría que hacer, aprender??

La idea es ver si puedo usar este sensor para evitar el "bruxismo", morder durante las noches. Ayer, probé meterlo en una suerte de máscara, y cada vez que dejo de tener la boca relajada y muerdo, se dobla enviándo ese valor.. (lo mismo al tragar, por lo que quiero que sólo haga algo cuando se mantenga más de 3 segundos en el mismo o mayor ángulo)... y para hacer un registro de valores y saber horarios en que esto sucede, y si puedo relacionarlo con calidad de sueño, alimentación o lo que fuera, por eso, quisiera enviar los datos a alguna pc.

Desde ya te agradezco y disculpà el mensaje extenso.

Ude dijo...

Muy buenas, y encantado de poder ayudarte ;)
Me parece un proyecto muy interesante lo que quieres hacer. Yo creo que usa solución buena y sobre todo.. gratuita, seria la siguiente.

Comprar un wemos (que son unos 3€), para que ya tengas la wifi integrada. Hay un tutorial de como manejar un wemos aqui. (Si tienes alguna duda de como hacer request desde wemos, te echo una mano)
http://www.lunegate.net/2017/09/tutorial-aprender-usar-wemos-d1-mini.html
Actualmente estan la version 3, que se llaman Lolin. (Mismo precio)

Y para trackear la información y sea facil de leer, usaria de base de datos Firebase. Yo crearia una cloudFunction de todo lo que detecte tu wemos, y se lo envias como una request al servidor y que se guarde en base de datos.

Asi luego lo ves todo el trackeo cuando quieras.

Que necesitas?, Pues intalarte nodeJs, y con javascript crear las cloudFunction. Es relativamente sencillo pero no sera rapido. Hay muchisima documentacion de firebase.

Me gustaria hacer un tutorial por aqui, a ver si me da tiempo que estoy enfrascado en un proyecto grande de robotica y no me da la vida.

Un saludo!! cualquier duda me dices.

Anónimo dijo...

buenas, soy estudiante universitario de primer año, actualmente trabajo en un proyecto donde necesito que un servomotor gire los grados que se dobla el sensor flex, alguna idea para orientarme porfa!!

Ude dijo...

Muy buenas, la solucion es muy sencilla, el sensor flex te devuelve los grados que esta girado, hay una libreria de servo, que gira entre 0 y creo que 360, puedes o hacer una conversion 1-1 o si hacer un pequeño algoritmo que gire mas o menos grados el motor segun los grados del sensor.

Para el servo motor, hay un par de tutoriales aqui sobre como se usan los servo motores, es super facil

Anónimo dijo...

buenas, y estuve buscando el tutorial que me mencionan pero no pude encontrarlo, será posible que me compartan el link porfa, MUUCHAS GRACIAS

"Muy buenas, la solución es muy sencilla, el sensor flex te devuelve los grados que esta girado, hay una librería de servo, que gira entre 0 y creo que 360, puedes o hacer una conversión 1-1 o si hacer un pequeño algoritmo que gire mas o menos grados el motor según los grados del sensor.

Para el servo motor, hay un par de tutoriales aqui sobre como se usan los servo motores, es super fácil"

Ude dijo...

Muy buenas , pues tienes toda la razon del mundo, tengo el tutorial sin publicar. Como aun no esta acabado te comparto este link que lo explican muy detenidamente.
https://www.google.es/amp/s/programarfacil.com/blog/arduino-blog/servomotor-con-arduino/amp/

 

Productos y tecnologias usadas en este blog:

  • Copyright © LuneGate™ is a registered trademark.
    Designed by Templateism. Hosted on Blogger Platform.