jueves, 3 de octubre de 2019

Radar Con Ultrasonico+Arduino uno y Processing Tutorial





 Radar Con Ultrasonico+Arduino uno y Processing Tutorial
Radar Arduino


En este tutorial de Arduino, le mostraré cómo puede hacer que este radar se vea bien usando la placa Arduino y el entorno de desarrollo de procesamiento. Puede ver el siguiente video o leer el tutorial escrito a continuación para obtener más detalles.

Visión de conjunto

Todo lo que necesita para este proyecto Arduino es un sensor ultrasónico para detectar los objetos, un pequeño servomotor para aficionados para girar el sensor y una placa Arduino para controlarlos. Puede ver el siguiente video o leer el tutorial escrito a continuación.

Componentes necesarios para este proyecto Arduino


Puede obtener estos componentes de cualquiera de los siguientes sitios:

   1.-Sensor ultrasónico HC-SR04

    2.-Servomotor

   3.- Arduino
    4.-Tablero de pruebas y alambres de salto


Construyendo el dispositivo

 Primero hice un soporte de cartón para conectar el sensor ultrasónico al servomotor. Lo doblé como se muestra en la imagen de abajo, lo pegué y lo aseguré al servomotor con un tornillo como este.

Códigos fuente

 Ahora tenemos que hacer un código y subirlo a la placa Arduino que permitirá la interacción entre el Arduino y el IDE de procesamiento. Para comprender cómo funciona la conexión, haga clic aquí para visitar mi Tutorial de Arduino y Procesamiento.

Aquí está el código fuente de Arduino con la descripción de cada línea del código:


   // Incluye la biblioteca de servos

    #include <Servo.h>.

    // Define los pines Tirg y Echo del sensor ultrasónico

    const int trigPin = 10;

    const int echoPin = 11;

    // Variables para la duración y la distancia.
 

    long duration;

    int distance;

    Servo myServo; // Crea un servo objeto para controlar el servomotor

    void setup() {

    pinMode(trigPin, OUTPUT); // Establece el echoPin como una entrada

    pinMode(echoPin, INPUT); // Establece el echoPin como una entrada

    Serial.begin(9600);

    myServo.attach(12); // Define en qué pin está conectado el servomotor

    }

    void loop() {

    // gira el servomotor de 15 a 165 grados

    for(int i=15;i<=165;i++){

    myServo.write(i);

    delay(30);

    distance = calculateDistance();// Llama a una función para calcular la distancia medida por el sensor ultrasónico para cada grado

    Serial.print(i); // Envía el grado actual al puerto serie

    Serial.print(","); // Envía el carácter de suma justo al lado del valor anterior necesario más adelante en el IDE de procesamiento para la indexación
    Serial.print(distance); // Envía el valor de la distancia al puerto serie
    Serial.print("."); // Envía el carácter de suma justo al lado del valor anterior necesario más adelante en el IDE de procesamiento para la indexación
    }

    // Repite las líneas anteriores de 165 a 15 grados
    for(int i=165;i>15;i--){

    myServo.write(i);

    delay(30);

    distance = calculateDistance();

    Serial.print(i);

    Serial.print(",");

    Serial.print(distance);

    Serial.print(".");

    }

    }

    // Función para calcular la distancia medida por el sensor ultrasónico


    int calculateDistance(){

    digitalWrite(trigPin, LOW);

    delayMicroseconds(2);

    // Establece el trigPin en estado ALTO durante 10 microsegundos

    digitalWrite(trigPin, HIGH);

    delayMicroseconds(10);

    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH); // Lee el echoPin, devuelve el tiempo de viaje de la onda sonora

    distance= duration*0.034/2;

    return distance;

    }
--------------------------------------------------------------------------------------------------------------------------

Aquí está el código fuente de procesamiento completo del radar Arduino con processing:

//https://roboticaytecnologia.com
//https://jlizarazurocha.com

import processing.serial.*; // imports library for serial communication
import java.awt.event.KeyEvent; // imports library for reading the data from the serial port
import java.io.IOException;
Serial myPort; // defines Object Serial
// defubes variables
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
 
 size (1200, 700); // ***CHANGE THIS TO YOUR SCREEN RESOLUTION***
 smooth();
 myPort = new Serial(this,"COM3", 9600); // starts the serial communication
 myPort.bufferUntil('.'); // reads the data from the serial port up to the character '.'. So actually it reads this: angle,distance.
}
void draw() {
 
  fill(98,245,31);
  // simulating motion blur and slow fade of the moving line
  noStroke();
  fill(0,4);
  rect(0, 0, width, height-height*0.065);
 
  fill(98,245,31); // green color
  // calls the functions for drawing the radar
  drawRadar();
  drawLine();
  drawObject();
  drawText();
}
void serialEvent (Serial myPort) { // starts reading data from the Serial Port
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
 
  index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
  angle= data.substring(0, index1); // read the data from position "0" to position of the variable index1 or thats the value of the angle the Arduino Board sent into the Serial Port
  distance= data.substring(index1+1, data.length()); // read the data from position "index1" to the end of the data pr thats the value of the distance
 
  // converts the String variables into Integer
  iAngle = int(angle);
  iDistance = int(distance);
}
void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  // draws the arc lines
  arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
  arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
  arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
  arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
  // draws the angle lines
  line(-width/2,0,width/2,0);
  line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
  line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
  line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
  line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
  line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
  line((-width/2)*cos(radians(30)),0,width/2,0);
  popMatrix();
}
void drawObject() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  strokeWeight(9);
  stroke(255,10,10); // red color
  pixsDistance = iDistance*((height-height*0.1666)*0.025); // covers the distance from the sensor from cm to pixels
  // limiting the range to 40 cms
  if(iDistance<40){
    // draws the object according to the angle and the distance
  line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
  }
  popMatrix();
}
void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // draws the line according to the angle
  popMatrix();
}
void drawText() { // draws the texts on the screen
 
  pushMatrix();
  if(iDistance>40) {
  noObject = "Out of Range";
  }
  else {
  noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, height-height*0.0648, width, height);
  fill(98,245,31);
  textSize(25);
 
  text("10cm",width-width*0.3854,height-height*0.0833);
  text("20cm",width-width*0.281,height-height*0.0833);
  text("30cm",width-width*0.177,height-height*0.0833);
  text("40cm",width-width*0.0729,height-height*0.0833);
  textSize(40);
  text("Indian Lifehacker ", width-width*0.875, height-height*0.0277);
  text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
  text("Distance: ", width-width*0.26, height-height*0.0277);
  if(iDistance<40) {
  text("        " + iDistance +" cm", width-width*0.225, height-height*0.0277);
  }
  textSize(25);
  fill(98,245,60);
  translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
  rotate(-radians(-60));
  text("30°",0,0);
  resetMatrix();
  translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
  rotate(-radians(-30));
  text("60°",0,0);
  resetMatrix();
  translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
  rotate(radians(0));
  text("90°",0,0);
  resetMatrix();
  translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
  rotate(radians(-30));
  text("120°",0,0);
  resetMatrix();
  translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
  rotate(radians(-60));
  text("150°",0,0);
  popMatrix();

No hay comentarios.:

Publicar un comentario