Sigue-Líneas con LDR y servos
Tutorial para crear tu propio robot siguelineas
Materiales
1 Arduino (en el ejemplo se usa Arduino UNO)
2 servos de rotación continua (ver instrucciones)
1 TetraBrik
2 tapones de botella
2 LEDs (preferentemente rojos de alta luminosidad)
2 resistencias 100ohm para los LEDs
2 fotoresistencias (LDR)
2 resistencias 3.3k para las LDR
4 pilas AA
Un portapilas
Instrucciones
Como sabéis los servos por regla general tienen un ángulo de giro de 180º, pero para este ejemplo
necesitamos que gire de forma continua; para ello podemos comprar un servo de rotación continua o
bien trucar uno normal.
En nuestro caso hemos elegido la opción de trucar 2 servos que ya teníamos en casa. Para ello lo
único que hay que hacer es sustituir el potenciómetro que traen por 2 resistencias del mismo valor
como vemos en la imagen.
Tras modificarlos, podemos probarlos utilizando el siguiente sketch:
https://gist.github.com/4m1g0/7507480.
CÓDIGO FUENTE:
// Prueba de servos giro continuo
// bricolabs.cc
// Este código es de uso libre
#include <Servo.h>
Servo myservo; // Creamos el objeto de servo
const int speed0 = 90; // valor en el que el servo se mantiene quieto (es posible que haga falta
variarlo //un poco)
int i; // iterador
void setup()
{
myservo.attach(8); // attaches the servo on pin 9 to the servo object
}
void loop()
{
for(i = 0; i < 90; i++) // vamos desde velocidad 0 hasta velocidad 90 (maximo)
{
myservo.write(speed0 + i);
delay(15);
}
myservo.write(speed0);
delay(1000);
// sentido contrario
for(int i = 0; i < 90; i++) // vamos desde velocidad 0 hasta velocidad 90 (maximo)
{
myservo.write(speed0 - i);
delay(15);
}
myservo.write(speed0);
delay(1000);
}
El funcionamiento es simple: escribiendo 90 en la salida PWM del servo se mantendrá quieto, con 0
girará a máxima velocidad hacia uno de los sentidos y con 180 en el otro sentido. Con los valores
intermedios podemos controlar la velocidad.
El siguiente paso es fabricar las ruedas del robot, para lo que utilizaremos 2 tapones de botella. En
nuestro caso el TetraBrick ya tenía un tapón circular, así que lo vamos a utilizar. No importa que
ambos tapones no sean exactamente del mismo diámetro, el robot va a poder compensar ese
defecto por software. También hemos usado una goma elástica para evitar que resbale.
Ahora vamos a hacer los sensores. Los LDR los hemos rodeado con cinta termo-retráctil negra, para
que la luz sólo incida verticalmente, pero podéis hacer el mismo efecto con un poco de cinta aislante
negra que lo rodee.
El circuito es muy sencillo:
Ten en cuenta que en el caso del dibujo, la líneas de
la placa perforada están unidas verticalmente. En el esquema podemos ver en detalle cómo se
conecta uno de los dos sensores. Vo es la conexión con el pin A0 y A1 respectivamente del arduino.
Posteriormente hemos tapado también el led y el LDR juntos de modo que la luz no se disperse y
hemos procedido a probarlo, para ello hemos usado el siguiente sketch:
https://gist.github.com/4m1g0/7508128
Código:
// Prueba de sensor siguelineas
// bricolabs.cc
// Este codigo es de uso libre
int right = 0;
int left = 0;
int umbral = 100;
int origenRight = 0;
int origenLeft = 0;
void setup()
{
Serial.begin(9600);
origenRight = analogRead(A0);
origenLeft = analogRead(A1);
}
void loop()
{
right = analogRead(A0);
left = analogRead(A1);
if (origenRight - right > umbral)
{
Serial.println("Gira a la derecha");
}
else if (origenLeft - left > umbral)
{
Serial.println("Gira a la izquierda");
}
else
{
Serial.println("sigue de frente");
}
}
Al iniciar el programa de Arduino debe colocar ambos sensores en una zona blanca (o de color claro
uniforme), ese será el valor que tome como referencia. Posteriormente puede mover el sensor sobre
una línea negra dibujada en el papel y deberá escribir en el terminal lo que haría el robot en esa
situación.
Ahora queda conectarlo todo; en nuestro caso hemos usado un porta pilas impreso en 3D, pero
puedes usar cualquier porta pilas o incluso unir las 4 pilas en serie de la mejor manera que puedas.
Lo importante, es que necesitamos sacar 3 cables del conjunto:
– 0V (masa)
– 4,5V (para los servos)
– 6V (para el arduino)
Conectamos:
6V al pin Vin del Arduino.
0V a un pin GND del Arduino.
4.5V a ambos cables de alimentación de los servos (normalmente rojo).
Ambos cables de tierra de los servos los conectamos a 0V (en el porta pilas).
El cable de alimentación del sensor a 5V del Arduino.
El cable de tierra del sensor a un pin GND.
El cable del LDR derecho al pin analógico A0.
El cable del LDR izquierdo al pin analógico A1.
El cable de datos del servo derecho al pin 8.
El cable de datos del servo izquierdo al pin 9.
Por último sólo nos falta cargar el código. Nosotros te dejamos un sketch de ejemplo, pero deberás
modificarlo adaptando velocidades y valores a tus servos y a tu robot para que funcione
correctamente.
https://github.com/4m1g0/siguelineas
Código:
//Siguelineas
// bricolabs.cc
#include <Servo.h>
Servo Rservo;
Servo Lservo;
const int R0 = 78; // 2
const int L0 = 81; // 1
int Rspeed = -10;
int Lspeed = 10;
int right = 0; // variable to store the servo position
int left = 0;
int origenRight = 0;
int origenLeft = 0;
int umbral = 100;
void setup()
Rservo.attach(8);
Lservo.attach(9);
Serial.begin(9600);
Rservo.write(R0);
Lservo.write(L0);
// obtenemos un patrón de luminosidad del fondo
int repeticiones = 10;
for (int i = 0; i< repeticiones; i++)
origenRight += analogRead(A0);
origenLeft += analogRead(A1);
if (i%2 == 0)
Rservo.write(R0);
Lservo.write(L0+(Lspeed/2));
} else {
Rservo.write(R0+(Lspeed/2));
Lservo.write(L0);
delay(200);
Rservo.write(R0);
Lservo.write(L0);
origenRight = origenRight/repeticiones; // media
origenLeft = origenLeft/repeticiones;
delay(2000);
void loop()
right = analogRead(A0);
left = analogRead(A1);
if (origenRight - right > umbral)
Rservo.write(R0-Rspeed/2);
Lservo.write(L0+Lspeed*2);
Serial.println("Gira a la derecha");
else if (origenLeft - left > umbral)
Rservo.write(R0+Rspeed*2);
Lservo.write(L0-Lspeed/2);
Serial.println("Gira a la izquierda");
Rservo.write(R0+Rspeed);
Lservo.write(L0+Lspeed);
Serial.println("sigue de frente");