Sensor flex

Descrición

240px-flex_sensor
[By SparkFun Electronics CC BY from Wikimedia]
O sensor flex ou sensor de flexión é un sensor que incrementa a súa resistencia cando é flexionado. Hai que flexionalo co lado raiado por fóra.

Consiste nunha tira de plástico cun revestimento condutor. Cando o sensor está recto o recubrimento ten unha determinada resistencia, pero cando se dobra as partículas do revestimento sepáranse aumentando a súa resistencia.

Pódese utilizar para detectar o movemento dos dedos dentro dunha luva, a posición da bisagra dunha porta, etc.

Montaxe

[tecnoloxia.org CC By-SA]
Necesitamos un sensor flex, unha resistencia de 10kΩ e un servomotor.

O pin do sinal do servo conectarémolo a unha saída dixital pwm (pin 6) e o sensor flex a unha entrada analóxica (A0) coa resistencia de 10kΩ, pudendo utilizar calquera dos dous esquemas da imaxe da dereita (pull-up ou pull-down). No exemplo utilizamos o primeiro:

flex_fritzing
[tecnoloxia.org CC By-SA from Fritzing]

Programas

Na primeira práctica “Valores” imos ver que valores nos dá o sensor con distintos niveis de curvatura. Despois, na práctica “Servo” utilizaremos eses valores para mover un servo en función da flexión do sensor.

1. Valores

Mediante este programa imos ver os valores que nos dá o noso sensor de flexión. Este paso previo é necesario antes de utilizar o sensor para establecer o rango que se pode utilizar. Aquí imos fixarnos nos valores mínimo e máximo, pero pode que para o teu proxecto necesites apuntar outros valores intermedios.

// Declaración de variables:

int flexPin=0;       // sensor flex na entrada analóxica A0
int valor;             // valor lido na entrada analóxica

int minimo=1023;     // Variable na que apuntaremos o valor mínimo
int maximo=0;        // Variable na que apuntaremos o valor máximo

// Configuración:

void setup(){
  Serial.begin(9600);   // Establecemos a comunicación serie
  while(!Serial);
}
 
void loop(){            // Debemos ir flexionando o sensor para ver os valores mínimo e máximo
  
  valor =analogRead(flexPin);  // Lemos o valor do sensor
  
  if(minimo>valor){            // Calculamos o mínimo
    minimo=valor;
  }
  if(maximo<valor){            // Calculamos o máximo
    maximo=valor;
  }
  
  Serial.println("val: " + String(valor) + " -- " + "maximo: " + String(maximo) + " -- " + "minimo: " + String(minimo) );  
  delay(200);
  
}

Na proba realizada co sensor do que dispoño, e conectado segundo o esquema 1, o resultado foi o seguinte: mínimo= 760 e máximo= 975

2. Servo

Queremos mover un servo en función da flexión que teña o sensor. Podes repasar aquí e aquí o funcionamento dos servos.

Cando o sensor estea estirado o servo estará na posición de 0º, e cando estea completamente curvado o servo situarase na posición de 180º. Imos utilizar como referencia as medidas tomadas na práctica anterior (mínimo= 760 e máximo= 975).  Cambia estes valores segundo fosen os teus resultados.

Utilizamos a función map(value, fromLow, fromHigh, toLow, toHigh) para establecer a correlación entre os valores do sensor  e o ángulo de xiro do servo.

A función map podería devolver números fóra do rango. Para asegurarnos de que o xiro sempre quede comprendido entre 0 e 180 utilizamos a función constrain(x, a, b). Se o valor queda fóra do rango substitúeo polo valor máis baixo ou máis alto, segundo proceda.

#include <Servo.h>  // Importamos a librería servo

// Declaración de variables:

Servo servo1;     // Poñémoslle nome ao servo
int flexPin=0;    // sensor flex na entrada analóxica A0
int flexPosicion; // valor lido na entrada analóxica (mínimo= 760 e máximo= 975)
int servoPosicion;// Ángulo do servo

// Configuración:

void setup(){
  servo1.attach(6);     // Servo no pin 6
  Serial.begin(9600);   // Establecemos a comunicación serie
  while(!Serial);
}

// LOOP
 
void loop(){   // Debemos ir flexionando o sensor para mover o servo
  
  flexPosicion=analogRead(flexPin);               // Lemos o valor do sensor
  servoPosicion=map(flexPosicion,760,975,0,180);  // Cambiamos o rango coa función map
  servoPosicion=constrain(servoPosicion,0,180);   // Aseguramos que o valor quede entre 0 e 180
  servo1.write(servoPosicion);                    // Enviamos o valor servoPosicion ao servo
  Serial.println("sensor:" + String(flexPosicion) + " -- " + "servo:" + String(servoPosicion));  
  
  delay(100);
  
}

Propostas

  1. LEDs. Fai que a medida que imos curvando un sensor de flexión se vaian acendendo sucesivamente un LEDs. Cando chega á curvatura máxima soa un zumbador de alarma.
  2. Outra idea: Dancing robot
Dancing robot
Dancing robot

 


Deixa un comentario