Voy a describir el hardware (el cacharro en sí) y explicaré como implementarlo.
Lista de componentes:
- Placa Arduino Uno.
- Sensor de ultrasonidos HC-SR04.
- Servo Futaba S3003.
- Porta-pilas (4 pilas AA - 6V en total)
- Cableado y conectores varios.
Comencemos con un esquema de conexión de los distintos elementos.
Esquema realizado con el editor Fritzing
SERVO:
Se conecta el cable de regulación del servo(blanco, amarillo...) al pin 3.
Los otros dos cables del servo son GND (negro) y Vcc (rojo), la alimentación que se conecta directamente a las pilas (6V).
[Nota: Los colores de los cables son orientativos].
SENSOR DE ULTRASONIDOS:
Los terminales GND y Vcc van donde corresponden.
El terminal Trig (disparador), se conecta al pin 9.
El terminal Echo (confirmacion de recepción), se conecta al pin 8.
Y con esto quedaría todo el hardware montado y listo para funcionar. Únicamente habría que tener en cuenta que para que todo esto funcione correctamente, hay que conectar el polo negativo de las pilas a la toma GND de la placa Arduino, es decir, unificar todos los comunes. En caso contrario no funciona nada (a mi a veces se me olvida).
Ahora solo falta el firmware, es decir, el programa Arduino que va a ejecutar el dispositivo.
El codigo del programa es el siguiente:
// RadarV4
// Por Hanoc Asoleid 2014
// Actualizado 31/1/2014
// Por Hanoc Asoleid 2014
// Actualizado 31/1/2014
#include <Ultrasonic.h>
#include <Servo.h>
// Creamos un objeto Ultrasonic el sensor de ultrasonidos, y un objeto servo.
Ultrasonic uSensor(9,8); // El pin 9 es el disparador, el pin 8 el eco (Trig PIN,Echo PIN).
Servo miServo; // Creamos un objeto servo.
int posicion = 0; // variable que almacena la posicion del servo.
int distancia = 0; // variable que almacena la distancia medida por el sensor.
int delta = 1; // incremento de giro del servo (grados)
void setup() {
Serial.begin(9600); // Definimos la frecuencia de transmision del puerto serie
miServo.attach(3); // vincula el objeto servo a la señal de salida del pin 3.
}
void loop() {
for(posicion = 0; posicion < 180; posicion += delta) // Hace que la variable posicion vaya de 0 a 180 en pasos de "delta" grados.
{
miServo.write(posicion); // Mueve el servo hasta la posicion indicada
delay(100); // espera hasta que el servo alcanza la posicion indicada
distancia = uSensor.Ranging(CM); // mide la distancia con el sensor y se asigna a "distancia"
Serial.print("P"); //
Serial.println(posicion); //
Serial.println(distancia); //
delay(10);
}
for(posicion = 180; posicion >= 1; posicion -= delta) // Hace que la variable posicion vaya de 0 a 180 en pasos de "delta" grados.
{
miServo.write(posicion); // Mueve el servo hasta la posicion indicada
delay(100); // espera hasta que el servo alcanza la posicion indicada
distancia = uSensor.Ranging(CM); // se mide la distancia con el sensor y se asigna a "distancia"
Serial.print("P"); // Se escribe "P" en el puerto serie
Serial.println(posicion); // Se escribe el valor de "posicion"
Serial.println(distancia); // Se escribe el valor de "distancia"
delay(10); // espera
}
}
Ahora una breve descripción del codigo.
Se trata de un programa para medir distancias realizando un barrido de 180º con el servo. El servo va a girar desde 0º hasta 180º en pasos de "delta" grados.
En cada posición del servo, se realizan dos operaciones:
- Se mide la distancia con el sensor de ultrasonidos (uSensor.Ranging(CM)).
- Se mandan al puerto serie los valores de posición y distancia con un formato determinado:
- Posicion := P[VALOR_Posicion]
- Distancia := [VALOR_Distancia]
Este programa va complementado por otro programa realizado en Processing que se encarga de leer los datos del puerto serie y representarlos en pantalla.
Pero esto lo veremos en el próximo episodio...