PROYECTO RADAR
(CON SERVO Y SENSOR ULTRASONIDOS)
Programa dibujo Processing:
/Proyecto: radar
import processing.serial.*; //Librería para utilizar el puerto serie
Serial mipuerto; //Creamos una instancia tipo puerto serie y la llamamos "mipuerto"
int RADIO = 300; //Tamaño de la zona de detección
float distancia = 0; //Guarda la distancia a un objeto
float angulo = 0; //Guarda el ángulo en el que apunta el sensor
float[] objetos = new float[100]; //Lista en la que guardaremos la posición de todos los objetos encontrados
int n = 0; //Índice para recorrer esta lista
void setup()
{
mipuerto = new Serial(this, "/dev/ttyACM0", 9600); //Definimos nuestro puerto serie donde está conectado Arduino COM10
mipuerto.bufferUntil('.'); //Cuando aparezca un punto leeremos los datos del puerto serie
//size(RADIO*2,RADIO); //Tamaño de la pantalla
size(600,300);
frameRate(5); //Velocidad de reproducción
}
void draw()
{
//Guardamos las coordenadas (x,y) y el brillo de cada objeto
//que encontramos en el radio de acción (1 metro)
if((distancia>0) && (distancia<100)){ //Alcance del radar 1 metro
objetos[n]=int(distancia*(RADIO/100)*cos(angulo)); //Coordenada x
objetos[n+1]=int(-distancia*(RADIO/100)*sin(angulo)); //Coordenada y
objetos[n+2] = 255; //Brillo inicial al máximo
n=n+3; //Incrementamos el índice de nuestra lista de objetos praparados para el próximo
if(n>98) n=0; //Si llegamos al final volvemos a guardar objetos desde el principio
}
fondo(); //Dibujamos el fondo
//Dibujamos la zona de visión del radar
noStroke();
fill(0,150,0);
triangle(0,0,RADIO*cos(angulo),-RADIO*sin(angulo),
RADIO*cos(angulo+0.3),-RADIO*sin(angulo+0.3));
//Dibujamos los objetos encontrados de nuestra lista
for(int i=0 ; i<98 ; i=i+3 ){
noStroke();
fill(0,255,0,objetos[i+2]);
ellipse(objetos[i],objetos[i+1],20,20);
objetos[i+2] = objetos[i+2] - 10; //Los puntos van perdiendo brillo cada vez
}
}
//Función para leer los datos del puerto serie.
//Cada vez que aparezca un punto se ejecuta esta función
void serialEvent(Serial mipuerto)
{
//Extraemos los datos del puerto serie
String datos = mipuerto.readStringUntil('.'); //Lee el puerto hasta que encuentra un punto
datos = datos.substring(0, datos.length() - 1); //Guardamos los datos leidos y quitamos el punto final
int index = datos.indexOf(","); //Posición de la coma en la cadena de datos
//Extraemos el primer dato de la cadena, la distancia
distancia = float (datos.substring(0, index));
//Extraemos el segundo dato de la cadena, la posición que pasamos a radianes
angulo = radians (float (datos.substring (index+1 , datos.length())));
}
//Función que dibuja el fondo de pantalla
void fondo()
{
background(0,0,0); //Borra la pantalla
stroke(0,255,0); //Color del trazo: verde
strokeWeight(1); //Grosor del trazo: 1 píxel
noFill( ); //Sin relleno
translate(RADIO,RADIO); //Nos colocamos en el centro
ellipse(0,0,RADIO*2,RADIO*2); //Dibuja los 3 círculos
ellipse(0,0,RADIO*4/3,RADIO*4/3);
ellipse(0,0,RADIO*2/3,RADIO*2/3);
for(int a=30 ; a<180 ; a=a+30){ //Dibuja los 6 sectores de 30º
float angl = radians (a);
line(0,0, RADIO*cos(angl), -RADIO*sin(angl));
}
}
Programa Arduino:
//Proyecto: radar
#include <Servo.h> //Librería para manejar los servos
#define ECHOPIN 7 //Pines a los que conectamos el sensor y el servo
#define TRIGPIN 8
#define SERVOPIN 9
Servo myservo; //Creamos una instancia para nuestro servo
int pos = 0; //Guarda la posición del servo en grados
int dist; //Guarda la distancia a un objeto detectado
void setup() {
Serial.begin(9600); //Inicializamos el puerto serie
pinMode(ECHOPIN, INPUT); //Declaramos las salidas y entradas
pinMode(TRIGPIN, OUTPUT);
myservo.attach(SERVOPIN); //Declaramos la salida del servo
}
void loop() {
for(pos=0 ; pos<=180 ; pos=pos+5){
myservo.write(pos); //Mover el servo a la posición
dist = Medir_cm(); //Medir la distancia a un objeto
Print(dist , pos); //Enviar las coordenadas: distancia y posición
delay(10);
}
for(pos=180 ; pos>=0 ; pos=pos-5){
myservo.write(pos);
dist = Medir_cm();
Print(dist , pos);
delay(10);
}
}
//Función para medir la distancia a un objeto
int Medir_cm () {
digitalWrite(TRIGPIN, LOW); //Emitimos el pulso
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
float tiempo = pulseIn(ECHOPIN, HIGH); //Calculamos el tiempo
int distancia = int(tiempo * 0.0343 / 2); //Calculamos la distancia y redondeamos
return(distancia);
}
//Función para enviar la distancia a un objeto y la posición del servo
//Separados por una coma y al final un punto
void Print (int R , int T)
{
Serial.print(R);Serial.print(", ");
Serial.print(T);Serial.println(".");
delay(100);
}