Qué es un Servomotor
Un servomotor, también conocido como servo, es un actuador rotativo que ofrece un control preciso de posición angular, aceleración y velocidad, algo que no puede hacer un motor eléctrico normal, o al menos no son variables tan sencillas de controlar como con un servomotor.
Se tiene que aclarar que los servomotores no son una categoría de motores. En realidad, son un sistema compuesto de partes eléctricas, mecánicas y electrónicas, normalmente se componen de un motor de corriente directa, un engranaje reductor y un sensor de posición.
Características del ServoMotor
TowerPro SG90 9 g Micro Servo
Para indicar la posición a la que debe moverse el servomotor se utiliza un PWM con un pulso de trabajo de entre 1 ms y 2 ms con un periodo de 20 ms (50 Hz). Esto quiere decir que solo podremos cambiar de posición cada 20 ms.
Hay que considerar que este modelo de servo tiene una restricción de movimiento de 180 grados de giro.
Especificaciones:
• Peso: 9 gramos
• Dimensión: 22,2 x 11,8 x 31 mm aprox.
• Par de parada: 1,8 kgf·cm
• Voltaje de funcionamiento: 4,8 V (~5 V)
• Ancho de banda muerta: 10 μs
• Rango de temperatura: 0 ºC – 55 ºC
Conexión y programacion del servomotor con Arduino
Conexión servomotor con Arduino Uno
Código para utilizar el Servomotor
Para facilitar el control de un servomotor en Arduino existen librerías con funciones muy sencillas de utilizar. La librería que utilizaremos será la de <servo.h>
Para utilizar un servo con esta librería se debe crear un objeto y sobre este se utilizan distintos métodos, los más comunes son:
- attach(): Indica el pin digital del Arduino en el que el servo estará conectado, como recomendación utilice los pines PWM~ del microcontrolador.
- write(): Escribe un valor en el servo, causando un moviemiento de la flecha. En un servo estándar como los que estaremos utilizando en esta práctica, el número escrito equivale a el ángulo del eje (en grados), moviendo el eje a esa orientación. En un servo de rotación continua (Es decir, que puede girar más de 180 grados), establecerá la velocidad del servo (siendo 0 la velocidad máxima en una dirección, 180 la velocidad máxima en la otra y un valor cercano a 90 detendrá el movimiento).
- read(): Lee el ángulo actual del servo (el último valor escrito con el método «write()»).
A continuación hay un código ejemplo del movimiento entre 0 y 180 grados de un servomotor.
/*
---------------------Nullius Tutoriales---------------------
Creado por Nestor Duran <https://nulliuscloud.com/>
Este código de ejemplo es de dominio público.
*/
#include <servo.h> //Para facilitar el uso de Servomotores en arduino se utiliza la libreria <servo.h>
Servo SM; //Creamos el objeto SM (ServoMotor)
void setup(){
SM.attach(9); //Le indicamos a Arduino que el servo estará conectado en el pin 9
}
void loop(){
SM.write(0); //Indicamos al servomotor que se mueva a la posición "0 grados"
delay(500); //Esperamos medio segundo (500 ms)
SM.write(180);//Indicamos al servomotor que se mueva a la posición "180 grados"
delay(500); //Esperamos medio segundo (500 ms)
//El ciclo se repite
}
Control de velocidad
El código anterior mueve la flecha del servomotor a la posición deseada, sin embargo lo hace con una velocidad arbitraria. No existe una manera directa de controlar la velocidad de un servomotor, si el tema de la precisión y la velocidad son importantes en el proyecto que estes trabajando una mejor opción es utilizar un Motor a Paso.
Aún así existen trucos para regular la velocidad a la que la flecha de un servomotor se mueve, uno de ellos es utilizar un ciclo «for()». En cada ciclo se avanza 1 grado con un tiempo de espera entre ciclos, entre más grande este tiempo, dará la impresión de que la flecha se mueve más lento.
Un ejemplo de esto sería el siguiente código:
/*
---------------------Nullius Tutoriales---------------------
Creado por Nestor Duran <https://nulliuscloud.com/>
Este código de ejemplo es de dominio público.
*/
#include <servo.h> //Para facilitar el uso de Servomotores en arduino se utiliza la libreria <servo.h>
Servo SM; //Creamos el objeto SM (ServoMotor)
int tiempo = 15; //Variable para guardar el tiempo entre cada ciclo de los "for()"
void setup(){
SM.attach(13); //Indicamos a Arduino que el servo estará conectado en el pin 13
}
void loop(){
for (int i=0; i<=180; i++) { //Ciclo for que inicia en 0 y termina en 180
SM.write(i); //Aprovechamos la variable i para escribir ese ángulo en el servomotor (0-180)
delay(tiempo); //Espera de 15 milisegundos entre cada ciclo
}
//Ahora haremos un for para el regreso de la flecha
for (int i=180; i>=0; i--) { //Ciclo for que inicia en 180 y termina en 0
SM.write(i); //Aprovechamos la variable i para escribir ese ángulo en el servomotor (0-180)
delay(tiempo); //Espera de 15 milisegundos entre cada ciclo
}
//El ciclo se repite
}
Control de un servomotor con potenciómetro
Para esto haremos uso del Convertidor Analógico-Digital de Arduino, revisar la entrada de «Señales Analógicas y ADC».
Utilizaremos el pin A0 para conectar la señal analógica del proveniente del potenciómetro, con la función analogRead() convertiremos el valor analógico (Voltaje) leído en el pin A0 a un valor digital de 10 bits (1023 valores posibles).
Luego remapeamos el valor obtenido de un rango de 0 – 1023 (Valor regresado por analogRead()) a 0 -180 (Valor del ángulo del servomotor).
Finalmente escribimos la posición en el servomotor para hacerla coincidir con la posición del potenciómetro.
El código es el siguiente:
/*
---------------------Nullius Tutoriales---------------------
Creado por Nestor Duran <https://nulliuscloud.com/>
Este código de ejemplo es de dominio público.
*/
#include <Servo.h> //Para facilitar el uso de Servomotores en arduino se utiliza la libreria <servo.h>
Servo SM; //Creamos el objeto SM (ServoMotor)
int val_pot; //Variable para guardar el valor del potenciometro leído por la función analogRead()
int val_pot; //Variable para guardar el valor remapeado de la posición del servomotor
void setup(){
SM.attach(9); //Le indicamos a Arduino que el servo estará conectado en el pin 9
pinMode(A0,INPUT); //Configuramos el pin A0 como una entrada
}
void loop(){
val_pot = analogRead(A0); //Usar el ADC para digitalizar el valor analógico leído del pin A0
int pos = map(val_pot, 0, 1023, 0, 180); //Remapear el valor de 0-1023 a 0-180 y guardarlo en la variable pos
SM.write(pos); //Escribir la posición en el servomotor
delay(50); //Este simplemente es un delay para evitar la sobresaturación del microcontrolador
}