Servos
El servo (servomotor) és un tipus de motor amb el qual som capaços de controlar la posició i el moviment dels seus eixos. Aquest està conformat per un controlador, un motor elèctric, un potenciòmetre i un sistema d'engranatges que realitzen una reducció. A través del controlador, el motor rep el senyal elèctric per saber la posició exacte on haurà d'acabar l'eix i alimenta al sistema d'engranatges que des de la posició inicial indicada pel potenciòmetre, mouen l'eix fins a la posició desitjada. Aquests servos tenen una capacitat màxima de rotació d'uns 180°
Per programar un servo amb l'Arduino, és important utilitzar la instrucció "#include <Servo.h>" a l'inici del codi que permetrà a l'Arduino accedir a una biblioteca addicional amb tota la informació referent als servos.
EXPLICACIÓ CIRCUIT:
Abans de programar el servo, haurem de connectar-lo a l'Arduino de la forma corresponent.
Tenint en compte que el servo compta amb tres cables de diferent color els haurem de connectar de la següent forma:
El cable vermell haurà d'anar connectat als 5 V i serà l'encarregat d'enviar l'energia al servo. Seguidament, el segon cable que pot ser tant blanc com groc o taronja anirà connectat al pin 9 i serà per on el servo rebrà el senyal i la informació sobre que haurà de fer. Per últim, el cable restant que serà de color negre o marró haurà d'anar connectat a massa o "gnd" i serà el cable encarregat de contrarestar els 5 V, ja que està carregat negativament connectant així tot el circuit.
PROGRAMA 1: (0°-->180°)
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup(){
myservo.attach(9);
}
void loop(){
for(pos = 0; pos < 180; pos += 1){
myservo.write(pos);
delay(15);
}
for(pos = 180; pos>=1; pos-=1){
myservo.write(pos);
delay(15);
}
Mitjançant aquest codi, aconseguirem que l'eix del servo vagi de 0° a 180° i de 180° a 0° i així sense parar.
En aquest codi, utilitzarem instruccions prèviament comentades com el "for" o el "delay" d'aquesta manera no caldrà explicar-les novament.
Primerament, declararem una variable de tipus integer anomenada "pos" (posició) que equivaldrà a la posició de l'eix del servo i per començar equivaldrà a 0.
Seguidament, s'indicarà la sortida del senyal del servo i amb la instrucció "myservo.attach(9)" li indicarem que el senyal volem que surti des del pin 9.
Després, crearem un "loop" i procedirem a escriure un "for" mitjançant el qual mentre la variable "pos" sigui inferior a 180 (màxim de graus) a "pos" se li sumarà 1 al seu valor inicial. A més, per cada volta del "for", amb la instrucció "myservo.write(pos)" que seria l'equivalent al "digitalWrite" amb els LEDs farem que l'eix del servo vagi a la posició demanada que en aquest cas és equivalent al valor de "pos", és a dir 1. D'aquesta manera, per cada volta que faci el "for" l'eix del servo es mourà una posició endavant esperant 15 mil·lisegons entre cada volta amb un "delay(15)" prèviament escrit posteriorment a la instrucció "myservo.write".
D'aquesta manera el primer "for" quedaria acabat.
Com que també volem que l'eix del servo faci el recorregut contrari, haurem de fer un altre "for" però al revés, és a dir, mentre que la variable "pos" (que ara és igual a 180) sigui més gran que 1 (posem 1 i no 0 per evitar una pausa més prolongada entre el canvi entre el for de 180° a 0° al de 0° a 180°, ja que si un acaba i l'altre comença en 0 el "for" repeteix una volta innecessària, ja que hi ha un valor duplicat ) a "pos" se li restarà 1 al seu valor realitzant després les mateixes instruccions.
D'aquesta manera el codi quedaria acabat.
PROGRAMA 2: (0° --> 90° --> 180°)
En aquest programa farem que l'eix del servo passi de 0º a 90º i a 180º fent una pausa d'un segon i fent el mateix però de tornada.
Sent aquest programa una variació de l'anterior, el codi només canvia en el "loop", ja que ara, en comptes d'anar d'un en un, anirem de 90 en 90 tant si sumem com si restem (anada o tornada).
D'aquesta manera les condicions dels dos "for" seran les mateixes excepte pel fet que en comptes de sumar o restar 1 se sumarà o se'n restarà 90 com es pot veure en el codi de la dreta.
A més a més, per fer complir la pausa d'un segon entre els increments de graus, el valor de la instrucció "delay" passarà de ser 15 a 1000.
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup(){
myservo.attach(9);
}
void loop(){
for(pos = 0; pos < 180; pos += 90){
myservo.write(pos);
delay(1000);
}
for(pos = 180; pos>=1; pos-=90){
myservo.write(pos);
delay(1000);
}
}
PROGRAMA 3: (0°--> 180° (+30°)
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup(){
myservo.attach(9);
}
void loop(){
for(pos = 0; pos <=180; pos += 30) {
myservo.write(pos);
delay(180);
}
myservo.write(0);
delay(200);
}
En aquest programa farem que l'eix del servo passi de 0º a 180º però anant de 30º en 30º.
En ser aquest codi una altra variació, el principi continua sent el mateix novament sent el que canviï les instruccions dins del "loop"
En aquest cas el "for", en haver d'anar de 30 en 30, en comptes de sumar 1 com en el primer codi o 90 com en el segon, sumarem 30 i el valor de "delay", en aquest codi, serà de 180 mil·lisegons.
En aquest codi, però, l'eix del servo no ha de fer el recorregut de tornada sinó que ha de tornar a la posició inicial, és a dir, 0.
D'aquesta manera, fora del "for", escriurem la instrucció "myservo.write(0)" i abans de tornar a repetir el "for", farem una pausa de 200 mil·lisegons amb un "delay(200)".
D'aquesta manera quedaria acabat el tercer i últim codi
VÍDEOS
1.
2.
3.