Sonar electrónico con sensor ultrasonido
Materiales Necesarios
- Sensor ultrasonido HC-SR04
- Servomotor
- Arduino UNO
- Jumpers
- Protoboard(Opcional)
- Software Processing. (Descargar)
Diagrama de conexión:
- Conexión servomotor
- El cable café del motor al pin de tierra (GND) de la placa de desarrollo.
- El cable rojo del motor al pin de 5 voltios de la placa de desarrollo.
- El cable amarillo al pin 9 de la placa de desarrollo.
- Conexión sensor ultrasonido HC-SR04
- Pin Vcc del sensor al pin de 5 V de la mini protoboard.
- Pin Gnd del sensor al pin de tierra de la mini protoboard.
- Pin Echo del sensor al pin 11 de la placa de desarrollo.
- Pin Trig del sensor al pin 10 de la placa de desarrollo.
Código funcionamiento servomotor.
#include <Servo.h>
const int trigPin = 10;
const int echoPin = 11;
long duration;
int distance;
Servo myServo;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
myServo.attach(9);
}
void loop() {
for(int i=15;i<=165;i++){
myServo.write(i);
delay(30);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
for(int i=165;i>15;i--){
myServo.write(i);
delay(30);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
}
int calculateDistance(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;
return distance;
}
Código prueba Processing.
Se abrirá una ventana donde al pasar el cursor, esta cambiara de colores.
int barWidth = 20;
int lastBar = -1;
void setup()
{
size(640, 360);
colorMode(HSB, height, height, height);
noStroke();
background(0);
}
void draw()
{
int whichBar = mouseX / barWidth;
if (whichBar != lastBar) {
int barX = whichBar * barWidth;
fill(mouseY, height, height);
rect(barX, 0, barWidth, height);
lastBar = whichBar;
Código final Processing.
IMPORTANTE: En el apartado "SELECCIONAR PUERTO" debemos poner el puerto donde esta conectada la placa de desarrollo.
En el apartado "NOMBRE DEL GRUPO" se debe poner el nombre del equipo de desarrollo del proyecto.
import processing.serial.*; // Importamos librerias de comunicación
import java.awt.event.KeyEvent; // Importamos librerias para leer el puerto.
import java.io.IOException;
Serial myPort;
// definicion de 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); // ***MODIFICAR LA RESOLUCIÓN DE LA PANTALLA***
smooth();
myPort = new Serial(this,"SELECCIONAR PUERTO", 9600); // iNICIAMOS LA COMUNICACIÓN SERIAL
myPort.bufferUntil('.'); // lEEMOS LA INFORMACION DEL PUERTO CARGADO, EL CARACTER '.'. ES USADO PARA LEER ANGULO Y DISTANCIA
}
void draw() {
fill(98,245,31);
noStroke();
fill(0,4);
rect(0, 0, width, height-height*0.065);
fill(98,245,31); // SELECCIONAMOS EL COLOR DEL RADAR
// LLAMAMOS LAS FUNCIONES PARA DIBUJAR EL RADAR
drawRadar();
drawLine();
drawObject();
drawText();
}
void serialEvent (Serial myPort) {
// LEEMOS EL ANGULO Y LA DISTANCIA DESDE LA POSICIÓN 0
data = myPort.readStringUntil('.');
data = data.substring(0,data.length()-1);
index1 = data.indexOf(",");
angle= data.substring(0, index1);
distance= data.substring(index1+1, data.length());
// CONVERTIMOS A STRING LAS VARIABLES ENTERAS
iAngle = int(angle);
iDistance = int(distance);
}
void drawRadar() {
pushMatrix();
translate(width/2,height-height*0.074); // MOVEMOS EL RADAR A NUEVAS COORDENADAS
noFill();
strokeWeight(2);
stroke(98,245,31);
// DIBUJAMOS LAS LINEAS ARQUEADAS
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);
// DIBUJAMOS LAS LINEAS DE ANGULOS
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); // MOVEMOS EL RADAR A NUEVAS COORDENADAS
strokeWeight(9);
stroke(255,10,10); // COLOR ROJO PARA DETECCION DE OBJETOS
pixsDistance = iDistance*((height-height*0.1666)*0.025);
// LIMITE DEL RANGO 40 CM
if(iDistance<40){
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); // MOVEMOS EL RADAR A NUEVAS COORDENADAS
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() {
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("NOMBRE DEL GRUPO", width-width*0.875, height-height*0.0277); // NOMBRE DEL EQUIPO QUE REALIZO EL PROYECTO
text("Ángulo: " + iAngle +" °", width-width*0.48, height-height*0.0277);
text("Dist:", 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();
}
Pública tu duda o comentario
Resuelve tus dudas con la comunidad.
(0) Comentarios
No registra comentarios, se el primero en comentar.
Publicar