4.- LOS SERVOS
ÍNDICE:
0.-TEORÍA: SERVOS
1.- MOVIMIENTO SIMPLE
2.- EL LIMPIAPARABRISAS
3.- SERVO CONTROLADO POR EL TECLADO USANDO MBLOCK.
4.- SERVO CONTROLADO POR EL MONITOR SERIE.
5.- SERVO CONTROLADO POR UN POTENCIÓMETRO.
6.- BRAZO ROBOTIZADO SENCILLO
0.-TEORÍA: LOS SERVOS
Los servos están formados interiormente por un motor, unos engranajes para reducir la velocidad y aumentar el par de fuerza, un potenciómetro que determina la posición en todo momento del eje y una pequeña placa con la electrónica de control necesaria para posicionar el eje en función de la señal recibida.
Los servos de modelismo tienen un motor y unos engranajes cuya salida se puede mover en un arco de 180 º y contienen la electrónica necesaria para ello. Todo lo que se necesita es un pulso enviado cada 20ms:
- Si se recibe un pulso de <1msg, indica que vaya a la posición 0º. Si establecemos los 90º como posición neutra con esta franja de pulsos se moverá en sentido antihorario.
- Si se recibe un pulso de >=2msg. indica que vaya a la posición de 180º. En este caso se moverá en sentido horario.
- Y para el resto de posiciones intermedias, habrá que mandar pulsos intermedios. Por ejemplo, 1,5ms irá a la posición de 90º que podemos establecer como posición neutra (como si marcase las 12horas de un reloj)
Cada ciclo de un servo es de 20ms. Esto significa que cada 20ms el servo lee su señal de entrada y, dependiendo de lo que dure el valor HIGH LÓGICO (ancho del pulso) calcula la posición a la que debe ir.
Así, restando los 2ms del pulso, tendrá unos 20-2=18 ms para alcalzar esa posición deseada, y por tanto, puede cambiar de posición 1000/20=50 veces por segundo.
1.- MOVIMIENTO SIMPLE DE UN SERVO
CABLEADO DE CONEXIÓN:
- Cable NEGRO o MARRÓN se conectará a un pin GND .
- Cable ROJO será conectado al pin 5V.
- Cable BLANCO o NARANJA del sevo lo conectaremos al PIN_9_PWM
Cuando necesitamos contectar más de dos servos a nuestro arduino, es conveniente utilizar pilas externas para alimentar a los servos, utilizando la misma masa entre ellos con nuestro arduino (GND).
EXPLICACIÓN DEL CÓDIGO UTILIZADO:
Para mover de manera sencilla el servo marcando simplemente los grados a los que queremos que gire, se podrá utilizar una librería introduciendo primero la instrucción: #include, posteriormente creamos el objeto con le nombre que daremos a nuestro servo que queramos controlar. Éste lo conectaremos en un pin PWM y dentro del loop usaremos la instrucción de posicionamiento servo.write(posición), dejamos un pequeño delay para permitir que el servo alcance la posición antes de darle la siguiente orden. Usaremos al variable de entrada pos para poder modificar la directamente la posición del servo sobre dicha variable.
CÓDIGO:
#include <Servo.h>
Servo miservo;
int pos = 0;
void setup(){
miservo.attach(9);
}
void loop() {
pos=0;
miservo.write(pos);
delay(2000); //dejamos tiempo para posicionarse
pos=180;
miservo.write(pos);
delay(2000);
}
ACTIVIDADES:
1.- Utiliza el programa M_BLOC para programar el sevo.
1.- Utiliza el programa M_BLOC para programar el sevo.
2.- Mejora el código anterior incorporando un for que nos permita realizar una secuencia de movimientos repetidos. De esta forma, se ejecuta durante varias veces veces la secuencia que irá incrementándose en 20º en cada iteracción del bucle.
#include <Servo.h>
Servo miservo;
int pos = 0;
void setup(){
miservo.attach(9);
}
void loop() {
for (pos=0; pos<=180; pos+=20) {
miservo.write(pos);
delay(1000);
}
}
ACTIVIDADES:
2.- Modifica el código para que haga distintos giros marcados por tí mismo.
3.- Diseña el código de apertura de una barrera de aparcamiento de coches.
2.- LIMPIAPARABRISAS DE UN COCHE.
En esta práctica realizaremos la simulación de un limpiaparabrisas de un coche, diseñando un código, a través de la función "servoPulse", que nos servirá para mover el servo de 10º a 170 º. Todo ello, sin necesidad de utiliar la librerías de servos que existen.
CÓDIGO:
#define pinServo 9
Servo miservo;
int pos=0;
void setup() {
miservo.attach(pinServo); //declaramos la salida del sevo
}
void loop() {
for (pos=0; pos<=170; pos=pos+1); {
miservo.write(pos); //movemos el servo en un sentido
delay(800);
}
for (pos=170; pos>=10; pos=pos-1); {
miservo.write(pos); //movemos el servo en el otro sentido
delay(500);
}
}
ACTIVIDAD:
1.- Modifica el programa para que el LIMPIAPARABRISAS se mueva más lentamente cuando se mueva en un sentido y más rapidamente en el otro.
1.- Modifica el programa para que el LIMPIAPARABRISAS se mueva más lentamente cuando se mueva en un sentido y más rapidamente en el otro.
EJEMPLO DEL CÓDIGO SIN USAR LIBRERÍA DEL SERVO.
int servoPin = 9; // servo conectado al pin digital 9 PWM
int miAngulo; // ángulo del servo de 0-180
int anchoPulso; // anchura del pulso para la función servoPulse
void setup() {
pinMode(servoPin, OUTPUT); // configura pin9 como salida
}
void servoPulso(int servoPin, int miAngulo) { //definimos esta nueva función
anchoPulso = (miAngulo * 10) + 600; // determina retardo del ancho de pulso
digitalWrite(servoPin, HIGH); // mueve el servo
delayMicroseconds(anchoPulso); // pausa
digitalWrite(servoPin, LOW); // detiene el servo
delay(20); // retardo de refresco
}
void loop() { // el servo inicia su recorrido en 10º y gira hasta 170º
for (miAngulo=10; miAngulo<=170; miAngulo++) {
servoPulso(servoPin, miAngulo);
}
for (miAngulo=170; miAngulo>=10; miAngulo--) { //el servo vuelve a 10º
servoPulso(servoPin, miAngulo);
}
}
Hemos usado como unidad del ancho de pulso los microsegundos porque si lo hicieramos en milisegundos tendríamos que haber utilizado una variable del tipo flotante.
4.- SERVO CONTROLADO TECLADO CON M_BLOCK.
4.- SERVO CONTROLADO POR EL MONITOR SERIE.
CÓDIGO CON LA FUNCIÓN "IF":
#include <Servo.h>
Servo miservo;
int pos=0;
int TECLA=0;
void setup() {
Serial.begin(9600);
miservo.attach(9);
pos=0;
}
void loop() {
miservo.write(pos);
delay(50);
Serial.println(pos);
if (Serial.available() > 0) { //esto da algo de error
delay(100);
TECLA=Serial.read();
if (TECLA==49){ //es decir, "1"
pos=0;
}
if (TECLA==50){ //es decir, "2"
pos=90;
}
if (TECLA==51){ //es decir, "2"
pos=180;
}
}
}
CÓDIGO CON LA FUNCIÓN "SWITCH CASE":
#include <Servo.h>
Servo miservo;
int pos=0;
int TECLA=0;
void setup() {
Serial.begin(9600);
miservo.attach(9);
pos=0;
}
void loop() {
miservo.write(pos);
delay(50);
Serial.println(pos);
if (Serial.available() > 0) { //esto da algo de error
delay(100);
TECLA=Serial.read();
switch (TECLA) {
case 49:
pos=45;
break;
case 50:
pos=90;
break;
case 51:
pos=135;
break;
defautl:
pos=0;
}
}
}
Servo miservo;
int pos=0;
int TECLA=0;
void setup() {
Serial.begin(9600);
miservo.attach(9);
pos=0;
}
void loop() {
miservo.write(pos);
delay(50);
Serial.println(pos);
if (Serial.available() > 0) { //esto da algo de error
delay(100);
TECLA=Serial.read();
switch (TECLA) {
case 49:
pos=45;
break;
case 50:
pos=90;
break;
case 51:
pos=135;
break;
defautl:
pos=0;
}
}
}
3.- SERVO CONTROLADO POR UN POTENCIÓMETRO.
#include <Servo.h>
Servo servo;
int
pot = 3; //entrada analógica del potenciometro
void
setup() {
Serial.begin(9600);
servo.attach(9);
}
void
loop() {
int
valorpot= analogRead(pot);
val=map(valorpot,0,1023.0.180;
Serial.print(val);
servo.write(val);
delay(100);
}
ACTIVIDAD:
1.- Mueve un servo según una determinada entrada analógica. Mediante un joystick o un dispositivo que cuente con un potenciómetro podemos controlar el movimiento de un servo.
1.- Mueve un servo según una determinada entrada analógica. Mediante un joystick o un dispositivo que cuente con un potenciómetro podemos controlar el movimiento de un servo.
Para este ejemplo utilizaremos el ejemplo que viene incluido en la IDE de Arduino (knob) que se encuentra en Archivo>Ejemplos>Servo
Lo que hace este programa es variar la posición del servo en función de la posición del potenciómetro que leemos de manera analógica. Sólo nos queda mapear la lectura para que se mueva de 0º a 180º.
4.- BRAZO ROTO.