Aprender

Control a servo motor with an Arduino and a potentiometer

Principiante

O mira todas las lecciones.

  • 503componentes en el banco de trabajo
  • 44placas funcionando ahora
  • 1.00xtiempo real, en todas las placas
Arduino Uno: servo con potenciómetro deslizablelive0.000 s 0.00x
Haz clic para abrirlo en el editor
El ejemplo servo: un potenciómetro deslizable en A0 ajusta el ángulo de un servo en el pin 9. Ábrelo en el editor para mover el deslizador.

Un servo de hobby es la forma más fácil de hacer que un Arduino mueva algo a un ángulo exacto: tres cables, un pin de señal y un número de 0 a 180. El circuito de arriba es un servo tipo SG90 en el pin 9 de un Arduino Uno, con un potenciómetro deslizable en A0 que define hacia dónde apunta el brazo. Está corriendo en tu navegador en un ATmega328P simulado.

Ábrelo en el editor y arrastra el deslizador mientras corre: el brazo va al nuevo ángulo a la velocidad de un SG90 real, y el monitor serie imprime la lectura y el ángulo cada vez que cambia.

What you need

  • Un Arduino Uno
  • Un servo de hobby SG90 (o similar)
  • Un potenciómetro de 10 k (aquí uno deslizable; uno giratorio se conecta igual)
  • Una protoboard y cables jumper

Wiring

Componente y pinVa aNota
Cable café del servo (GND)GND
Cable rojo del servo (VCC)5 VPor debajo de 4 V el servo no se mueve nada
Cable naranja del servo (señal)Pin 9Cualquier pin digital funciona
Extremo 1 del potenciómetro5 V
Extremo 3 del potenciómetroGND
Cursor del potenciómetroA0Lee de 0 a 1023 en todo su recorrido

Lo que realmente escucha un servo

El cable de señal del servo no recibe PWM en el sentido en que lo hace un LED. El ciclo útil no significa nada para él. Lo que mide es el ancho de cada pulso: con los números de la biblioteca Servo, 544 microsegundos ponen el brazo en un extremo, 2400 microsegundos en el otro y 1472 microsegundos a la mitad, repetidos unas cincuenta veces por segundo. El servo mantiene lo último que se le indicó y va hacia ahí a su propia velocidad, más o menos una décima de segundo por cada sesenta grados.

Por eso tampoco puedes manejar un servo con analogWrite() en un Uno. El PWM del Uno trabaja a unos 490 o 980 hertz, demasiado rápido para que un servo lo lea como ancho de pulso. La biblioteca Servo genera el pulso por sí misma.

El código, explicado

El sketch lee el potenciómetro cuatro veces y promedia las lecturas, para que el brazo no tiemble por el último bit, el más ruidoso, del convertidor. map() convierte de 0 a 1023 en 0 a 180 grados, write() envía el pulso correspondiente y el ciclo espera 20 milisegundos, que es el periodo de trama del propio servo. El ángulo solo se imprime cuando cambia, así que el monitor serie se lee como una frase y no como una cascada.

El ciclo, del ejemplo servo (recortado)
void loop() {
  long sum = 0;
  for (int i = 0; i < 4; i++) {
    sum += analogRead(FADER);
  }
  int reading = (int)(sum / 4);
  int angle = (int)map(reading, 0, 1023, 0, 180);

  horn.write(angle);
  delay(20);
}

Lo mismo con la biblioteca Servo

El ejemplo integrado usa el header de servo propio de Mokxi, pero las llamadas de la biblioteca Servo de Arduino compilan tal cual, en todas las placas que compilan en el navegador. El clásico sketch sweep de abajo corre sin cambios, con los anchos de la biblioteca original: attach(pin) usa de 544 a 2400 microsegundos, write(90) envía 1472, y attach(pin, min, max) fija otra ventana. Hay una pequeña diferencia que vale la pena conocer: cada write() envía un solo pulso en lugar de iniciar un timer, así que un sketch que necesita mantener el servo bajo carga llama a refresh() desde loop().

Para un tutorial de ESP32, ESP32Servo.h es la misma clase con el nombre que usan esos tutoriales.

El sweep de la biblioteca Servo, tal como compila aquí
#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  for (int pos = 0; pos <= 180; pos++) {
    myservo.write(pos);
    delay(15);
  }
}

Pruébalo en el editor

Abre el circuito en el editor y cambia la llamada a map() por map(reading, 0, 1023, 45, 135). Ahora el deslizador solo cubre los noventa grados del centro, que es como le das a una perilla un control más fino en un rango más pequeño.

Luego selecciona el servo y mira sus propiedades: min_pulse, max_pulse, range y speed. Pon la velocidad en 60 grados por segundo y mueve rápido el deslizador; ahora el brazo lo sigue lentamente, como lo haría un servo grande y lento. min_pulse y max_pulse son 544 y 2400 de forma predeterminada, la ventana de la biblioteca Servo; un servo configurado con attach(pin, 1000, 2000) también necesita 1000 y 2000 ahí.

Para manejar un segundo servo, arrastra otro al lienzo, conecta su señal al pin 10 y agrega un segundo objeto Servo en el sketch.

Common mistakes

Alimentar el servo desde la placa y esperar que todo esté bien. En la vida real, un SG90 puede jalar un cuarto de ampere cuando se atora, suficiente para hacer que un Uno alimentado por USB se quede sin voltaje, y es la razón más común por la que un proyecto con servo se reinicia solo. El simulador no modela la corriente de la fuente, así que un circuito que en tu mesa se caería aquí funciona sin problemas. Si lo armas en la vida real, dale al servo su propia fuente de 5 volts y une las tierras.

Olvidar la tierra común. La señal se mide contra la tierra del propio servo, así que si las dos fuentes no comparten nada, el pulso no significa nada.

Pedir ángulos que el servo no puede alcanzar. Un pulso más allá de cualquiera de los extremos de la ventana del servo deja el brazo en ese extremo, igual que un SG90 real forcejea contra su tope. Si el brazo se queda antes de 0 o de 180, revisa que la ventana de attach() coincida con min_pulse y max_pulse del servo.

Actualizar el servo en un ciclo apretado sin delay. Enviar pulsos más seguido que cada 20 milisegundos no sirve de nada, porque el servo solo se actualiza a su propia frecuencia de trama.

Preguntas

¿Qué pines de Arduino pueden manejar un servo?

Cualquier pin digital. La biblioteca genera el pulso por software, así que el servo no necesita uno de los pines PWM marcados con una tilde.

¿Puedo manejar dos servos a la vez?

Sí. Crea dos objetos Servo en dos pines y escribe en cada uno. Dales a los servos reales su propia fuente cuando haya más de uno, porque la corriente se suma.

¿Por qué tiembla mi servo?

Normalmente porque la lectura que sigue tiene ruido. Promediar algunas muestras de analogRead(), como hace este sketch, o ignorar cambios de uno o dos grados, lo estabiliza. En hardware real, una fuente que se cae también causa temblores.

¿Cuál es la diferencia entre un servo y un motor a pasos?

Un servo va a un ángulo y lo mantiene, con su propia retroalimentación interna, normalmente en un rango de 180 grados. Un motor a pasos gira por pasos contados, todo lo que quieras, y no tiene idea de dónde está a menos que tú cuentes. El tutorial del motor a pasos explica el 28BYJ-48.

Ármalo en la vida real

Abre el editor, cambia un valor y mira cómo el número cambia con él. Nada que instalar y sin necesidad de cuenta.