Este es el segundo post de los motores usados en robótica, en el post anterior vimos como funciona un motor dc con reductora, en este veremos el funcionamiento del servomotor.

Funcionamiento del servomotor.

Un servomotor es un motor de continua con reductora al igual que el anterior pero tienen algunas diferencias.

Servomotor SG90
Servomotor SG90

Un servomotor además de incluir el propio motor con los piñones de la reductora, lleva también un potenciómetro que gira solidario al motor dc mediante unos piñones o engranajes.

Despiece servomotor 1
Despiece servomotor 1
Reductora del servomotor
Reductora del servomotor

El motor al girar también hace girar al potenciómetro que está conectado a una placa electrónica, esta placa electrónica en función del valor del potenciómetro sabe cuantos grados a girado el motor, lo que lo hace mucho más preciso que un motor de continua normal.

Normalmente los servomotores, como en el caso de este modelo en concreto que estamos estudiando el SG90 de la marca Tower Pro funcionan a una frecuencia de 50HZ, eso quiere decir que la señal de control o data tiene un periodo de 20ms.

Se dispone de tres cables, los colores pueden variar pero en este caso son:

Cable marrón: Alimentación masa GND 0V.

Cable rojo: Alimentación +5Vdc.

Cable naranja: Datos.

curso arduino
CURSO ARDUINO

Si quieres convertirte en un experto en Arduino pincha en el siguiente botón

Por el cable datos introduciremos un pulso a nivel alto, de un determinado ancho, el resto de tiempo hasta los 20ms se ha de poner a nivel bajo, por lo que no podremos hacer una nueva petición hasta haber transcurrido esos 20ms.

En función de la duración del pulso, la placa electrónica interna sabe cuantos grados debe de hacer girar el motor, para ello se ayuda del valor de la resistencia del potenciómetro.

Cronograma del servomotor SG90:

Como puedes observar en el cronograma, si damos un impulso por data de duración 1ms se va a la posición -90º, si es de 1,5ms  se va a 0º y si le damos un impulso de 2ms se va 90º.

Para tiempos intermedios recorrerá el número de grados proporcional.

Grados servomotor
Grados servomotor
Cronograma servomotor

Características técnicas del servomotor SG90:

Peso: 9 gramos

Dimensiones: 22,2*11,8*31 mm

Torque: 1,8Kgf*cm

Velocidad de operación: 0,1s/60º

Voltaje de operación: 4.8V-5V

Rango de temperatura: 0-55ºC

Angulo de giro:180º

Programa de aplicación del servomotor SG90:

En esta ocasión controlaremos el movimiento de dos servos en función de la posición de un joystick.

El Joystick dispone de dos potenciometros uno para el desplazamiento longitudinal y otro para el transversal.

Con lo que leeremos sus valores mediante dos entradas analogicas y conectaremos los dos servos a dos salidas pwm.

Esquema de conexionado del joystick, servos y arduino
Esquema de conexionado del joystick, servos y arduino

Para ello nos serviremos de la librería servo.h que nos facilita el manejo de los servos, pero igualmente podriamos conectarlos a pines de salida digitales normales y mediante delays por ejemplo dar los pulsos durante el tiempo necesario.

Con la librería servo.h tan solo tendremos que indicar a que grados queremos que gire.

/*AUTOR: JOSE ANTONIO RIVERA MORALES
 *FECHA: 25-11-2019
 *www.pasionelectronica.com
 * Este programa controla dos servos que son  
 * manejados mediante un joystick
 */
#include <Servo.h>;//Incluimos la libreia servo.h 
Servo servoLat;//creamos un objeto servo para movimiento lateral
Servo servoLon;//servo para movimiento longitudinal
int valorSlat;//Variables que almacenan la lectura de
int valorSlon;//los potenciometros
void setup() {
  servoLat.attach(3);//indicamos en que pines los
  servoLon.attach(5);//conectaremos
}

void loop() {
  //servo lateral
  valorSlat=analogRead(A0);//leemos el valor del potenciometro
  valorSlat=map(valorSlat,0,1023,0,180);//mapeando hacemos una
  //especie de regla de tres 
  servoLat.write(valorSlat);//le indicamos al servo el número de grados
  //a la que se tiene que posicionar
  //servo longitudinal
  valorSlon=analogRead(A1);
  valorSlon=map(valorSlon,0,1023,0,180);
  servoLon.write(valorSlon);
  
}