Trucando un servo Towerpro MG995

// // 7 comments
Antes de arriesgarme a comprar estos servos, leí no pocas veces que daban problemas, que eran un desastre o que por lo menos, eran una lotería. Pero igual me decidí a comprarlos seducido por sus supuestos entre 10-13kg de fuerza a razón de apenas 8€ la unidad, envió incluido si la memoria no me falla, desde Guangdong. Y en mi caso, efectivamente fue una lotería.

De dos que compré, uno daba siempre problemas temblando a menudo espasmódicamente o dando pequeños giros bruscos aun estando en reposo y el consumo de voltaje era extraño, parecía querer más que el otro, aunque nunca lo comprobé a ciencia cierta.

Un día llego a su límite y en un giro mortal se le rompieron parte de los engranajes quedando inservible. Algo le debió decir el otro servo que de golpe, estando en reposo, se fue al otro extremo de su posición y no alcance mas que a estremecerme del sonido violentamente crujiente que salió de su interior. Cuando lo abrí para comprobar el estropicio, cayeron en mi mano un montón de dientecitos de latón.

Por contra, el otro funcionaba bien, sin problemas, aunque siempre le costó encontrar su centro, será que no esta en paz con sigo mismo. No sé si mueve 13kg ya que nunca me ha hecho falta, de hecho creo que es mentira cochina, pero al menos 2kg si que los mueve. Eso sí, no se si volvería a apostar 8€ por uno de ellos y menos ahora que me parece que han subido de precio.

El caso es que ese servo superviviente quedo en un cajón durante largo tiempo hasta hará un par de semanas, cuando fué necesario sacarlo del destierro para someterle al siguiente experimento-operación que paso a relatar :

1. Desmontar el servo :

- Sacamos los cuatro tornillos con un destornillador sano, para no fastidiarlos, y lentamente sin tirar demasiado levantamos la tapa trasera teniendo en cuenta que es posible que al hacerlo, también levantemos el circuito, pues la pieza de goma de los cables estará sujeta a la tapa trasera. Así que desprendemos la pieza de goma de la tapa y esta quedara libre.

- Luego retiramos la tapa delantera cuidando que no se nos dispersen los engranajes. Anotamos de alguna manera su posición para luego recordar con facilidad como colocarlos de nuevo en su sitio. Son cuatro engranajes y dos ejes. El que va sujeto al pote, que es el que lleva un rodamiento, me costó algo más sacarlo y tuve que levantarlo poquito a poco haciendo presión hacia arriba desde la base con un pequeño destornillador plano porque a mano era difícil. Una vez están fuera, sobre todo los ponemos a buen recaudo junto con sus ejes.


2. Retirar el potenciómetro y sustituirlo por dos resistencias :

Si el circuito todavía esta en su sitio, lo levantamos también con cuidado y descubrimos debajo un tornillo que sujeta el potenciómetro. En uno de los servos me venia una generosa gota de pegamento termofusible que también alcanzaba al tornillo bloqueándolo, un coñazo, por suerte en el otro no ocurría esto. De ser así quitamos el pegamento o al menos despejamos el tornillo y en cualquier caso lo desatornillamos. Si hemos desmontado los engranajes podremos retirar el motor, circuito y pote sin problemas.

A la derecha dos resistencias de 2490k de 1% : Rojo-Amarillo-Blanco-Marrón-Marrón

Lo siguiente será desoldar el pote para separarlo del circuito y sustituirlo por dos resistencias.
Hay varias maneras y herramientas para desoldar, pero en este caso me ha bastado con calentar el estaño hasta que se suelten los cables ayudándolos con unos alicates. Dependiendo de la práctica que tengamos con el soldador podemos calentar el estaño desde el lado de la pcb o desde el lado del potenciómetro.

En el primer supuesto hemos de evitar recalentar excesivamente o chamuscar el circuito porque podríamos dañar algún componente. Si no estamos seguros, lo que derretimos será el estaño que directamente sujeta el pote dejando los cables libres y conectados a la placa. En ambos casos, no será de mucha ayuda un soporte para circuitos impresos.

Hecho esto, buscamos el valor del pote que en general para los servos suele ser de 5k = 5000 ohms . Indagando por la red veremos que hay muchas opiniones de cara a sustituir el potenciómetro, como poner resistencias de valor 2.2k, cambiar el pote por uno multivuelta con las ventajas que conlleva o incluso directamente sacar todo el circuito para controlarlo mediante un puente en H.

En este caso conservé su circuito y cambié el pote por dos resistencias de 2490k de un 1% de tolerancia. Es decir, por dos resistencias cada una de la mitad del valor del pote original y buscando que la resistencia que hagan sea lo más precisa posible para evitar movimientos involuntarios o imprecisos cuando le enviemos un pulso por una de las salidas PWM del Arduino.

Por lo tanto, una vez tengamos las resistencia solo resta disponerlas entrelazadas por un extremo y soldarlas como se muestra en la foto. Si hemos optado por dejar los cables, viene ser lo mismo pero soldándolas a los extremos de estos, tal como hacen en este tutorial.

Debería quedar algo como así.

3. Quitar el tope del potenciómetro :

Con unos alicates finos o un pequeño destornillador plano levantamos las patillas que sujetan la plaquita donde iban, o están según el caso, los cables soldados. Con cuidado de no forzarlas para que no se rompan ya que no tienen aspecto de soportar demasiadas torsiones. Cuando retiremos la tapita veremos dentro un tope que impide el giro completo del eje. Es como una muesca hacia adentro que debemos quitar para que pueda rotar libremente.



Para eliminar la muesca la aplané contra la pared interna del pote utilizando unos alicates de punta redonda, y luego, convenientemente ataviado para la ocasión con unas GAFAS PROTECTORAS Y GUANTES, la desgasté dándole con una fresa de diamante montada en un minitaladro. Poco a poco hasta que desapareció dejando la cara plana y permitiendo el paso de la base del eje sin problemas. Tiene que girar libre sin que notemos ningún roce ni obstrucción.


Luego volvemos a cerrar el pote vigilando que las patillas que hacen contacto con la base queden bien colocadas y comprobamos una vez mas que gire bien sin notar nada raro. 





Insertamos el susodicho potenciómetro en su sitio, colocamos el tornillo que lo sujeta y luego montamos el circuito que encaje también en su lugar.

4. Quitar el tope del engranaje :

El engranaje que lleva el tope lo fijamos bien firme en un tornillo de banco o similar sin que se mueva ni un ápice. Es conveniente por seguridad que el tornillo de banco o pieza sobre la que agarremos el engranaje este a su vez también bien fijo a la mesa para evitar tener que maniobrar con una mano la herramienta y con la otra sujetar el tornillo de banco. Así nos podremos concentrar bien en atacar con mayor acierto al tope.




Luego con un disco de corte abrasivo montado en un minitaladro seccionamos el tope cuidando no dañar los dientes del engranaje. Cabe decir que si no disponemos de un minitaladro o similar, seguro que hay otras maneras de hacerlo "manualmente" pero si es posible , directamente iría a lo seguro, utilizando esa herramienta..

5. Montarlo todo y ponerlo en funcionamiento :

Con los topes eliminados y el potenciometro sustituido, podemos volver a montarlo todo y de paso aprovechar para poner algo de grasa en los engranajes. En este punto también hay varias opiniones, no obstante, en estos casos con elementos metálicos, la grasa de litio siempre me ha dado buenos resultados, no es cara y es fácil de encontrar en ferreterías industriales.



Una vez esta todo montadito, solo queda cerrarlo y conectarlos al Arduino para comenzar a usarlo.



6. El Cacharro girando :

Tan solo añadir que si para la libreria Servo, el centro esta en 90º, lo cual en nuestro sketch se traduce en, por poner un ejemplo, myservo.write(90), ya que le daríamos grados para posicionarlo tal como si de un servo normal sin modificar se tratase.

Pues bien, lo que ocurre es que al cambiar el pote por resistencias, ese valor cambia tal como explican aquí. Y en mi caso, por ejemplo, el centro se desplazó a 92º, por lo que en mi sketch para bloquearlo en esa posición la cosa queda en myservo.write(92).  Sabiendo eso, si me alejo de 92 hacia abajo 91, 90...20..0. girara en un sentido, y si subo 93, 94...100..180 girará en otro y dependiendo de la diferencia con nuestro centro, en mi caso 92º irá mas rápido o más lento, aunque este último aspecto mejor hay que probarlo para ver como se comporta.

Dejo un código que hace lo que veréis en el video del final.

-------------------------------------------------------------------------------------
//  buncetodisk.net 

#include <Servo.h>;  // Incluimos la libreria servo
Servo myservo;  // Creamos una variable para el servo

void setup() { 
} 

void loop() { 
    
  delay(3000);   // Pausamos 3 segundos antes de dar comienzo.
  
  myservo.attach(10); // Asocia la variable al pin donde está conectado el servo.
  myservo.write(94); // Gira lentamente en una dirección durante 4 segundos.
delay(4000);
  
  myservo.write(180); // Gira más rápido durate 1 segundo. 
delay(1000);
  
  myservo.write(94);
delay(5000);
  
  myservo.write(180);
delay(1000);
  
  myservo.write(94);
delay(5000);
    
  myservo.detach(); // Desasocia la variable Servo de su pin
    
}

------------------------------------------------------------------------------------



Si alguien ve alguna incorrección, error gordote  u omisión importante, desde luego hacedlo saber. Gracias!.

7 comentarios: Leave Your Comments

  1. hola, esta muy bien tu articulo, solo que no me queda claro porque sustituir el potenciometro por 2 resistencias?? es porque se daña el potenciometro en el proceso?? y otra cosa tengo tambien 2 servos mg995 solo que los colores de los cables son naranja,rojo y cafe(marron), como soy nuevo en esto de los servos queria saber cual cable es que? me imagino que rojo va a positivo, el cafe a tierra o masa y el naranja es de PWM, espero me confirmes esa parte.
    Ah y lo quiero controlar con un MSP430 de Texas Instruments. Espero tus respuestas y si me puedes dar algunos consejos para estos servos
    Gracias por responder!!!
    mi correo es toche_yo@hotmail.com

    ResponderEliminar
  2. Hola Jorge,

    El potenciómetro lo conservamos para que siga haciendo de eje a un engranaje, pero por otro lado al quitarle la muesca que bloquea su giro, efectivamente lo estamos dañando y ya no le hace servicio a la electrónica de control del servo. Es decir que deja de ser útil para ubicar el servo en función del valor que entregue el pote. Por lo tanto lo sustituimos por dos resistencias equivalentes para que la electrónica "siga creyendo" que hay uno. Aquí lo explican mejor : http://es.wikipedia.org/wiki/Servomotor_de_modelismo#Control_de_posici.C3.B3n

    Luego, también me paso que de los dos servos uno venia con esos colores y efectivamente es lo mismo, Naranja es el control y el rojo con el color café son alimentación.

    La tarjeta que mencionas no la conozco pero parece un cacharro muy muy interesante y como consejo no se me ocurre mucho, salvo que trastees todo lo necesario con estos servos y cuando tengas claro lo que harás,invertir en unos mejores.

    Saludos!

    ResponderEliminar
  3. Muchas gracias por el tutorial! ya trunque mis mg995 con las resistencias y todo, quedo barbaro, ahora me pregunto, como hacer reversa?

    ResponderEliminar
  4. Gracias Santiago, me alegro de que te haya sido de ayuda!.

    No termino de entender tu pregunta, ¿te refieres a que gire en sentido contrario? Depende del valor que tengas como centro en la función myservo.write() . A riesgo de responderte de forma redundante, te pego un fragmento del articulillo :

    "....el centro se desplazó a 92º, por lo que en mi sketch para bloquearlo en esa posición la cosa queda en myservo.write(92). Sabiendo eso, si me alejo de 92 hacia abajo 91, 90...20..0. girará en un sentido, y si subo 93, 94...100..180 girará en otro y dependiendo de la diferencia con nuestro centro..." .

    Quiero decir que cuando mando al servo a esa instrucción, este se queda quieto, fijo en esa posición hasta que le envíe otra nueva. En mi caso es 92, en el tuyo puede ser otro valor, asi que tómalo a modo de ejemplo. Todo lo que sea por encima de 92 ira en una dirección y por debajo irá en la otra dirección. Tal como queda dispuesto el servo tras la manipulación es lo único que puede hacer, a mayor o menor velocidad, pero nada más.

    No se si te referías a eso exactamente ni si te he respondido útilmente. Ahora mismo no estoy muy puesto con estos temas y ya me costo en su momento por lo que ahora que no lo tengo muy fresco no puedo extenderme mucho al no poder comprobarlo deforma práctica. Pero puedo intentar ayudarte si lo necesitas. O al contrario, si hayas la respuesta que buscas, no dejes de compartirla en esta entrada.
    Saludos!

    ResponderEliminar
    Respuestas
    1. ahh claro entiendo amigo! disculpa, no habia entendido lo de los 92 grados pero era eso si lo que pregunté, muchas gracias!

      Saludos

      Eliminar
  5. Amigo gracias por tu tuto.

    Pero tengo un problema compre 3 servos Mg995 como los tuyos y los quiero manejar con arduino y potenciometro cada uno.

    Vos que sabes bastante me podrias ayudar con decir si tengo que conectar los servos con fuentes externas de 5.5 V y si al usar este.
    codigo algo esta mal. Lo copie de otro tuto pero para un servo mas pequeño aunque la salida de voltaje si no estoy mal es de 5.5 v.
    PD: El problema es que llega a un punto en el que comienzan a temblar y no lee bien la lectura del potenciometro.
    Por cierto solo estoy conectando un servo
    Gracias de antemano.
    j
    /*
    Servo
    Este codigo controla un sevo y lo posiciona en un angulo dependiendo del valor del potenciometro.

    Emplea las salidas digitales 9 en formato PWM y la libreria Servo.h

    Este ejemplo es de dominio publico.
    */

    //Importa la libreria Servo.h
    #include

    Servo miservo; // Crea un objeto servo

    // Establece las constantes a utilizar
    const int sensorPin = 0; // Establece que pin vamos a utilizar como entrada analogica

    // Establecemos las variables a utilizar
    int sensorVal; // Establece la variable que almacena la lectura del Potenciometro

    void setup()
    {
    miservo.attach(9); // Establece el pin 9 como salida del objeto miservo
    }

    void loop()
    {
    sensorVal = analogRead(sensorPin); // Lee el valor del potenciometro con valores entre 0 y 1023
    sensorVal = map(sensorVal, 0, 1023, 0, 179); // Mapea el valor de entrada del potenciometro entre 0 y 179 grados
    miservo.write(sensorVal); // Posiciona el servo en la posicion mapeada
    delay(15); // Espera 15 milisegundos
    }

    ResponderEliminar
  6. Compre dos servomotores de este tipo como de rotación continua los probé y efectivamente rotan continuamente pero solo en una sola dirección por mas que modifico el código y calibro no logro que giren al otro lado. ¿Si cambio el potenciometro por dos resistencias podría conseguir tal efecto?

    ResponderEliminar