1. El Octavo Bit
  2. / Arduino
  3. / Proyectos para Arduino
  4. / Realizar un radar con Arduino y Processing

Realizar un radar con Arduino y Processing

| Actualizado:
Comentarios: 0

Realizar un radar con Arduino y Processing
Realizar un radar con Arduino y Processing

En este artículo explicaremos cómo montar un radar con Arduino y utilizaremos el programa processing para representar en la pantalla los datos. Un radar se basa en emitir un impulso de radio que se refleja en un objeto.

A partir de este «eco» se puede extraer gran cantidad de información como, por ejemplo, la distancia en la que se encuentra el objeto. Para este tutorial utilizaremos el sensor de ultrasonidos HC-SR05, aunque se puede utilizar perfectamente el HC-SR04, se diferencian en que el primero tiene 5 pines mientras que el módulo HC-SR04 posee 4 pines, el modo de funcionamiento es idéntico. Si no sabes cómo funciona puedes verlo en este enlace que te dejamos: funcionamiento del módulo HC-SR04 con Arduino.

Antes de comenzar con esta práctica, deberiais leer el artículo Arduino y Processing Comunicación básica por puerto serie.

Material necesario:

  • Placa Arduino o compatible
  • Sensor ultrasónico HC-SR05
  • Soporte para el sensor ultrasónico.
  • Micro servo SG90
  • Protoboard
  • Cables Dupont

Esquema de montaje con Arduino:

  • Sensor ultrasónico: GND a tierra, trigr al pin 10 del arduino, echo al pin 11 de Arduino.
  • Servo: el color marrón representa el cable de tierra, el rojo es el de alimentación y el naranja es el de señal, va conectado al pin 12 del arduino.
Esquema para montar el radar con Arduino y processing
Esquema para montar el radar con Arduino y processing

Código completo para Arduino:

#include "Servo.h"

const int trigPin = 10;
const int echoPin = 11;

long duracion;
int distanciaCM;

Servo radarServo;

void setup(){
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
  radarServo.attach(12);
}

void loop(){
  for(int i=0;i<=180;i++){
    radarServo.write(i);
    delay(50);
    
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(4);
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duracion = pulseIn(echoPin, HIGH);
    distanciaCM = duracion*0.034/2;
    
    Serial.print(i);
    Serial.print("*");
    Serial.print(distanciaCM);
    Serial.print("#");
  }
  
  for(int i=180;i>=0;i--){
    radarServo.write(i);
    delay(50);
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(4);
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duracion = pulseIn(echoPin, HIGH);
    distanciaCM = duracion*0.034/2;
    
    Serial.print(i);
    Serial.print("*");
    Serial.print(distanciaCM);
    Serial.print("#");
  }
}

En el código anterior, lo primero que hacemos es incluir la librería servo y creamos dos constantes con los pines 10 y 11. El 10 recibe la señal del pin Trig del HC-SR05 y el 11 el pin con la señal Echo.

Lo siguente ahora es crear una variable que nos guarde la duración del pulso, es decir, el tiempo que tarda en volver la onda, y en la línea 7 tenemos la variable que nos guardará la distancia a la que esta el objeto.

En la función setup() indicamos el pin Trig como salida, el pin Echo como entrada, inicializamos el puerto serial y definimos a qué pin esta conectado el servo, en nuestro caso al 12.

Dentro de la función loop() tenemos 2 if que realmente hacen lo mismo, pero el primero nos hace un barrido de 0 a 180 grados, y el segundo de 180 a 0 grados. Dentro del if, primero movemos el servo un grado y seguidamente vamos a comprobar si tenemos un objeto delante:

digitalWrite(trigPin, LOW); 
delayMicroseconds(4);
digitalWrite(trigPin, HIGH); 
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH);
distanciaCM = duracion*0.034/2;

En la línea 1 se comienza con un pulso LOW, durante 4 microsegundos, para generar un pulso limpio; seguidamente generamos un pulso HIGH durante 10 microsegundos, para activar el sensor, y procedemos a medir la duración entre pulsos que guardamos en la variable duracion.

Lo último, es medir la distancia en cm, conocemos la velocidad del sonido que es de 343 m/s y tenemos en cuenta que la onda ha ido hasta el objeto y a vuelto.

Lo siguente es mostrar los datos por el monitor serial:

Datos mostrados por el monitor serial
Datos mostrados por el monitor serial

El primer dato es el ángulo, separado por el simbolo * y el segundo es la distancia separado por el símbolo, #. Tened en cuenta esto, para luego en processing recolectar los datos.

Código para processing:

Primero vamos a intentar que nos pinte las rayas verdes del barrido del radar:

import processing.serial.*;

Serial puerto;
String serialAngulo;
String serialDistancia;
String serialDatos;
float objetoDistancia;
int radarAngulo, radarDistancia;
int index=0;

void setup(){
  size (1280, 720);
  
  String puertoUtilizado = "COM5";
  puerto = new Serial(this, puertoUtilizado, 9600);
  
  puerto.bufferUntil('#');
}

void draw(){
  noStroke();
   
  // Líneas del radar
  pushMatrix();  
  strokeWeight(5);
  stroke(10,255,10); // color verde
  translate(640,666);
  line(0,0,640*cos(radians(radarAngulo)),-640*sin(radians(radarAngulo)));  
  popMatrix();
}

void serialEvent (Serial puerto){
  serialDatos = puerto.readStringUntil('#');
  serialDatos = serialDatos.substring(0,serialDatos.length()-1);
  
  index = serialDatos.indexOf("*");
  
  serialAngulo= serialDatos.substring(0, index);
  serialDistancia= serialDatos.substring(index+1, serialDatos.length());
  
  radarAngulo = int(serialAngulo);
  radarDistancia = int(serialDistancia);
}

En la línea 1 importamos la librería necesaria para la comunicación serial, seguidamente creamos las varibles que necesitamos para guardar los datos recibidos por Arduino.

En la funcion setup() indicamos el tamaño de nuestra ventana con la orden size(), comenzamos la comunicación indicando el puerto que estamos utilizando, en este caso COM5. En la línea 17, almacenamos en el buffer hasta el simbolo #, recordad que en el código de Arduino mandábamos primero el ángulo, seprado por un *, segundo la distancia y poníamos un símbolo # antes de comenzar a mandar los nuevos datos.

Para obtener los datos utilizamos la función serialEvent(), veréis que en la línea 33 del código indicamos que lea hasta el símbolo #, tenemos dos datos, el ángulo y la distancia, por lo que tenemos que separar por el símbolo *, extraemos ambos datos y guardamos en las variable radarAngulo y radarDistancia.

En la función draw(), es donde procedemos a dibujar las líneas, es el código comprendido entre las líneas 23 y 29.

Si probamos, comprobaremos que dibujamos la linea correspondiente a cada pulso:

Hacemos que procesing nos muestre las líneas del radar en color verde
Hacemos que procesing nos muestre las líneas del radar en color verde

El siguiente paso es dibujar la línea de color rojo si detecta un objeto dentro de su campo de acción, para eso añadimos el código siguiente justo después de la línea 29:

  pushMatrix();  
  translate(640,666);
  strokeWeight(5);
  stroke(255,10,10); // color rojo
  objetoDistancia = radarDistancia*15;
  if(radarDistancia<40){  // si la distancia es menos de 40 cm
    line(objetoDistancia*cos(radians(radarAngulo)),-objetoDistancia*sin(radians(radarAngulo)),633*cos(radians(radarAngulo)),-633*sin(radians(radarAngulo)));
  }  
  popMatrix();

Comprobemos como funciona:

Procesing nos comienza a mostrar las lineas de color rojo cuando localiza un obstáculo

Nos detecta y representa los objetos en la pantalla, pero comprobaréis que no se desvanecen las líneas, para eso añadimos el siguente código dentro de la función draw() justo debajo de nostroke() y por encima del comentario líneas del radar

  fill(0,4); 
  rect(0, 0, 1280, 720); 
  fill(10,255,10);

Ya solo nos falta que dibuje los arcos y las líneas de separación del radar, para ello añadimos el siguente código, también dentro de la función draw():

  pushMatrix();  
  translate(640,666);
  noFill();
  strokeWeight(2);
  stroke(10,255,10);  
  arc(0,0,1200,1200,PI,TWO_PI);
  arc(0,0,934,934,PI,TWO_PI);
  arc(0,0,666,666,PI,TWO_PI);
  arc(0,0,400,400,PI,TWO_PI);
  strokeWeight(4);
  line(-640,0,640,0);
  line(0,0,-554,-320);
  line(0,0,-320,-554);
  line(0,0,0,-640);
  line(0,0,320,-554);
  line(0,0,554,-320);  
  popMatrix();

Por fin nos parecerá un radar auténtico:

Ya vemos completamente la imagen como sería un radar

Código completo para processing:

import processing.serial.*;

Serial puerto;
String serialAngulo;
String serialDistancia;
String serialDatos;
float objetoDistancia;
int radarAngulo, radarDistancia;
int index=0;

void setup(){
  size (1280, 720);
  
  String puertoUtilizado = "COM5";
  puerto = new Serial(this, puertoUtilizado, 9600);
  
  puerto.bufferUntil('#');
}

void draw(){
  noStroke();
  
  fill(0,4); 
  rect(0, 0, 1280, 720); 
  fill(10,255,10);
 
  //Radar Arcos y líneas  
  pushMatrix();  
  translate(640,666);
  noFill();
  strokeWeight(2);
  stroke(10,255,10);  
  arc(0,0,1200,1200,PI,TWO_PI);
  arc(0,0,934,934,PI,TWO_PI);
  arc(0,0,666,666,PI,TWO_PI);
  arc(0,0,400,400,PI,TWO_PI);
  strokeWeight(4);
  line(-640,0,640,0);
  line(0,0,-554,-320);
  line(0,0,-320,-554);
  line(0,0,0,-640);
  line(0,0,320,-554);
  line(0,0,554,-320);  
  popMatrix();
  
 
  // Líneas del radar
  pushMatrix();  
  strokeWeight(5);
  stroke(10,255,10); // color verde
  translate(640,666);
  line(0,0,640*cos(radians(radarAngulo)),-640*sin(radians(radarAngulo)));  
  popMatrix();

  // Objeto detectado, líneas de color rojo
  pushMatrix();  
  translate(640,666);
  strokeWeight(5);
  stroke(255,10,10); // color rojo
  objetoDistancia = radarDistancia*15;

  if(radarDistancia<40){  // si la distancia es menos de 40 cm
    line(objetoDistancia*cos(radians(radarAngulo)),-objetoDistancia*sin(radians(radarAngulo)),633*cos(radians(radarAngulo)),-633*sin(radians(radarAngulo)));
  }  
  popMatrix();
}

void serialEvent (Serial puerto){
  serialDatos = puerto.readStringUntil('#');
  serialDatos = serialDatos.substring(0,serialDatos.length()-1);
  
  index = serialDatos.indexOf("*");
  
  serialAngulo= serialDatos.substring(0, index);
  serialDistancia= serialDatos.substring(index+1, serialDatos.length());
  
  radarAngulo = int(serialAngulo);
  radarDistancia = int(serialDistancia);
}

 

Artículos que te pueden interesar

¿Cómo hacer un semáforo con Arduino?

¿Cómo hacer un semáforo con Arduino?

| Actualizado:
Comentarios: 0

Simular un semáforo es uno de los clásicos en la iniciación de los proyectos de Arduino. Aquí vamos a mostrar como puedes montar un semáforo sencillo, un semáforo para coches y peatones automatizado y por último, el semáforo para coches…

Robot controlado por bluetooth con Arduino
¿Cómo hacer un coche controlado por bluetooth con Arduino?

¿Cómo hacer un coche controlado por bluetooth con Arduino?

| Actualizado:
Comentarios: 4

En este tutorial construiremos un robot móvil controlado por Bluetooth desde nuestro móvil a través de una aplicación de Android. El montaje y la puesta en funcionamiento de este pequeño coche es sencillo puesto que es el resultado de la…

Radio FM con Arduino y el módulo TEA5767
Hacer una radio FM con Arduino y el módulo TEA5767

Hacer una radio FM con Arduino y el módulo TEA5767

| Actualizado:
Comentarios: 1

En este artículo haremos una radio FM con el módulo TEA5767 para Arduino y utilizaremos una pantalla LCD para mostrar la frecuencia que estamos escuchando. Para el cambio de frecuencia, vamos a utilizar un potenciómetro lineal que después cambiaremos por…

Sonido con Arduino. Zumbador

Sonido con Arduino. Zumbador

| Actualizado:
Comentarios: 0

En este post vamos a aprender a generar sonidos con Arduino. Utilizaremos una señal eléctrica para hacer vibrar la membrana del zumbador. Contenido 1 Sonido con Arduino 2 Generar sonido con un zumbador 3 Sonido controlado por un potenciómetro 4…

Comentarios - 0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *