Un servomotor es un motor que tiene la particularidad de que su eje de giro se mueve de 0 hasta 180º.
El ejercicio a consiste simplemente en abrir un ejemplo preinstalado en Arduino (Sweep), y cargarlo. El servo empezará a girar de un lado a otro.
// Sweep
// by BARRAGAN <http://barraganstudio.com>
// This example code is in the public domain.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0; // variable to store the servo position
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
Ahora controlaremos el giro del servo con un potenciómetro.
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup() {
myservo.attach(9);
}
void loop() {
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
delay(15);
}
Modificar el ejercicio b para que el potenciómetro, a la vez que se determine la posición del servo, determine cuántos LEDs se encienden (usar 5 LEDs). Esto es, construir un indicador de posición del servo mediante LEDs.
Ningún LED encendido si estamos en 0 grados, todos encendidos si estamos en 180 grados (habrá que usar una estructura if para dividir en cinco segmentos la lectura analógica 0-1023 y aplicar una estructura for para encender los LEDs).
Como aquí la cosa se complica, he hecho el código de dos formas diferentes, primero una versión directa, con instrucciones que ya hemos visto aquí y una segunda versión más depurada.
Ver1. Modo directo
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
int DL1 = 1;
int DL2 = 2;
int DL3 = 3;
int DL4 = 4;
int DL5 = 5;
void setup() {
myservo.attach(9);
pinMode(DL1, OUTPUT);
pinMode(DL2, OUTPUT);
pinMode(DL3, OUTPUT);
pinMode(DL4, OUTPUT);
pinMode(DL5, OUTPUT);
}
void loop() {
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
//Cero
if ( val <= 29 )
{
digitalWrite(DL1,LOW);
digitalWrite(DL2,LOW);
digitalWrite(DL3,LOW);
digitalWrite(DL4,LOW);
digitalWrite(DL5,LOW);
}
//Uno
else if ( val > 29 && val <= 59 )
{
digitalWrite(DL1,HIGH);
digitalWrite(DL2,LOW);
digitalWrite(DL3,LOW);
digitalWrite(DL4,LOW);
digitalWrite(DL5,LOW);
}
//Dos
else if ( val > 59 && val <= 89 )
{
digitalWrite(DL1,HIGH);
digitalWrite(DL2,HIGH);
digitalWrite(DL3,LOW);
digitalWrite(DL4,LOW);
digitalWrite(DL5,LOW);
}
//Tres
else if ( val > 89 && val <= 119 )
{
digitalWrite(DL1,HIGH);
digitalWrite(DL2,HIGH);
digitalWrite(DL3,HIGH);
digitalWrite(DL4,LOW);
digitalWrite(DL5,LOW);
}
//Cuatro
else if ( val > 119 && val <= 149 )
{
digitalWrite(DL1,HIGH);
digitalWrite(DL2,HIGH);
digitalWrite(DL3,HIGH);
digitalWrite(DL4,HIGH);
digitalWrite(DL5,LOW);
}
//Cinco
else if ( val > 149 && val <= 180 )
{
digitalWrite(DL1,HIGH);
digitalWrite(DL2,HIGH);
digitalWrite(DL3,HIGH);
digitalWrite(DL4,HIGH);
digitalWrite(DL5,HIGH);
}
delay(15);
}
Ver2. Con bucle for
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
// Conectar los LEDS en las salidas 2, 3, 4, 5 y 6
void setup() {
myservo.attach(9);
// use a for loop to initialize each pin as an output:
for (int DL = 2; DL < 7; DL++) {
pinMode(DL, OUTPUT);
}
}
void loop() {
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
//Cero
if ( val <= 29 )
{
for (int DL = 2; DL < 7; DL++){
digitalWrite(DL, LOW);
}
}
//Uno
else if ( val > 29 && val <= 59 )
{
for (int DL = 2; DL < 3; DL++){
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(DL, HIGH);
}
}
//Dos
else if ( val > 59 && val <= 89 )
{
for (int DL = 2; DL < 4; DL++){
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(DL, HIGH);
}
}
//Tres
else if ( val > 89 && val <= 119 )
{
for (int DL = 2; DL < 5; DL++){
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(DL, HIGH);
}
}
//Cuatro
else if ( val > 119 && val <= 149 )
{
for (int DL = 2; DL < 6; DL++){
digitalWrite(6, LOW);
digitalWrite(DL, HIGH);
}
}
//Cinco
else if ( val > 149 && val <= 180 )
{
for (int DL = 2; DL < 7; DL++){
digitalWrite(DL, HIGH);
}
}
delay(15);
}
BARRAGAN http://barraganstudio.com
http://www.thinkbit.org/practica-4/
Anterior - Proyecto 3
Siguiente - Proyecto 5.1