Este robot dispone de sensores de ultrasonidos, por delante y por el lado derecho. Cuando se encuentra un obstáculo delante gira a la izquierda. Si se le acaba la pared por la derecha, la busca girando a la derecha.
Uso del sensor de ultrasonidos HC-SR04
El emisor/receptor de ultrasonidos HC-SR04 se emplea en todo tipo de proyectos, siendo su principal uso el de reconocer obstáculos, aunque debido a su buena resolución, también se emplea para medir la distancias a objetos. Puede medir distancias entre 3 Cm y 3 metros, con una precisión de 3 mm.
Lo más singular del sensor de ultrasonidos HC-SR04 es quizás su "par de ojos", estos no son más que un emisor y un receptor de ultrasonidos que trabajan a una frecuencia de 40KHz (una frecuencia inaudible para las personas).
Este sensor tiene 4 pines, la alimentación (Vcc) a 5 voltios, un disparador (Trig), el receptor (Echo) y la masa (GND). Para el correcto funcionamiento del sensor es necesario conectar estos 4 pines.
El principio en el que se basa su funcionamiento es muy sencillo, tan solo hay que generar una onda sónica en el emisor mediante un pulso en la patilla que pone "trig" (trigger o disparador), esta onda al encontrarse con algún obstáculo rebotará, volviendo al sensor y siendo registrada por el receptor, traduciéndose esta en un pulso en la patilla "Echo".
Con esto podemos hacer dos cosas, detectar un obstáculo esperando simplemente que Arduino reciba un "Echo" o contar el tiempo que transcurre desde que se manda el pulso por el trigger hasta que se recibe, de esta forma, y conociendo cual es la velocidad del sonido, podemos determinar de forma muy sencilla la distancia exacta a la que se encuentra el objeto en el que esta rebotando la señal.
Para aclarar un poco el factor de multiplicación que vamos a introducir en Arduino, basta con decir que la velocidad es igual al espacio dividido por el tiempo que se tarda en recorrer dicho espacio. La velocidad del sonido es conocida (343 m/s) y el tiempo lo vamos a determinar, como el tiempo que transcurre desde que efectuamos el disparo hasta que recibimos el eco.
El siguiente programa emite un pulso por el pin 9 que está asignado al "trigger" que previamente se habrá reseteado (puesto a LOW) para evitar problemas.
digitalWrite(pulso,LOW); //Por cuestión de estabilización del sensor
delayMicroseconds(5);
digitalWrite(pulso, HIGH); //envío del pulso ultrasónico
delayMicroseconds(10);
Y en las siguientes instrucciones se obtiene el tiempo (al recibir el "echo") y se aplica la fórmula explicada anteriormente para obtener la distancia exacta al objeto
tiempo = pulseIn(rebote, HIGH); //función para medir el tiempo y guardarla en la variable "tiempo"
distancia = 0.01715*tiempo; //fórmula para calcular la distancia
#define es un comando que permite asignar valor a una constante antes de compilar el programa. En este programa también podríamos haber escrito int pulso = 9; y int rebote = 10;.
/*
PRACTICA 1 "SENSOR DE ULTRASONIDOS"
Muestra la distancia a la que se encuentran los objetos
*/
#define pulso 9; //define la salida por donde se manda el pulso como 9
#define rebote 10; //define la salida por donde se recibe el rebote como 10
int distancia; //crea la variable "distancia"
float tiempo; //crea la variable tiempo (como float)
void setup()
{
Serial.begin(9600); //inicializa el puerto serie
pinMode(pulso, OUTPUT); //Declaramos el pin 9 como salida (pulso ultrasonido)
pinMode(rebote, INPUT); //Declaramos el pin 10 como entrada (recepción del pulso)
}
void loop()
{
digitalWrite(pulso,LOW); //Por cuestión de estabilización del sensor
delayMicroseconds(5);
digitalWrite(pulso, HIGH); //envío del pulso ultrasónico
delayMicroseconds(10);
tiempo = pulseIn(rebote, HIGH); //función para medir el tiempo y guardarla en la variable "tiempo"
distancia = 0.01715*tiempo; //fórmula para calcular la distancia
/*Monitorización en centímetros por el monitor serial*/
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
delay(3000);
}
Uso del sensor de distancia de infrarrojos Sharp 2Y0A21
Este sensor consta de tres patas: alimentación, tierra y salida. La tensión en esta última variará entre 0,3 y 3,1 voltios en función de la distancia medida. Se puede utilizar en distancias desde 10 a 80 centímetros.
En cuanto a la alimentación, ésta debe estar entre 4,5 y 5,5 voltios, recomendándose que sea lo más estable posible. En caso de no ser muy estable pueden producirse errores en la tensión de salida. Un modo de compensar las oscilaciones a la entrada es la adición de un condensador de 10 µF entre las patas de alimentación y tierra a modo de filtro.
Podemos utilizar el siguiente código para probar uno de estos sensores IR de Sharp.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Pines de lectura
int
ir_sensor0 = A0;
void
setup()
{
// inicia comunicaciones serie a 9600 bps
Serial.begin(9600);
}
void
loop()
{
int
lectura, cm;
lectura = analogRead(ir_sensor0); // lectura del sensor 0
cm = pow(3027.4 / lectura, 1.2134); // conversión a centímetros
Serial.print("Sensor 0: ");
Serial.println(cm); // lectura del sensor 0
delay(500); // tiempo de espera
}
Uso de una barrera de infrarrojos
Este tipo de sensores utiliza un LED emisor de infrarrojos y otro LED detector. Cuando detecta un objeto da una señal de salida que se puede recoger en una entrada digital de Arduino. Mediante un potenciómetro se puede regular la distancia a la que detecta el obstáculo.
Su alcance es muy pequeño, tan solo alcanza 5, o como mucho, 6 centímetros. Como contrapartida es muy fiable.