SERVOMOTOR

Fuente:https://www.luisllamas.es/controlar-un-servo-con-arduino/
Fuente: https://programarfacil.com/tutoriales/fragmentos/servomotor-con-arduino/
¿Qué es un servo?
Servomotor

Normalmente los motores habituales lo que hacen es transformar la energía eléctrica en un giro continuo que podemos usar para desarrollar trabajo mecánico.

Los servos son también motores de corriente continua, pero en lugar de diseñarse para obtener un giro continuo que podamos aprovechar ( para mover una rueda por ejemplo), se diseñan para que se muevan un ángulo fijo en respuesta a una señal de control, y se mantengan fijos en esa posición.

Estos servomotores son muy frecuentes en Aeromodelismo y en robótica, por la capacidad que presentan para moverse a un ángulo concreto y mantenerse allí. De hecho se suelen diseñar para que giren un ángulo proporcional a una señal PWM, de forma que su control es muy preciso. Típicamente los servos disponen de un rango de movimiento de entre 0 a 180º. Es decir, no son capaces de dar la vuelta por completo (de hecho disponen de topes internos que limitan el rango de movimiento). 

Existen modelos comerciales de todas la características imaginable. El modelo que vamos a utilizar en clase es el SG90,  a continuación se describe dicho servomotor.

SG 90

Es el servo de tamaño "pequeño" estándar dentro de los proyectos de electrónica. Es un servo pequeño, ligero, y barato, que dispone de engranajes de plástico. Muchos dispositivos, como torretas y partes de robots, están diseñados para servos de este tamaño.
  • Torque: 1.4 kg·cm
  • Velocidad: 0.1 seg/60º (4.8V) y 0.08 seg/60º (6V)
  • Dimensiones: 21.5 x 11.8 x 22.7mm
  • Peso: 9g
  • Precio: 1.20€
¿Cómo funciona un servo?

Internamente un servo frecuentemente consta de un mecanismo reductor, acoplado a un reductor para reducir la velocidad de giro, junto con la electrónica necesaria para controlar su posición. Por tanto proporcionan un alto par y un alto grado de precisión. Por contra, las velocidades de giro son pequeñas frente a los motores de corriente continua. 
 

La comunicación de la posición deseada se realiza mediante la transmisión de un señal pulsada con periodo de 20ms. El ancho del pulso determina la posición del servo.
La relación entre el ancho del pulso y el ángulo depende del modelo del motor. Por ejemplo, algunos modelos responden con 0º a un pulso de 500 ms, y otros a un pulso de 1000 ms.

En general, en todos los modelos:
  • Un pulso entre 500-1000 us corresponde con 0º
  • Un pulso de 1500 ms corresponde con 90º (punto neutro)
  • Un pulso entre 2000-2500us corresponde con 180º
Estos motores funcionan con una señal PWM, con un pulso de trabajo entre 1 ms y 2 ms y con un periodo de 20 ms (50 Hz). ¿Qué quiere decir todo esto? Este dato nos indica la velocidad máxima a la que podemos mover el servomotor con Arduino. Solo podremos cambiar de posición cada 20 ms. Esto dependerá del tipo y marca de nuestro servo.

Por tanto, variando la señal en microsegundos podemos disponer de una precisión teórica de 0.18-0.36º, siempre que la mecánica del servo acompañe.

 Esquema de montaje

Conectar un servo a Arduino es sencillo. El servo dispone de tres cables, dos de alimentación (GND y Vcc) y uno de señal (Sig).
El color de estos cables suele tener dos combinaciones:
  • Marrón (GND), Rojo (Vcc) y Naranja (Sig)
  • Negro (GND), Rojo (Vcc) y Blanco (Sig)
Por un lado, alimentamos el servo mediante el terminal GND ( Marrón / Negro) y Vcc (Rojo).




En general, la alimentación a los servos se realizará desde una fuente de tensión externa (una batería o fuente de alimentación) a una tensión de 5V-6.5V, siendo 6V la tensión idónea.

Arduino puede llegar a proporcionar corriente suficiente para encender un servo pequeño (SG90), suficiente para hacer unos cuantos proyectos de prueba.

Sin embargo no dispone de corriente suficiente para actuar un servo grande (MG996R). Incluso varios servos pequeños, o hacer excesiva fuerza con ellos puede exceder la capacidad de corriente de Arduino, provocando su reinicio.

Por otro lado, finalmente, para el control conectamos el cable de señal (naranja / blanco) a cualquier pin digital de Arduino.

Ejemplos de código

El control de servos en Arduino es muy sencillo, ya que el IDE Standard proporciona la librería "servo.h", que permite controlar simultáneamente hasta 12 servos en Arduino Uno/Nano. Para incorporar la librería tenemos que ir a Programa/Include Library/Servo.

De la librería Servo.h hemos declarado un objeto o variable servoMotor y hacemos uso de dos métodos. Por un lado el attach, que nos permite indicar en que pin tenemos conectado nuestro servo, y por otro lado el write, donde indicamos en qué ángulo queremos posicionar nuestro servomotor.

Entre los ejemplos típicos para ilustrar el funcionamiento de servos tenemos el Sketch "Sweep", que realiza un barrido continuo con el servo.

Código para girar el servomotor de 0º a 180º (0-90º-180º)

// Incluímos la librería para poder controlar el servo
#include

// Declaramos la variable para controlar el servo
Servo servoMotor;

void setup() {
  // Iniciamos el monitor serie para mostrar el resultado
  Serial.begin(9600);

  // Iniciamos el servo para que empiece a trabajar con el pin 9
  servoMotor.attach(9);
}

void loop() {
 
  // Desplazamos a la posición 0º
  servoMotor.write(0);
  // Esperamos 1 segundo
  delay(1000);
 
  // Desplazamos a la posición 90º
  servoMotor.write(90);
  // Esperamos 1 segundo
  delay(1000);
 
  // Desplazamos a la posición 180º
  servoMotor.write(180);
  // Esperamos 1 segundo
  delay(1000);
}


Girando grado a grado el servomotor

Para ello incrementa el ángulo de 0 a 180º a razón de 1º cada 15ms, posteriormente realiza la operación contraria de 180º a 0º, para finalmente reiniciar el bucle.


#include

Servo myservo;  // crea el objeto servo

int pos = 0;    // posición del servo

void setup() {
   myservo.attach(9);  // vincula el servo al pin digital 9
}

void loop() {
   //varia la posición de 0 a 180, con esperas de 15ms
   for (pos = 0; pos <= 180; pos += 1)
   {
      myservo.write(pos);             
      delay(15);                      
   }

   //varia la posicion de 0 a 180, con esperas de 15ms
   for (pos = 180; pos <= 0; pos -= 1)
   {
      myservo.write(pos);             
      delay(15);                      
   }
}


Robot que busca la luz (Robot polilla)

Propuesta

Diseñar y construir un robot de juguete que busca la luz. El robot  debe "buscar" un haz luminoso (de una linterna),  seguirlo y desplazarse hacia él. Si el haz de luz se mueve o se interrumpe, el robot tiene que dejar de desplazarse hacia delante y empezar a buscar la luz otra vez.

Solución

Vamos a realizar un vehículo que busca la luz: girará en redondo sobre si mismo hasta que detecte un haz de luz, en ese caso, se moverá en línea recta hacia ella.
 
Sin luz solo funciona el motor 1 provocando que el vehículo gire sobre la rueda izquierda.


Con luz, además del motor 1, también funciona el motor 2 y el vehículo se mueve recto hacia delante.


Arduino debe encargarse de mantener siempre en movimiento el motor 1 y activar el motor 2 sólo cuando la lectura analógica del voltaje en la LDR sea inferior a un valor determinado.

Circuito eléctrico


Montaje en placa protoboard







Algoritmo para obtener el valor mayor de las medidas realizadas por un sensor de ultrasonidos.

Vamos a analizar el algoritmo para obtener el mayor de tres números

Algoritmo para obtener el mayor de tres números

Fuente: Hazaelocielx's Blog

ALGORITMO INFORMAL


INICIO.

1.- Pedir al usuario tres números diferentes.

2.- Comparar el primero con el segundo.

3.- Al mayor de los anteriores, compararlo con el tercero. El número más grande es el mayor de los tres.

4.- Imprimir el resultado en la pantalla.

FIN


ALGORITMO COMPUTACIONAL

INICIO

1.- Solicitar a usuario n1, n2 y n3

2.- Comparar n1 con n2

3.- Si n1 > n2

                Si n1 > n3

                     Imprimir n1

                Si no
                     Imprimir n3
     Si no, comparar n2 con n3
                Si n2 > n3
                     Imprimir n2
                Si no
                     Imprimir n3
FIN

En nuestro caso lo vamos a adaptar a para obtener la distancian mayor obtenida por un sensor de ultrasonidos que realiza tres medidas:

Se posiciona en 0º y realiza una medida. distancia_0
Se posiciona en 90º y realiza una segunda media. distancia_90
Se posiciona en 180º y realiza una tercera medida distancia_180

El valor obtenido, la distancia mayor se va  a utilizar para indicar al robot la dirección en la que tiene que avanzar.



ALGORITMO INFORMAL


INICIO.

1.- Realizar las medidas de distancia (distancia_0, distancia_90 y distancia_180).

2.- Comparar el primero con el segundo.

3.- Al mayor de los anteriores, compararlo con el tercero. El número más grande es el mayor de los tres.

4.- Imprimir el resultado en la pantalla.

FIN


ALGORITMO COMPUTACIONAL

INICIO

1.- Realizar las medidas de distancia (distancia_0, distancia_90 y distancia_180).

2.- Comparar distancia_0 con distancia_90

3.- Si distancia_0 >distancia_90

                Si distancia_0 > distancia_180

                     avanzar();

                Si no

                     girarDerecha();

     Si no, comparar distancia_90 con distancia_180
              
           Si distancia_90 > distancia_180
       
            girarIzquierda();
       
       Si no
                    girarDerecha();

FIN

Las funciones avanzar(), girarDerecha() y girarIzquierda(), han sido creadas para controlar el funcionamiento del robot.

CircuitLab, la forma más sencilla de diseñar tus circuitos en la web



Se trata de un sencillo editor que podemos ejecutar cómodamente desde el navegador, sin ni siquiera tener que crear una cuenta para poder usarlo y con los componentes más habituales a nuestro alcance. La herramienta funciona perfectamente, permitiendo diseñar circuitos rápidamente y realizar distintas simulaciones antes de llevar los resultados a la práctica física.

CircuitLab es gratis, haciendo de él un compañero ideal para el sector educativo o para aficionados a la electrónica. Creando una cuenta podremos además guardar nuestros circuitos, imprimir los resultados en PDF y hacerlos públicos para compartirlos con otros usuarios.

Fuente: Genbeta



Control del funcionamiento de un ventilador con Arduino

Propuesta

Diseñar un circuito para controlar la temperatura de la maqueta de una habitación con la utilización de un pequeño ventilador de corriente continua y un sensor de temperatura.

El funcionamiento del circuito será el siguiente, siempre que la temperatura sea superior a 28ºC el ventilador estará funcionamiento.

El sensor que vamos a utilizar es el LM35, cuyas características principales son las siguientes: Sensor de temperatura LM35


Montaje realizado


Diagrama de flujo



Código

 float tempC;
 int pinLM35=0;
#define EA 11
#define I1 10
#define I2 9

void setup()
{
  pinMode(EA,OUTPUT);
  pinMode(I1,OUTPUT);
  pinMode(I2,OUTPUT);
 
}
void loop()
{
  tempC= analogRead(pinLM35);
  tempC=(tempC*5.0*100.0)/1024.0;
 
  if(tempC>30)
  {
    digitalWrite(EA,HIGH);
    digitalWrite(I1,LOW);
    digitalWrite(I2,HIGH);

  }
  else
  {
  digitalWrite(EA,LOW);
}
}





Control del funcionamiento de un puente levadizo con Arduino

Propuesta

En el taller de tecnología disponemos de la maqueta de un puente levadizo, dicha maqueta incorpora dos finales de carrera, uno para detectar que el tablero del puente alcanza su posición de máxima apertura y otro para detectar que el puente ha bajado completamente. El sistema incorpora un motor con reductora y un sistema de poleas.

El sistema de control de regulación y control debe funcionar de la siguiente manera:

Al accionar un pulsador el puente debe de subir o bajar dependiendo de la posición en la que se encuentre, hasta alcanzar la posición contraria.

El sistema incorpora dos diodos, uno verde para indicar que el tablero está subiendo y otro rojo para indicar que el tablero está bajando.

Solución adoptada

Nota: Hemos tenido que utilizar dos interruptores para simular el funcionamiento de los finales de carrera.


Diagrama de flujo


Código

int Pulsador = 6;
int finalA = 11;
int finalB = 7;
int DiodoA = 1;
int DiodoB = 0;
int estadoPulsador = 0;
int estadoFinalA = 0;
int estadoFinalB = 0;
int E1=10;
int I1=9;
int I2=8;

void subir(){
  digitalWrite(E1, HIGH);
  digitalWrite(I1, HIGH);
  digitalWrite(I2, LOW);
}

void bajar(){
  digitalWrite(E1, HIGH);
  digitalWrite(I1,LOW);
  digitalWrite(I2, HIGH);
}

void parar(){
  digitalWrite(I1, LOCódigoW);
  digitalWrite(I2, LOW);
  digitalWrite(E1, LOW);
}

void setup()
{
  pinMode(E1, OUTPUT);
  pinMode(I1, OUTPUT);
  pinMode(I2, OUTPUT);
  pinMode(Pulsador, INPUT);
  pinMode(finalA, INPUT);
  pinMode(finalB, INPUT);
  pinMode(DiodoA, OUTPUT);
  pinMode(DiodoB, OUTPUT);
}

void loop()
{
estadoPulsador=digitalRead(Pulsador);
estadoFinalA=digitalRead(finalA);
estadoFinalB=digitalRead(finalB);

if((estadoPulsador==HIGH)&&(estadoFinalA==HIGH))
{
  while(estadoFinalB==LOW)
  {
    bajar();
    digitalWrite(DiodoA, HIGH);
    estadoFinalB = digitalRead(finalB);
   }
   parar();
 }

 if((estadoPulsador==HIGH) && (estadoFinalB==HIGH))
  {
   while(estadoFinalA==LOW)
   {
     subir();
     digitalWrite(DiodoB, HIGH);
     estadoFinalA = digitalRead(finalA);
   }
    parar();
  }
}