SONARDUINO

Sonarduino

ÍNDICE
-INTEGRANTES. 1
-INTRODUCCIÓN.. 1
-MATERIALES UTILIZADOS. 2
-DESARROLLO DEL PROYECTO.. 2
-CÓDIGO.. 4
-VÍDEO
-PROBLEMAS ENCONTRADOS. 11
-MEJORAS QUE SE PODRÍAN HACER. 11
-CONCLUSIÓN.. 12

INTEGRANTES

Este proyecto ha sido realizado por
los miembros del grupo 1 del campus de Vicálvaro de la asignatura de Sistemas
Empotrados y de Tiempo Real (SETR). Estos miembros son:
      -José Antonio Plaza Carro.
      -Pablo Priego Pérez.

INTRODUCCIÓN

El objetivo de este proyecto es la
realización de un sonar que detecte los objetos que tiene  una cierta distancia, informando de la
presencia de dichos objetos gracias a un programa y su código correspondiente.
Este programa, llamado “Processing”, se sirve de la pantalla del
ordenador para representar, en un semicírculo, cualquier presencia detectada,
lo que lleva a cabo mediante el color rojo. En caso de no detectar nada,
mostrará el color verde.
Además de saber si hay o no algún
objeto o cualquier otro tipo de presencia en el rango de detección, con este
proyecto es posible conocer la distancia en centímetros a la que se encuentra
ese objeto, ya que “Processing” nos
lo indica en la parte inferior de la pantalla.


MATERIALES UTILIZADOS

-Placa Arduino Uno (40€)
-Cables jumpers
macho-hembra (5€)
-Cables jumpers
macho-macho (3,5€)
-Servomotor (Micro Tower
Pro SG90) (7€)
-Placa Protoboard (6,5€)
-Sensor Ultrasónico
(HCSR04) (6,25€)
-Cartón
-Pistola de pegamento
termofusible (8.50€)
-Varitas de pegamento (2.20€)
Total: 78,95€

DESARROLLO DEL PROYECTO

En primer lugar, nos hemos dedicado a
realizar la parte de las conexiones para saber qué pines de la placa Arduino
vamos a utilizar en el proyecto, conectando todos los cables de manera adecuada
en la protoboard.
Aquí adjunto una foto del esquema de
las conexiones del Sonarduino:

Como vemos en la imagen, se conectan,
también, dos elementos indispensables para hacer funcionar el Sonarduino
correctamente y cuyo funcionamiento explicaremos a continuación. Hablamos del
servo motor y del sensor ultrasónico.
El servomotor servirá para mover el
sensor ultrasónico realizando giros de 180º sobre sí mismo.


El sensor ultrasónico está compuesto
por dos partes, un altavoz que envía ultrasonidos y un micrófono que recoge las
ondas que han rebotado en algún objeto o, si no ha encontrado, tras un tiempo
de espera determina que no hay ningún objeto en su rango. Para calcular la
distancia lo consigue mediante el tiempo que haya tardado en volver a recibir
la onda y devuelve la distancia con el objeto.

Ahora vamos con el código. En esta
parte tenemos el código del Arduino, para hacer que se mueva de una determinada
manera el servomotor y que el sensor recoja datos y, mientras sucede todo esto,
se envía al programa “Processing” que,
como vimos en la introducción, va pintando todos los datos que el sensor le va
enviando mientras el servomotor continúa girando. En la parte del “Processing”, tenemos que decir que hemos
acortado el rango de detección de objetos a 40 cm del sensor para que no sea
muy engorroso.


CÓDIGO

Código del Arduino:
#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(12);
}
void loop() {
 
for(int i=0;i<=180;i++){ 
 
myServo.write(i);
 
delay(30);
 
distance = calculateDistance();
 
 
Serial.print(i);
 
Serial.print(«,»);
 
Serial.print(distance);
 
Serial.print(«.»);
 
}
 
for(int i=180;i>0;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 del Processing:
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String angle=»»;
String distance=»»;
String data=»»;
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
 
 size (1920, 1080);
 smooth();
 myPort = new Serial(this,»COM4″,
9600);
 myPort.bufferUntil(‘.’);
 orcFont =
loadFont(«OCRAExtended-30.vlw»);
}
void draw() {
 
 
fill(98,245,31);
 
textFont(orcFont);
 
noStroke();
 
fill(0,4);
 
rect(0, 0, width, height-height*0.065);
 
 
fill(98,245,31);
 
drawRadar();
 
drawLine();
 
drawObject();
 
drawText();
}
void serialEvent (Serial myPort) {
 
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());
 
 
iAngle = int(angle);
 
iDistance = int(distance);
}
void drawRadar() {
 
pushMatrix();
 
translate(width/2,height-height*0.074);
 
noFill();
 
strokeWeight(2);
 
stroke(98,245,31);
 
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);
 
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);
 
strokeWeight(9);
 
stroke(255,10,10);
 
pixsDistance = iDistance*((height-height*0.1666)*0.025);
 
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);
 
line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle)));
 
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(«Object: » + noObject, 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();
}




VÍDEO


PROBLEMAS ENCONTRADOS

Un problema que no nos ha llevado
mucho tiempo resolver es unir la parte del sensor ultrasónico, al que le hemos
añadido una parte de cartón, al servomotor, ya que la pieza de la que dispone
el servomotor para realizar el movimiento es pequeña, y resulta complicado
acoplar ambos elementos.


Otro problema es que, a la hora de
comunicarse el Arduino con el “Processing”,
no se transmitían correctamente los datos entre ambas aplicaciones, con lo cual
tuvimos que buscar información y nos llevó bastante tiempo adaptar el código
para que se comunicaran sin problemas.


MEJORAS QUE SE PODRÍAN HACER

Una interesante mejora sería, que, en
el momento de detección de un objeto u otra cosa, se emitiese un sonido con
intensidad adaptada a la cercanía del objeto, alertando de una presencia.


Otra posible mejora podría ser añadir
un módulo bluetooth para cambiar la velocidad de giro del Sonarduino y/o el
color de la representación en la pantalla del ordenador a voluntad del usuario
o si el usuario presenta un problema de visión.


CONCLUSIÓN

Como conclusión, valoramos positivamente la
adquisición de conocimientos referentes al desarrollo y usabilidad de la placa
Arduino, así como todo lo referente al desarrollo de este proyecto,
permitiéndonos manejarnos con soltura en caso de necesitar llevar a cabo este
tipo de tarea, pensando, especialmente, en futuras ocasiones que se puedan dar
en el mundo laboral.
Un saludo a todos los futuros lectores.

También te podría gustar...

Deja una respuesta

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