Aunque hay muchos ejemplos de Sketchs para mover servos con esta familia de placas que llevan este microcontrolador y sus estupendas características, mi experiencia con la libreria <Servo.h> me ha generado problemas para completar las posiciones de los servos de 0 a 45 y de 135 a 180 grados. Para solventarlo utilizo la libreria <Servo8266.h> que solo podreis encontrar aqui:
http://www.arduinoblocks.com/web/help/libraries
Una vez descomprimida copia la carpeta Ablocks Servo8266 en la carpeta de librerias de arduino.
EJEMPLO 1
Barrido continuo de ida y vuelta entre 0-180.
El tiempo de barrido sera igual al producto “delay()*num grados barridos”. Este dato es muy importante si queremos utilizar un temporizador. En el ejemplo T=2*180*10=3600 mseg.
SI omitimos el delay() , la velocidad deberia de dispararse al tender el tiempo a 0,pero eso no ocurre, calculando el tiempo que tarda compruebo que son 7 segundos, no se si será debido a la libreria usada o a la misma placa.
Entonces una vez omitido el delay(), la velocidad maxima quedará limitada con el intervalo de numero de grados barridos,
#include <Servo8266.h>
int pos;
Servo8266 servo_01; // create servo object to control servo_01
void setup() {
servo_01.attach(14); // attaches the servo on pin gpio14 =D5
pos=0
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
servo_01.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 10ms for every swept degree
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
servo_01.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 10ms for every swept degree
}
}
EJEMPLO 2
Uso de un potenciometro para controlar el barrido completo del servo.Una patilla a GND, otra a 3,3V y la central conectada a A0
EL ESP8266 tiene una sola entrada analógica y al igual que un arduino es de 10 bits pero trabaja con un voltaje de referencia interno de 1V. En el NodeMCU y WeMos en la entrada A0 tiene un divisor de voltaje, para adaptar el rango hasta los 3.3V.
Se mapea pues de 0 a 1023 a 0 a 180, de forma que el potenciometro a mitad de escala coincida con una posición de 90º
Podemos omitir el delay() puesto que el potenciometro permanece enclavado en una posición fija y la velocidad es proporcional a nuestro girop manual,
#include <Servo8266.h>
Servo8266 servo_14; // create servo object to control a servo
void setup() {
servo_14.attach(14); // attaches the servo on pin D5
}
void loop() {
int pos=analogRead(A0);
pos=map(pos,0,1023,0,180);
servo_14.write(pos);
delay(10);
}
EJEMPLO 3
Uso de un Joystick, Al mantener el eje X o eje Y hacia la posicion LOW o HIGH, el servo ira haciendo un barrido de grado en grado o mas (ojo que sube mucho la velocidad) hasta alcanzar el tope que queramos que quedará enclavado
if (pos > 150) { pos = 150; } ejemplo para que no pase de 150º
if (pos < 0) { pos = 0; } al llegar a 0 se enclava mientras mantengamos el joystick desplazado
Podemos omitir delay() cuando el barrido sea de grado en grado, para mayores incrementos si hay que utilizarlo para mantener controlada la velocidad.
El servo parte de la posición 180º ya que en void setup :
servo_14.write(180);
Puesto que el Joystick al desplazarse genera 3,3v( conectandolo 5v a 3v3) correspondiente a 1023 he puesto un valor de 900 por seguridad al igual que en el sentido LOW o = voltios pongo un valor de 10.
#include <Servo8266.h>
Servo8266 servo_14; // create servo object to control a servo
int pos=0;
void setup() {
servo_14.attach(14); // attaches the servo on pin 14
servo_14.write(0);
}
void loop() {
int val=analogRead(A0);
if(val>=900){
pos= (pos + 1);
servo_14.write(pos);
delay(5);
if (pos > 180) {
pos = 180;
}
}
if(val<=10){
pos= (pos - 1);
servo_14.write(pos);
delay(5);
if (pos < 0) {
pos = 0;
}
}
}
EJEMPLO 4:
Uso de un potenciometro con control de velocidad configurable
#include <Servo8266.h>
Servo8266 servo_12; // create servo object to control a servo
int pos;
void setup() {
servo_12.attach(12);//d6
pos=0;
servo_12.write(pos);
}
void loop() {
int pot=analogRead(A0);
pot=map(pot,0,1023,0,180);
if (pot < pos) {//de 180-0
pos = (pos - 1);
servo_12.write(pos);
//delay(100);
if (pos < pot) {
pos = pot;
}
}
if (pot > pos) {//de 0-180
pos = (pos + 1);
servo_12.write(pos);
//delay(100);
if (pos > pot) {
pos = pot;
}
}
}
EJEMPLO 5:
Uso de un temporizador con la funcion millis(). El servo barrera el sector completo 0-180 y 180-0 cada 10 segundos, siendo la primera pausa de 20 segundos.
#include <Servo8266.h>
Servo8266 servo_12; // create servo object to control a servo
int pos;
unsigned long t1 = 0;
unsigned long pausa = 20000;
void setup() {
servo_12.attach(12);//d6
pos=0;
servo_12.write(pos);
}
void loop() {
unsigned long diff = millis() - t1;
if (diff >= pausa) {
t1=millis();
for (pos = 0; pos <= 180; pos += 1) {
// in steps of 1 degree
servo_12.write(pos);
delay(28);
}
for (pos = 180; pos >= 0; pos -= 1) {
servo_12.write(pos);
delay(28);
}
}
}
, He medido el tiempo y
SI TIENES DUDAS EN ESTE SKETCH TE INVITO A VER EL MISMO CASO EN EL POST: