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:
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