|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

____________________________

28.- Servomotor.

- Se trata de mover un pequeño servo con el Arduino, en este caso nuestro servo es un motorcito que se puede mover paso a paso desde 0 hasta 180º. Hay servos que se pueden mover 360º, pero el nuestro solo permite 180º. Al final de este página he puesto otros modelos de servo.

- Compro en Aliexpress: SG90 Mini Servo with Gears and Parts
- Tiene un precio de 1 €, el pedido tardó unos 20 días en llegar.

Viene con tres cables de conexión y varios elementos de giro.

El cable rojo es el positivo (5 V), el marrón el negativo y el naranja el de control (3,3 V).

Es conveniente alimentar al servo con una fuente de 5 V externa ya que si se conecta directamente a los 5V del Arduino pueden surgir averías.

En mi caso, para hacer pruebas he conectado el servo directamente a la placa del Arduino y no he tenido problemas ni en el servo ni en la placa. Para hacer pruebas ligeras tal vez se podría conectar directamente a la placa del Arduino, pero para un trabajo más contínuo sería conveniente una fuente distinta.

El Servo va a funcionar con PWM a una frecuencia aproximada de 490 Hz

- Tiene un torque de 1,8 kgf.cm

 

Hoja de datos.

 

 

____________________
1.- Enviamos los grados desde el Monitor Serie.

Código

// Juan A. Villalpando
// Agosto 2018
// Servo, grados desde Monitor Serie

#include <Servo.h>
Servo servoMain;
const int pwmPin = 3; // El servo en el pin 3

// variables
int grados;
char rx_byte = 0;
String rx_str = "";

void setup() {
Serial.begin(9600);
Serial.println("Introduce el valor del angulo.");
pinMode (pwmPin, OUTPUT); 
servoMain.attach(pwmPin);
}

void loop(){
if (Serial.available() > 0) { // ¿Hay algún caracter?
rx_byte = Serial.read(); // Toma el caracter
rx_str += rx_byte;

if (rx_byte == '\n') {
grados = rx_str.toInt();
servoMain.write(grados);
Serial.println(grados);
rx_str = ""; 
} 
delay(100);
}
}

- Vamos al Monitor Serie y escribimos un número del 0 al 180. Pulsamos la tecla Entrar del teclado.

- El Servo se moverá a ese lugar.

- Con este aplicación puedes estudiar el movimiento del servo y observar cuales son sus posiciones extremas.

- Fíjate que la velocidad de transmisión es de 9600 baudios y que he marcado: Ambos NL & CR

____________________
2.- Dos servos. Enviamos los grados desde el Monitor Serie.

- Conectamos un servo al terminal 3 y otro al 5.

Código

// Juan A. Villalpando
// Agosto 2018
// Servo, grados desde Monitor Serie

#include <Servo.h>
Servo servo3;
Servo servo5;
const int pwmPin3 = 3; // Un servo en el pin 3
const int pwmPin5 = 5; // Otro servo en el pin 5


// variables
int grados;
char rx_byte = 0;
String rx_str = "";

void setup() {
Serial.begin(9600);
Serial.println("Introduce el valor del angulo.");
pinMode (pwmPin3, OUTPUT); 
pinMode (pwmPin5, OUTPUT);
servo3.attach(pwmPin3);
servo5.attach(pwmPin5);
}

void loop(){
if (Serial.available() > 0) { // ¿Hay algún caracter?
rx_byte = Serial.read(); // Toma el caracter
rx_str += rx_byte;

if (rx_byte == '\n') {
grados = rx_str.toInt();
Serial.println(grados);
servo3.write(grados);
grados =  grados - 90;
servo5.write(grados);
rx_str = ""; 
} 

}
}

- En el código he puesto en el segundo servo:

grados = grados - 90;

- Puedes probar otros valores, incluso anular esa línea para que giren en el mismo sentido.

____________________
3.- Enviamos los grados pulsando botones.

Voy a realizar un montaje con dos pulsadores, el Arduino Uno y el servo anteriormente mencionado.

El IDE que estoy utilizando es el 1.0.6, por eso la extensión de los archivos es .ine en vez de pde.

Al pulsar un pulsador se incrementará el giro en 10 grados y al pulsar el otro se decrementara también en 10 grados.

Los pulsadores están conectado según este esquema...

   

 


Pulsa sobre la imagen para verla a mayor tamaño

 

Cada vez que pulsemos un pulsador, el servo girará 10 grados en un sentido.
Cuando pulsemos el otro pulsador girará 10 grados en sentido contrario.

 

Recuerda que este servo solo gira 180º.

 

En este ejemplo, como se ve en la foto, estoy alimentando al Servo (5 V) desde la misma placa del Arduino, para esta prueba es válida, pero para otras pruebas da problemas esta forma de alimentarlo.

 

________________
- Código.


Aquí está el programa, he utilizado en IDE 1.0, con este IDE los archivos llevan la extensión .ino, en cambio en otros IDE la extensión será .pde

El control del servo está en el pin 3.

Es necesario la librería "Servo.h", pero problamente ya está instalada en la carpeta libraries.

Código

// Juan Antonio Villalpando
// kio4.com

// agosto 2012 


#include <Servo.h>
Servo servoMain;

const int boton8 = 8; // Un botón en el pin 8
const int boton9 = 9; // Otro botón en el pin 9
const int pwmPin = 3; // El servo en el pin 3

// variables
int buttonState8 = 0;
int buttonState9 = 0;
int grados;

void setup() {
Serial.begin(9600);
pinMode(boton8, INPUT); 
pinMode(boton9, INPUT); 
pinMode (pwmPin, OUTPUT); 
servoMain.attach(pwmPin);
}

void loop(){

buttonState8 = digitalRead(boton8);
buttonState9 = digitalRead(boton9);

if (buttonState8 == HIGH) { 
grados = grados - 10;
if (grados<0){grados=0;}
servoMain.write(grados);
Serial.println(grados);
} 

if (buttonState9 == HIGH) { 
grados = grados + 10;
if (grados>180){grados=180;}
servoMain.write(grados);
Serial.println(grados);
} 

delay(100);
}

_______________________
- Monitor Serie.

- Es conveniente abrir el "Monitor Serie", para ver cómo evolucionan los número de grados.
- Cuando los grados cambian desde 0 a 180, el brazo del servo gira.
- En este programa didáctico no está contemplado cuando los grados sobrepasan los 180 o son negativos. Se podrían poner limitadores mediante IF.

_______________________
- Servo.

- Al servo motor podemos enviarle órdenes de tipo: posición 24º y el eje se pondría a 24º. Posición 145º y se posicionaría en ese ángulo.
Es decir, le podemos dar la orden para posicionar el eje donde queramos en cualquier momento.

if (buttonState8 == HIGH)
grados = 24;
servoMain.write(grados);
Serial.println(grados); }
if
(buttonState9 == HIGH) {
grados = 145;
servoMain.write(grados);
Serial.println(grados);
}

- En los ejemplos de la librería hay uno en donde al mover un potenciómetro se mueve el servo a su posición correspondiente. Otro es un barrido automático total a izquierda y a derecha.

___________________________________

Es importante que el servo esté alimentado con 5 V de una fuente distinta del Arduino.

Una forma sencilla para realizar las prácticas sería tomar un cable USB, cortar un extremo y sacar su cable rojo (5 V) y negro (GND). Con estos dos cables alimentamos al Servo. Además el cable negro se ha de conectar a un pin GND del Arduino. Este cable USB lo conectamos al ordenador.

El cable naranja que controla al servo va, en este caso al pin 3 del Arduino .

 

_________________________________
- Aumentar el ángulo de movimiento.

- Consulta al final de esta página otros modelos que pueden girar 360º.

Tendríamos que desenroscar los 4 tornillos traseros, sacar el módulo y quitar el engranaje indicado en la foto. Es fácil.

Luego con un cutter, cortamos el tope de este engranaje. Lo volvemos a montar.

No es aconsejable hacerlo porque ahora cuando baje de los 0º o suba de los 180º funcionará de forma extraña. Pero en fin... como prueba se puede hacer. Siempre consulta el "Monitor Serial". Aumenta hasta más de los 1400 y disminuye a valores negativos y consulta cómo evoluciona.

Si lo quieres hacer bien, debes añadirle tres resistencias en su interior, busca vídeos de cómo hacerlo.

_________________________________
- Servo sin librería.

- Envando pulsos con una determinada duración podemos situar al servo en cierto lugar. En este ejemplo he puesto una función llamada mover() que mueve el eje del servo.

- Mediante una regla de tres puedes convertir los valores a grados.

- Puedes modificar los valores que he puesto según sea tu servo.

Servo sin librería I.
// Juan A. Villalpando.
// kio4.com

int h;

void setup() {

  pinMode(servoPin, OUTPUT);
}

void loop() {
h=3600;
mover();
h=00;
mover();
}

void mover(){
  int k=1;
  while(k<=50){
  k=k+1;
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(h);
  digitalWrite(servoPin, LOW);
  delayMicroseconds(3600-h);
  delay (10);
    }
  
  }
 

 

- Aquí otro ejemplo: http://blog.oddbit.com/2013/03/07/controlling-a-servo/

Servo sin librería II.
int incomingByte = 0;
int servo0 = 600;
int servo180 = 2100;
int inc = 20;
int pos = servo0;
int servoPin = 9;
int pulseInterval=2000;

void setup() {
  Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
  pinMode(servoPin, OUTPUT);
}

void loop() {
  int i;

  pos += inc;

  if (pos > servo180) {
    Serial.println("REVERSE!");
    pos = servo180;
    inc *= -1;
    delay(500);
  } else if (pos < servo0) {
    Serial.println("FORWARD!");
    pos = servo0;
    inc *= -1;
    delay(500);
  }

  Serial.print("pos = ");
  Serial.println(pos, DEC);

  digitalWrite(servoPin, HIGH);
  delayMicroseconds(pos);
  digitalWrite(servoPin, LOW);
  delay(20);
}
		  

Al servo le suministramos pulsos con un periodo de 20 ms. Según el estado alto, así se desplazará el eje.

En Internet puedes encontrar la manera de mover el servo sin utilizar la librería.

Supongamos que nuestro servo funciona con un periodo de 20 ms = 20.000 us

Queremos que se desplace a 90º

digitalWrite(Pin3, HIGH)
delayMicroseconds(2000)
digitalWrite(Pin3,LOW)
delayMicroseconds(20000-2000)

Como ves, comienza en 1 ms. Desde 1 ms a 2 ms desarrolla 180º


1 ms------------- 180º

t -------------- grados

Pulso en alto

t = (grados * 1 / 180) + 1

Pulso en bajo

20 ms - t

_________________________________
- Otros servos.

- El servo visto anteriormente tiene un torque de 1,8 kgf.cm y puede girar 180º.

- DS3115: Este tiene un torque de 14 kgf.cm y puede girar 360º, se puede encontrar por 7,3 € en Aliexpress.

- FS90R. Este es parecido al primero que vimos, pero puede girar 360º

________________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información