Brazo Robótico (Flex sensor)

Hola,
Estoy construyendo un brazo robótico a partir de "servo motors" y "flex sensors". El circuito funciona como un divisor de voltaje. Cuando doblo el sensor, que está cosido encima de un guante, envía una señal que hace que un motor, al que hay enganchado un hilo, gire, flexionando el dedo de la mano construida. La mano habitualmente solo funciona unos 2 minutos y creo que se debe a que no estoy usando el mejor valor de resistencia para el proyecto. Mi duda es que no sé cómo descubrir qué resistencia debería usar; no sé si la resistencia la debo elegir según el sensor o según lo que necesita el motor. Y, cuando descubra esto, ¿cómo encuentre qué resistencia le va mejor? He probado de buscar información de los sensores que compré pero no he encontrado nada.

¡Muchas gracias!

Moderador:
Mejora la presentación de tu problema con links a las hojas de datos de los elementos que usas particularmente el flex sensor.
tmb un esquema aunque sea a mano alzada de como conectas el flex al arduino y qué arduino usas.
Todo lo que ayude a entender siempre será bienvenido. No estamos junto a tu hardware asi que debes proveer toda la info.
Por favor lee las normas del foro, creo que te servirán para entender porque te pido todo esto.

Hola,
Estas son las hojas de datos de los componentes del circuito:

Estoy usando un Arduino UNO R3

Este diagrama del circuito refleja cómo es el mío:

Lo único que tengo distinto de este diagrama es la conexión del cable rojo de los sensores, que en mi caso va hacia GND; y la conexión del cable negro de los sensores, que en mi caso va hacia 5V.

Quería recalcar que los valores que me salen en monitor reflejan bien el estado del flex sensor (doblado o no doblado) con números que van de 0 a 1000. Aún así, los motores a veces empiezan a dar vueltas enteras doble o no el sensor.

Por último, este es el código que estoy usando:

#include<Servo.h> 
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

int flex1= A1;
int flex2= A2;
int flex3= A3;
int flex4= A4;
int flex5= A5;
;
void setup() {
  Serial.begin(9600);
  servo1.attach(2);
  servo2.attach(3);
  servo3.attach(4);
  servo4.attach(5);
  servo5.attach(6);
}


void loop()
{
  int flex1_pos;
  int servo1_pos;
  flex1_pos = analogRead(flex1);
  servo1_pos = map(flex1_pos, 20, 850, 0, 180);
  servo1_pos = constrain(servo1_pos, 0, 180);
  servo1.write(servo1_pos);

  int flex2_pos;
  int servo2_pos;
  flex2_pos = analogRead(flex2);
  servo2_pos = map(flex2_pos, 20, 850, 0, 180);
  servo2_pos = constrain(servo2_pos, 0, 180);
  servo2.write(servo2_pos);

  int flex3_pos;
  int servo3_pos;
  flex3_pos = analogRead(flex3);
  servo3_pos = map(flex3_pos, 20, 850, 0, 180);
  servo3_pos = constrain(servo3_pos, 0, 180);
  servo3.write(servo3_pos);

  int flex4_pos;
  int servo4_pos;
  flex4_pos = analogRead(flex4);
  servo4_pos = map(flex4_pos, 20, 850, 0, 180);
  servo4_pos = constrain(servo4_pos, 0, 180);
  servo4.write(servo4_pos);

  int flex5_pos;
  int servo5_pos;
  flex5_pos = analogRead(flex5);
  servo5_pos = map(flex5_pos, 20, 850, 0, 180);
  servo5_pos = constrain(servo5_pos, 0, 180);
  servo5.write(servo5_pos);
  

Serial.print(flex1_pos);
Serial.print("\n");
Serial.print("b");
Serial.print(flex2_pos);
Serial.print("\n");
Serial.print("c");
Serial.print(flex3_pos);
Serial.print("\n");
Serial.print("d");
Serial.print(flex4_pos);
Serial.print("\n");
Serial.print("e");
Serial.print(flex5_pos);
Serial.print("\n");
Serial.print("a");

  delay(500);

}

Espero que así se pueda entender mejor cómo es mi proyecto y sea más fácil poder encontrar solución a mi problema.
¡Muchas gracias!

Ahora si, un poco de esquema libera la mente o al menos la mía.
Tienes un sensor que veremos como si fuera un potenciómetro y no sabes bien qué R poner como divisor resistivo.
Bien, analicemos 1 sensor. El análisis será el mismo para los demás.

Un consejo práctico sería poner una resistencia fija de digamos 1k.
Luego un potenciómetro en serie de 10k con el cursor unido al extremo derecho y a continuación en serie el flex.
Entonces ajustas el potenciómetro al maximo girando en el sentido de las agujas del reloj. En esa condición tienes 1k + 10k por un lado y luego el flex.
Pones un tester y mides la tensión y anotas.
Luego flexionas el sensor y anotas la tensión.
Voy a suponer que en condición estática el flex tiene máxima R entonces en la primer prueba medirás algo cercano a 0V.
Cuando flexiones el flex supongo que tendras resistencia minima. Aca es donde la tensión debería aproximarse a 5V . Supongamos que lees 4V. Bien, entonces ajustas el potenciómetro en sentido antihorario hasta leer algo mas cerca de 5V
Listo.. digamos que llegas a 4.5V. Retiras todo y mides el potenciómetro con el multímetro. Al valor de ohms leido le sumas 1K y ya tienes tu valor de Resistencia.
Si 10k no es suficiente necesitarás un pote de 50k o 100k.
No se el valor del flex en estado normal o flexionado.

En el diagrama se muestra que tienes conectados tus 5 servos a Vin.

Este pin conecta lo que tengas a la entrada después de un diodo M7, que tiene una capacidad nominal de 1A y una caída de voltaje de 1.1V. Completamente insuficiente para la corriente que demanda la mano robótica.

Como puedes ver, Vin se alimenta a un regulador que finalmente entrega 5V al Arduino. Este regulador requiere un voltaje mínimo de 6.5 para funcionar correctamente, es decir, Vin debería ser 6.5V. Aquí el problema es que el fabricante del SG90 nos indica que el voltaje máximo es de 6V

https://diotec.com/request/datasheet/m1.pdf

Comenta cómo estás energizando tu circuito.

Opino como @mancera1979, esos servos están mal alimentados y podrían ser la causa del problema, se deberían alimentar con alimentación externa de 5v.
Por si os sirve yo si he encontrado algo soble esos "flex sensors".

Hola,
Muchas gracias a los tres por darme soluciones a mi problema. Cambié el cableado. Pasé de tener los servo motors conectados con el Vin a tenerlos conectados con el pin de 5V. Supongo que por eso me funciona ahora mucho mejor, teniendo en cuenta que requieren 6.5 V como decís @mancera1979 y @gonpezzi . Cuando hice el cambio, me funcionaba a la perfección pero ahora, de vez en cuando, surge el mismo problema (servo motors empiezan a girar sin parar y sin yo mandarles una señal para que actuen de esta forma). Aún así, este problema surge con mucha menos frecuencia que cuando tenia los motores conectados al pin Vin.
Teniendo esto en cuenta, ¿cómo arreglaríais el problema? ¿Debería cambiar las resistencias para que el circuito en vez de requerir 6.5V, requiera 5V?
Como es la primera vez que hago un proyecto con Arduino, agradecería mucho vuestra ayuda.

¡Muchas gracias!

Los servos según cuales sean requieren corriente además de la tensión adecuada. La corriente no puede suministrarla Arduino o si pero hasta cierto límite.
Entonces usa una fuente de la tensión requerida 5 o 6V para los servos, comparte GND con el Arduino y verás que todo funciona correctamente.

Que resistencias, no se te ocurra bajar tensíón con resistencias!!! Eso solo funciona si no se modifica la carga, si ésta cambia, la caida de tensión tambien y en lugar de tener 5 tendras 4.0V. Ahora leo para atras a ver que has querido decir.

Voy a suponer el servo mas simple y de menor consumo. Lee esto

Generic SG90 (China)
Voltage 4.8-6VDC (5V Typical)
Current (idle) 10mA (typical)
Current (typical during movement) 100-250mA
Current (stall) 360mA (measured)

Este servo consume 10mA cuando nada pasa pero entre 100 y 250mA cuando esta en movimiento. Antes con 250mA ya te hubieramos dicho que usaras alimentación externa. Ahora es un poco mas con los Arduino Clones pero aún asi. si el servo se traba conusme 360mA
Entonces 5 servos son 250mA x 5 = 1250mA o 1.25A en condiciones normales todos funcionando y hasta 360x5 = 1.8A si estan trabados o con mucha resistencia.
NI por casualidad un Arduino puede manejar eso.
Por eso cuando 1 funciona la cosa va y cuando son 2 se empieza a complicar.
Fuente externa, compartes GND y alimentas los servos con dicha fuente y lo demas como esta.

Hola,
Tu mensaje me ha sido de gran ayuda. Ahora entiendo mejor lo que muy probablemente esta causando estos problemas. Como estas son las especificaciones de mis motores: 4.8-6 VDC (5V Typical)
Current (idle) 10mA (typical)
Current (typical during movement) 120-250mA
Current (stall) 700mA (measured)

y tengo 5 de ellos en el circuito. Debería usar una fuente de alimentación externa que proporcione 5V y 3.5 A a los motores, no? Para ello, debería comprar una batería así o varías de ellas y conectarlas a los motores? ¿Porque difícilmente encuentre una que cumpla con eso, no? ¿Si uso más de una, deberían sumar 5V y 3.5 A, es decir, con 4, cada una debería ser de 1.25V y 0.75A? ¿Cómo deberían ser?
¡Gracias!

Si es con baterias, debes usar algo que tenga potencia suficiente. Una bateria de GEL de 6V 7Ah por ejemplo o varias 18650 en un arreglo que entreguen al menos 6600mAh podrian ser 2S 3P o sea 2 en serie y 3 en paralelo.

image
Ojo esto entregará 7.4V nominales o sea requieres una fuente DC DC (Step down) y reducir a 6V.

¿Cuál sería la solución más senzilla? Porque no controlo la fuente DC DC (Step down). Para las especificaciones de los motores y teniendo en cuenta que son 5, qué me recomendarías hacer que no sea muy complicado teniendo en cuenta que es mi primer proyecto.
¡Muchas gracias!

Como que no controlas? Una fuente DC DC step down entrega 3A, asi que alimentas con algo que tenga la potencia en mAh necesarias y lo bajas a la tensión que requieres y listo.
Si no sabes, vas a una casa que te venda las baterias 18650 y le pides que necesitas 2S 3P y ellos entenderán.
Eso te dara 2200 x 3 = 6600mA corriente y 3.7x2 = 7.4V.
Lo pasas por un DC DC como este


o este

ambos entregan 3A.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.