Descrición
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
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:
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
- 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.
- Outra idea: Dancing robot