Controlar un servomotor con Arduino sin librerías

En este tutorial aprenderemos a controlar un servomotor con Arduino sin usar la librería Servo.h, incluida en el entorno de desarrollo de Arduino. Seguramente te estás preguntando… ¿Por que no usar esta fantástica librería que nos ahorra un montón de trabajo?, la razón es muy sencilla:

Si utilizamos otros shields como drivers para motores DC, módulos GSM/Bluetooth o algunas librerías como Wire.h, etc… habrá ocasiones en las que entrarán en conflicto con la librería Servo.h y nuestro proyecto no funcionará correctamente por culpa los Timers, que son piezas de hardware que actúan como un reloj dentro del corazón de nuestro Arduino.

Arduino tiene varios de estos timers que pueden actuar por separado y que están asociados a unos pines específicos de entrada y salida, por ejemplo, Arduino UNO tiene 3 timers (Timer 0, 1 y 2) y otras versiones de la placa como el Arduino MEGA tienen hasta 6 Timers.

INFO: Muchas funciones de Arduino, por ejemplo delay(), analogWrite() o delayMicroseconds() usan los Timers para medir intervalos de tiempo.

La librería Servo.h utiliza el Timer 1 del Arduino y los pines asociados a este Timer son el D9 y D10, como ya hemos comentado antes, otras librerías, shields o módulos pueden necesitar también el Timer 1 para funcionar, entrando en conflicto directo con la librería servo.h.

Control del servomotor

Un servomotor se controla mediante un tren de pulsos eléctricos de duración variable, la duración de estos pulsos sirve para determinar el ángulo en el que se posicionará el servo.

INFO: Por norma general, los servos aceptan un pulso cada 2.5ms, si enviamos un pulso de 1.5ms nos girará el servo a 90º, un pulso de 0.5ms pondrá el servo a 0º y un pulso de 2.5ms lo pondrá a 180º. Estos valores son aproximados y pueden variar ligeramente según el servomotor que usemos.

servo_pulso_msec

Sketch de prueba

Ahora vamos a ver como enviar ese tren de pulsos al servomotor. Sabiendo que para conseguir 180º en el servomotor debemos enviar un pulso de aproximadamente 2500 microsegundos podemos aplicar una regla de tres:

tiempo = (angulo x 2000) / 180 + 500

La función moverServo recibe como parámetros el pin del Servomotor y el ángulo al que este debe girar. Hemos usado la regla de tres para calcular el tiempo que debe estar encendido del pin digital del servo. El código esta comentado línea a línea:

Controlar la velocidad del giro

Si probáis el código anterior comprobaréis que el servomotor gira muy rápido y a veces esto no nos interesa, para controlar la velocidad del giro del servomotor podemos modificar ligeramente el código y añadir un bucle FOR. El código esta comentado línea a línea:

Si te ha gustado este tutorial no dudes en dejar un like o compartirlo en tus redes sociales.

 

Compartir en redes sociales: