Servo SG90 Arduino

Cómo conectar un servo a Arduino

Un servomotor es un motor que incluye unos engranajes reductores y que se controla la posición mediante programación. Los servos los podemos usar por ejemplo para controlar la posición de un alerón en un avión radio control, para controlar la dirección de un coche radiocontrol, para mover un brazo robotico, para hacer un indicador, etc.

El servo SG90 puede girar desde 0º hasta 180º. Tiene tres cables: Gnd el negro, 5V el rojo y el naranja (o amarillo, según modelo) en el pin digital de control.

Servo SG90 Pinout
Servo SG90 Pinout

Obejtivo:

Controlar un servo sg90 con Arduino para que se mueva en las posiciones 0º-90º-180º. Añadir unos botones tipo pulsador para que cambie de posición.

Materiales

  • Placa Arduino UNO (o equivalente)
  • Micro Servo SG90
  • 2 pulsadores
  • 2 resistencias de 10k ohm
  • 1 diodo LED
  • 1 resistencia de 220 ohm
  • Placa protoboard

Código Arduino para controlar servo

El IDE de Arduino nos incluye dos proyectos de ejemplo muy sencillos que nos permiten probar el servo.

Ejemplos Arduino IDE Servo

Knob servo

Este ejemplo trata de posicionar el servo entre 0º y 180º mediante un potenciómetro. Utiliza la entrada Analógica A1

Sweep servo

Trabajaremos sobre el ejemplo Sweep.

Este código lo que hace es mover el servo de 0º a 180º y de 180º a 0º continuamente, como un limpiaparabrisas.

#include <Servo.h> //Librería que nos permite controlar el servo

Servo myservo;  // crea un objeto llamado myservo para controlarlo
// se pueden crear hasta 12 objetos en la mayoría de placas

int pos = 0;    // variable que almacena la posición del servo, se inicializa en 0

void setup() {
  myservo.attach(9);  // configura el pin en el que conectamos el servo, sería el pin 9
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // el bucle for nos lleva de 0º a 180º
    // en intervalos de 1º
    myservo.write(pos);              // ordenamos al servo que se coloque en el valor de pos
    delay(15);                       // espera de 15ms para incrementar otro grado
  }
  for (pos = 180; pos >= 0; pos -= 1) { // hace la inversa, ahora va de 180º a 0º
    myservo.write(pos);              // le indica al servo la posición
    delay(15);                       // espera 15ms para reducir otro grado
  }
}

Conexiones

Conexión servo para Sweep code

Modificación del Código

La idea es hacer que el servo posicione de 0º a 90º y a 180º. Hay que eliminar en el Loop los For, e indicarle los valores que queremos al pos, y hacer un delay de 500ms por ejemplo para que pare entre posición y posición.

void loop() {
  pos = 0; //asignamos valor 0 a pos
  myservo.write(pos); // ordenamos al servo que se coloque en el valor de pos
  delay(500); // espera de 500ms
  
  pos = 90; //asignamos valor 90 a pos
  myservo.write(pos); // ordenamos al servo que se coloque en el valor de pos
  delay(500); // espera de 500ms

  pos = 180; //asignamos valor 180 a pos
  myservo.write(pos); // ordenamos al servo que se coloque en el valor de pos
  delay(500); // espera de 500ms
  
  pos = 90; //asignamos valor 90 a pos
  myservo.write(pos); // ordenamos al servo que se coloque en el valor de pos
  delay(500); // espera de 500ms

}

Ojo!! si el servo se nos pone a dar vueltas descontrolado, añadir los valores 650,2400 en el myservo.attach. Quedaría así: myservo.attach(9,650,2400).

Control de servo con entradas digitales

Ahora vamos a mezclar el proyecto de entradas digitales con el del servo. Queremos que cuando pulsemos el botón A se ponga en 0º y cuando pulsemos B se ponga en 180.

#include <Servo.h> //incluimos la librería sevo

Servo myservo; 
int BotonA = 9;
int BotonB = 8;
int led = 10;


void setup() {
  
  Serial.begin(9600);
  pinMode(BotonA, INPUT);
  pinMode(BotonB, INPUT);
  pinMode(led, OUTPUT);
  myservo.attach(11,650,2400);

}

void loop() {
  
  if (digitalRead(BotonA) == HIGH){
    Serial.println("Botón A pulsado, voy a encender el led.");
    digitalWrite(led,HIGH);
    Serial.println("Servo a 0º");
    myservo.write(0);                  //ponemos el servo a 0º
    delay(500); 
  }
  if (digitalRead(BotonB) == HIGH){
    Serial.println("Botón B pulsado, voy a apagar el led.");
    digitalWrite(led,LOW);
    Serial.println("Servo a 180º");  //ponemos el servo a 180º
    myservo.write(180);
    delay(500);    
    }
}

 

Entradas digitales y servo arduino
Entradas digitales y servo

"Trackback" Enlace desde tu web.

Yonkisdelarobotica

Técnico de sistemas informáticos y telecomunicaciones

Deja un comentario