Mi servo hace ruido pero no se mueve ¿ Problema con el codigo o con el circuito?

Hola muy buenas, os cuento mi problema:

Estoy intentando hacer un circuito y un programa para activar un servomotor con un sensor táctil, el caso es que no me funcina y por algo será, no estoy seguro de que es lo que me falla, pero si tuviera que jugarmela diria que es el codigo.
Lo que me hace cuando activo el sensor es que el servo vibra muy sutilmente y hace ruido, pero no se mueve, con eso ya entiendo que le llega señal, debería funcionar, no?

En cualquier caso os adjunto unas imagenes del circuito y del código para ver si podeis ver lo que sucede.

Tambien os digo que soy totalmente nuevo en esto y este es mi primer proyecto en el que tengo que programar algo, la puedo haver cagado mucho sin saberlo jajajaja...

Gracias por vuestra atención !


#include <Servo.h>

const int pinLED = 13;
int pinTouch = 7;
Servo servo1;
int val;
int sensorOnOff = 0;
boolean state;

void setup() {

servo1.attach(8);
pinMode(pinLED,OUTPUT);
pinMode(pinTouch,INPUT);

}

void loop() {

val=digitalRead(pinTouch);
if (val==HIGH){
digitalWrite(pinLED,HIGH);
servo1.write(0);
delay(2000);
servo1.write(180);
delay(2000);
}
else { digitalWrite(pinLED,LOW);
}

sensorOnOff = digitalRead(pinLED);

if(sensorOnOff ==HIGH){
if (state == false){
state = true;
}
else{
state = false;
}
}
}

Estas usando una fuente de alimentacion externa? Porque conectando solo el usb, arduino no puede mover el servo

Matias24:
Estas usando una fuente de alimentacion externa? Porque conectando solo el usb, arduino no puede mover el servo

:o Nononononono eso NO ES ASÍ !!!!


iborra, olvida lo que dijeron porque un servo a 5V se mueve sin problemas.
Antes de revisar tú código, toma la molestia de comprobar si el problema es el servo o no.
Pon en el loop los servo1.write(0); y servo1.write(180); con un delay de p.e 2 seg y nada más.

Si se mueve ya tu mismo has descartado que el servo está mal.
Si descartas que sea el servo entonces pasamos al código.

Pero... ¿Qué es lo más probable? y pongo la mano en el fuego por el "ruidito"
Que estés poniendo alguno de los 3 cables del servomotor mal.
Revisa que realmente el cable de 5V esté en 5V, el de ground al Ground común y el del pin esté en el 8. Cuando están mal sucederá lo que describes.

Advertencia extra: puedes romper un servo haciendo tonterías con el código y/o poniendo los cables mal (Especialmente si son los modificados de rotación continúa) Entonces el ruidito será para siempre... y pondrás a descansar en paz tu servomotor ::slight_smile:

Perdon entonces, jaja.
Tenia entendido que arduino usando un USB no podia mover un servo, de hecho esto lo vi en un video de youtube

Matias24:
Perdon entonces, jaja.
Tenia entendido que arduino usando un USB no podia mover un servo, de hecho esto lo vi en un video de youtube

No hace falta que te disculpes pero no crean todo lo que ven en internet. Hay un montón de gente con nula formación subiendo vídeos. Cualquiera puede ya subir vídeos, tengan en cuenta esto siempre.

Si se está empezando el libro de Arduino está subido a pdf en completo Español. Ni siquiera es necesario comprar el kit (Y arduino en la contraportada expone que es perfectamente legal que distribuyas el material del libro dejando constancia de quienes son sus autores)

La traducción no es igual igual igual hasta la última palabra que el libro real, pero un sinónimo no mata la información.

Y ya de paso pongo el enlace: libro de Arduino

Si se va a la página 64 el ejercicio 5 muestra un ejemplo con servo motor y la conexión a 5V de Arduino (Y sigo creyendo que el error del autor de este post está en la conexión).

Saludos.

Arduinito:
:o Nononononono eso NO ES ASÍ !!!!


iborra, olvida lo que dijeron porque un servo a 5V se mueve sin problemas.
Antes de revisar tú código, toma la molestia de comprobar si el problema es el servo o no.
Pon en el loop los servo1.write(0); y servo1.write(180); con un delay de p.e 2 seg y nada más.

Si se mueve ya tu mismo has descartado que el servo está mal.
Si descartas que sea el servo entonces pasamos al código.

Pero... ¿Qué es lo más probable? y pongo la mano en el fuego por el "ruidito"
Que estés poniendo alguno de los 3 cables del servomotor mal.
Revisa que realmente el cable de 5V esté en 5V, el de ground al Ground común y el del pin esté en el 8. Cuando están mal sucederá lo que describes.

Advertencia extra: puedes romper un servo haciendo tonterías con el código y/o poniendo los cables mal (Especialmente si son los modificados de rotación continúa) Entonces el ruidito será para siempre... y pondrás a descansar en paz tu servomotor ::slight_smile:

Hola Arduinito, gracias por contestar.

Pues verás, ya he probado todas las posiciones posibles con los cables y en la única posición que muestra señales de vida es como lo tengo puesto desde un principio, la cosa es que ahora el servo se mueve un poco y tiene un comportamiento bastante errático, "Ahora me muevo, ahora solo hago ruido, ahora me muevo pero en ángulos que no toca, ahora vuelvo a hacer ruido".
Me he fijado que la luz del led del pin 13 no es muy constante, aveces aumenta o disminuye la intensidad del mismo y en función de eso parece que se mueve el servo, es decir, que cuando el led se ilumina fuertemente el servo se mueve.

Pero no juegues con los cables buscando posición ¡¡¡Busca en un diagrama cuales son!!! Vas a romper el servomotor si no lo has hecho ya.

Ahora bien, ¿estamos hablando de un servomotor pequeño? Indícanos el modelo o bien pon una fotografía.
No estarás usando un servomotor grande estilo MG996R ¿No? :cold_sweat: porque entonces sí puede darse el caso que comentaba Matias24 y necesites más potencia. Si no das más información yo presupongo que es un servo normal.

Danos datos que no podemos adivinar y estamos presuponiendo.
¿Es un servomotor de 90º o de 180º o de rotación continúa? Porque si es de 90 y tú intentas que vaya al 180... y ya ni hablemos si es uno de rotación continua ¿Puedes poner alguna fotografía de tu conexión?

¿Los GND están en común?

Usas delay() así que el led no es precisamente una fuente de información muy fiable.
Acabas antes poniendo tu conexión y especificando que tipo de servomotor tienes.

Veo que no probaste lo que dije. Conecta tu servo pon en el loop que vaya del 0 al 90 y entre medio un delay.

Después si tengo un hueco pongo un ejemplo.

Arduinito:
Pero no juegues con los cables buscando posición ¡¡¡Busca en un diagrama cuales son!!! Vas a romper el servomotor si no lo has hecho ya.

Ahora bien, ¿estamos hablando de un servomotor pequeño? Indícanos el modelo o bien pon una fotografía.
No estarás usando un servomotor grande estilo MG996R ¿No? :cold_sweat: porque entonces sí puede darse el caso que comentaba Matias24 y necesites más potencia. Si no das más información yo presupongo que es un servo normal.

Danos datos que no podemos adivinar y estamos presuponiendo.
¿Es un servomotor de 90º o de 180º o de rotación continúa? Porque si es de 90 y tú intentas que vaya al 180... y ya ni hablemos si es uno de rotación continua ¿Puedes poner alguna fotografía de tu conexión?

¿Los GND están en común?

Usas delay() así que el led no es precisamente una fuente de información muy fiable.
Acabas antes poniendo tu conexión y especificando que tipo de servomotor tienes.

Veo que no probaste lo que dije. Conecta tu servo pon en el loop que vaya del 0 al 90 y entre medio un delay.

Después si tengo un hueco pongo un ejemplo.

Entendido, mal por mi parte. No acabo de conocer el tema electronico demasiado...

Creo que ya he conseguido adjuntar las imágenes, ahí veras gran parte de las respuestas que pides.

Pero por si acaso:

SG90 9 g Micro Servo

Specifications
• Weight: 9 g
• Dimension: 22.2 x 11.8 x 31 mm approx.
• Stall torque: 1.8 kgf·cm
• Operating speed: 0.1 s/60 degree
• Operating voltage: 4.8 V (~5V)
• Dead band width: 10 µs
• Temperature range: 0 ºC – 55 ºC

s.jpg

a.jpg

x.jpg

Ok, tú código tampoco tiene sentido.
Ya me puse a ver como "intentas" mover el servo.

Si le pones un delay de dos segundos... imposible.
Delay bloquea TODO no es una simple pausa (día sí y día también un código no funciona por usar delay).
Estas diciendo mueve y acto seguido párate y vuelve a moverte y vuelve a parar. No le das tiempo ni a respirar, el delay hace que no llegue hasta la siguiente línea.

De todas formas sigo sin saber que tipo de servomotor es... pero pongo un ejemplo, en vez de un sensor a presión es un botón (la idea es la misma).

El código es corto. No entiendo la manía de escribir mil líneas.
El ejemplo encenderá el led al pulsar el botón e irá al ángulo 90. Cuando se suelte irá al ángulo 0.
Y sí, uso delay() pero no de la misma forma.
Salvo que sea un servomotor grande o de rotación continua sólo debes cambiar el máximo de ángulo posible en la función que hice (donde el constrain())

No hacer copy and paste y ya por favor... entender el código, y dudas, preguntar.

#include <Servo.h>
Servo servo1;

const int 
pinBUTTON = 7,
pinSERVO  = 8,
pinLED    = 13;

byte angle = 0;

void setup() {
  servo1.attach(pinSERVO);
  pinMode(pinBUTTON,INPUT);
  pinMode(pinLED,  OUTPUT);
  gotoAngle(angle);
}

void loop() {
  bool stateButton = digitalRead(pinBUTTON);
  digitalWrite(pinLED, stateButton); 
  gotoAngle((stateButton) ? 90 : 0);
}

void gotoAngle(byte newAngle){
  if(newAngle != angle){
    newAngle = constrain(newAngle,0,90); //90º ó 180º dependiendo del servo
    byte unsigned diff = newAngle - angle;
    for(byte i = 0; i <= diff; i++){
      servo1.write(angle + ((newAngle > angle) ? 1 : -1) );
      delay(15);
    }
    angle = newAngle;
  }
}

Es de 180º y funciona perfectamente con 5V. Revisa el esquema anterior que te pasé y cambia:

newAngle = constrain(newAngle,0,90);

a ;

newAngle = constrain(newAngle,0,180);

Y ya nos comentas. Saludos.

EDITO: tambíen la línea gotoAngle((stateButton) ? 90 : 0); -> gotoAngle((stateButton) ? 180 : 0);

Arduinito:
Es de 180º y funciona perfectamente con 5V. Revisa el esquema anterior que te pasé y cambia:

newAngle = constrain(newAngle,0,90);

a ;

newAngle = constrain(newAngle,0,180);

Y ya nos comentas. Saludos.

Eres un genio ! Muchísimas gracias Arduinito me has ayudado muchísimo, todo arreglado !!!
Ahora procurare aprender que es lo que hace el código que me has pasado, quiero saber hacerlo yo mismo para la próxima vez !

Ese el camino, tratar de entender las cosas para hacerlo uno mismo. Nadie nace aprendido. Aunque cada cual programa a su manera una vez pilles algunos conceptos mejorarás rápidamente. Saludos.