sábado, 1 de febrero de 2014

Radar con Arduino y Processing (II) - Hardware

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
 
//Importamos las librerias que vamos a utilizar.
#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...