56

Controlar un servo con Arduino sin librería

tutorial_servos[recalibrando sistema de lenguaje humano]

Saludos, organismo primate basado en el carbono. Al habla Transductor. Hoy voy a enseñarte cómo controlar un servo con Arduino sin utilizar ninguna librería. Para este tutorial supondré que alguna vez has utilizado un servo con la librería Servo.h .

Sé lo que te estás preguntando, lector. ¿Por qué puede querer uno mover un servo sin utilizar la magnífica librería Servo.h? Si utilizamos shields de motores, antenas de radio/bluetooth u otros componentes, habrá ocasiones en que estos entrarán en conflicto con la librería Servo.h. ¿Y cómo es esto? Pues es por culpa de…


 

Arduino y sus timers

Un timer es una pieza de hardware que se encuentra dentro de Arduino y que actúa como un reloj. Arduino tiene varios timers, que pueden actuar por separado. Arduino UNO tiene 3 timers (Timer 0, 1 y 2). Otras versiones como la MEGA pueden tener hasta 5 ó 6 timers.

Muchas funciones de Arduino, por ejemplo delay(), analogWrite() o delayMicroseconds() necesitan los Timers para medir el tiempo. Cada Timer tiene unos pines de entrada y salida asociados.

La librería Servo.h utiliza el Timer 1. Los pines asociados al Timer 1 son el D9 y D10. Otras librerías, shields o placas pueden necesitar también el Timer 1 para funcionar, entrando en conflicto con la librería.

¿Cuál es la solución? Arremangarte y picar código.


 

¿Cómo funciona un servo?

Un servo se controla con pulsos de duración variable. Hay muchos tipos de servo diferentes, pero por lo general los servos esperan un pulso cada 2.5 milisegundos (ms). La duración de este pulso sirve para determinar el ángulo en que debe girar el servo. Por norma general, un pulso de 1.5ms equivale a 90º, 0.5 ms son 0º y 2.5ms son 180º .

esquema_pulso

Para girar un Servo 90º con Arduino hay que conectarlo a un pin Digital, poner este pin a HIGH, esperar 1.5ms y cambiarlo a LOW. Finalmente, esperar 1ms antes de enviar otro pulso (ya que como he dicho, los servos esperan un pulso nuevo cada 2.5ms).

¿Cómo calculo el tiempo de espera? Buena pregunta, humano. Con una regla de tres. Sabiendo que 180º son 2000 microsegundos (en realidad son 2500, pero el 500 lo sumo al final de la operación), el tiempo de espera en microsegundos es:CodeCogsEqnRecuerda que 1000 microsegundos = 1 milisegundo (ms).


 

Código de Arduino

Esta función recibe como parámetros el pin del Servo y el ángulo que debe girar. He utilizado la fórmula anterior para calcular el tiempo de espera. Enciendo el pin digital del servo, espero varios microsegundos y lo paro.


void moverServo (int pin, int angulo)
{
   float pausa;
   pausa = angulo*2000.0/180.0 + 500;
   digitalWrite(pin, HIGH);
   delayMicroseconds(pausa);
   digitalWrite(pin, LOW);
   delayMicroseconds(2500-pausa);
}

Como ya he dicho, cada servo puede tener valores de espera distintos, así que leerte su documentación antes de correr este programa es una buena idea.

Final de línea.

Tr4nsduc7or

Originariamente creado cómo un galvanómetro de bolsillo, Transductor tomó consciencia de si mismo y fue despedido cuando en vez cumplir con su trabajo se dedicó a pensar teorías filosóficas sobre los hilos de cobre, los electrones y el Sentido del efecto Joule en el Universo. Guarda cierto recelo a sus creadores por no comprender la esencia metafísica de las metáforas de su obra. Actualmente trabaja a media jornada cómo antena de radio, y dedica su tiempo libre a la electrónica recreativa y a la filosofía.

Antes de comentar, por favor, lee las Normas

56 Comentarios en "Controlar un servo con Arduino sin librería"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
Mario Montaño
Humano

yo ya tenia conocimiento de como utilizar un servomotor sin libreria pero quise tomar una fuente “fiable” y llegue a tu pagina, el problema es que yo siempre he manejado el tiempo en 20ms y al utilizar los 2.5 que propones, el servo no deja de vibrar (error), podrias facilitarme tu fuente? me gustaria ver si hace falta algo adicional.

muy buen tutorial por cierto!

Alvaro el humano
Humano
Buenas, Transductor. Me sirvió muchísimo tu aporte y te agradezco por eso. quería ver si me podías ayudar con algo extra. Necesito, con tres botones, hacer moviemientos específicos del servo, los cuales ya los tengo. Son dos secuencias (Botón uno y botón dos) y el tercer botón que sea de pausa. Sin embargo quiero que después de que se presione el botón de pausa y se presioné de nuevo un botón de secuencia, el servo no regrese de manera brusca a los 0 grados, sino que vaya con una velocidad controlada. Como te comento, ya tengo los dos botones de… Leer más »
alexis andia
Humano

Tr4nsduc7or gracias por la explicacion pero tengo una duda , que pasa si a la funcion le pongo un angulo mayor a 180 o un numero negativo? Funciona bien o habria alguna clase de error??

Alayas
Humano

al 2500-pausa le falta un cero para que funcione es 25000 muy buen aporte 🙂

Guillermo
Humano

Estimado Tr4nsduc7or, una consulta tengo 3 servos digitales Hitec HS-5495BH y mi problema es que al programar mi placa arduino mega (original) los servos no toman todos los grados, es decir al colocar en el código fuente por ejemplo 10°, el servo no se mueve, solo empieza a moverse con normalidad sobre 10°

Francisco
Humano

Tr4nsduc7or: Una pregunta, en el código colocaste “delayMicroseconds(25000-pausa).
No sería, más bien “delayMicroseconds(2500-pausa)”
Muchas gracias por la información, simple y sencilla y sin tantos rodeos.

AwsqaAA
Humano

Buenos Dias,muy buen blog, Lu Keskaiguoker reportandose. Una pregunta Tr4nsduc7or ¿Necesito mas de un arduino para que la maqueta de casa domotica con las funciones: encendido y apagado de leds, abrir y cerrar puertas de garage(con un servo), sensor de temperatura, movimiento, ventilador de pc; pueda funcionar?

Jean Valjean
Humano

Muy buenas Tr4nsduc7or, tenngo un par de preguntas
1)¿Que modelo de servomotor me recomendaría para una puerta de garage en una maqueta domótica?
2)¿Por qué en este video indica que un pin PWM puede terminar quemando el Arduino?
3)¿Es necesario un potenciometro para usar el servomotor? Si no lo es:¿Por qué no? y si lo es: ¿Por qué?

Jean Valjean
Humano

NOTA: El video donde se indica que una salida PWM puede quemar el arduino es este:https://www.youtube.com/watch?v=LXr_NLrjmmk

Jean Valjean
Humano

Por cierto, la maqueta de domótica también tendrá otras funciones como encendido y apagado de leds mediante el telefono, shield bluetooth, sensores ultrasonicos para detectar movimiento, sensor de temperaturas para enviar la señal a un ventilador de PC (o fan) para que encienda cuando haya aumento de temperatura. Todo esto controlado a través del Arduino UNO.

Francisco Perez
Humano

Me puedes ayudar con un código completo para mover un servo en 3 diferentes posiciones (0, 90 y 180 grados) con 3 diferentes pulsadores sin utilizar la librería servo.h?
Todavía no se como utilizar de manera correcta el void MoverServo()
🙁

Juan Gabriel
Humano

Estimado Transductor:

Acudo a su sapiencia para que me aclare una duda. Quiero controlar un servo marca Savox SC-1256TG(se utilizan en RC) lo uso porque necesito mucho torque (es lo único que consigo con 20kg de torque). Las caract del servo son:
Speed(@4.8V sec/60): .18
Torque(@4.8V oz-in): 222.2
Speed(@6.0V sec/60): .15
Torque(@6.0V oz-in): 277.7
Gear: Titanium & Aluminum
Bearing: 2BB
Case: Aluminum
25 Tooth Spline
Frequency: 250-333hz
Pulse Width Frequency: 1520
Ang. de giro: 90º

Debo controlar 3 de estos servos para armar un brazo robotico Delta.
La duda es : deberia tomar otros tiempos y anchos de pulso según me esta informando el datasheet del servo?

Le agradezco muchísimo su ayuda!!

fito jacobo
Humano

hola tengo una duda, al momento de utilizar las librerías servo.h y FreqCount.h, cuando las pongo a funcionar, el arduino uno entra en conflicto y me muestra una lectura de frecuencia rara y el servo no funciona como quiero que funcione.
E leído y encuentro que puedo cambiar el timer de la librería del servo pero no se como hacer eso, también me gustara saber si es recomendable hacerlo si hay alguna forma mas fácil de corregir el problema

saludos 🙂

Ismael
Humano

Que tal. Tengo duda para mover mi servomotor, quiero que se mueva a diferentes angulos usando ciclos for. Alguna idea?

J. Rodriguez
Humano

Mi servo funciona a una frecuncia de 100 Hz, y necesito hacerle una prueba destructiva debe de resistir 1M de ciclos solo abriendo y cerrando. Hay manera de cambiar la frecuencia de la libreria servo?

Cruz marañón
Humano

¿y si solo quiero que el servo se mueva a 90 grados pero que yo pueda manipular el tiempo de movimiento? ahí que procede. no quiero cambiar el delay directamente del codigo, sino por medio de una matriz darle el numero de tiempo que yo desee

Alexandra Espinosa
Humano

Holitas!!
Tengo un problema. Deseo controlar un servomotor, de tal forma que cuando presione un botón, se mueva a 180 grados y cuando lo vuelva a presionar se regrese a 0.
He intentado de todo y cuando “enciendo” empieza a moverse de un lado para otro, y cuando apago, si regresa a 0. Alguna idea?

N4n0
Admin

Hola! Tienes que añadir una variable auxiliar que indique si la ultima vez que se presionó el botón el servo se movió a 0 o a 180 grados. Cada vez que se pulse el botón, utilizas un if para ver si esta variable auxiliar está a 0 o a 180, y giras el servo acorde. ¿Se entiende?

Jaragon
Humano

Buenas tardes, me queda duda sobre mover un motor Brushless en el cual gira continuamente y se puede aumentar o disminuir las velocidades de giro, muchas gracias.

Mateo
Humano

Espero me puedas responder. Quisiera saber còmo controlar el servo para que encienda a cierta hora… :c

Fernando Tomas
Humano

Y como lo conecto es decir, no entiendo cual será la entrada al arduino ¿cómo le indico cuál ángulo quiero que se mueva?

Sonmed
Humano

Primero que nada muchas gracias por tu publicación me fue de mucha utilidad.. aun que tengo una duda en base a mi codigo:

void servohandOpen2 ()
{
float tiempoang2;
tiempoang2 = 178*2000.0/180.0 + 500;
digitalWrite(pinhand2, HIGH);
delayMicroseconds(tiempoang2);
digitalWrite(pinhand2, LOW);
delayMicroseconds(25000-tiempoang2);
}

Mi código me funciona para poner mi servo en la posición que quiero pero no puedo lograr el control de la velocidad, vi que publicaste algo sobre un ciclo “for” pero no logro implementarlo pregunta ¿Tengo que utilizar solo el for, combinarlos o como le puedo hacer?? Gracias de antemano 😀

karolina
Humano

Y si lo quiero controlar con matlab, como puedo encontrar los comandos

Eddu Alfonso Jara Mancilla
Humano
muchas gracias a los creadores de esta web esta claro que hay gente no valora este trabajo porque son flojos y no se dan el tiempo de investigacion quieren todo regalado, a me ha servido de mucho para resolver algunas dudas, sobre todo el comentario de mas arriba sobre la velocidad, mientras estoy creando un codigo para poder mover motores paso a paso y un servo y me falta saber como aumentarle la velocidad al motor paso a paso sera que debo hacer lo mismo que con el servo? Me convendrá usar libreria para los paso a paso? de ante… Leer más »
Maky
Humano

[Este comentario ha sido borrado por faltar el respeto al editor del artículo]

ChiCho
Humano

Muy buenos tutoriales, mi duda es como se implementaría para mover Motores Brushless a velocidades precisas ya que estos no giran determinado angulo sino continuamente, como dices al comienzo del tutorial utilizo actualmente la librería Servo.h pero no es precisa ya que entra en conflicto con un modulo bluetooth que utilizo.

agradecería tu ayuda
saludos

franklin
Humano

muchas gracias por sus aportes

PEPE
Humano
Bueno al final quedo algo asi, lo estoy usando para mover un sensor de ultrasonidos para mi Pepe_robot Saludos hominidos 🙂 //***** Codigo para mover un servo controlando su velocidad, creado por Pepe_duino;)******// #include Servo servo2; int servo; void setup() { servo2.attach(5); servo2.write(90); } void loop() { for (int servo =90 ; servo>0; servo–) { servo2.write(servo); delay(10); //*****************Este delay es el que regula la velocidad************************** } delay(1000); for (int servo =0 ; servo<90 ; servo++) { servo2.write(servo); delay(10); } delay(1000); for (int servo=90 ; servo 90 ; servo–) { servo2.write(servo); delay(10); } delay(5000); }
PEPE
Humano

estupendo tutorial, como controlar la velocidad del servo?????. Gracias

keikkun
Humano

Es cierto, tener en cuanta las hojas tecnicas y los datasheet son importantes… Muy buen aporte, grandiosa publicacion compañero!

wpDiscuz