Mostrando las entradas con la etiqueta sonar. Mostrar todas las entradas
Mostrando las entradas con la etiqueta sonar. Mostrar todas las entradas

domingo, 16 de agosto de 2015

¿Sonar?

Bueno, luego de hacer las publicaciones del medidor de distancia por ultrasonido, del servo y de la pantalla, se me ocurrió realizar un radar. En el título lo puse entre signos de pregunta, porque no sé hasta que punto es factible realizarlo, pero si es necesario lo vamos a realizar en 2 o 3 publicaciones.

No es un proyecto propiamente dicho porque no va a tener utilidad. Quizá se pregunten ¿porqué?, bueno la razón o razones son sencillas:

1) Tiene un alcance ridículamente limitado (en las publicación del ultrasonido pude ver que tenía un máximo de 2 metros aproximadamente)

2) Los tiempos van a ser cruciales, por lo que parecería que no se va a poder mostrar en tiempo real el objeto.

Pero a pesar de esas cosas voy a desarrollarlo por "amor al arte" y ver que sale, quizá se pueda conseguir algo interesante.

Entonces, para empezar, voy a reciclar código (como no podía ser de otra forma) de la publicación del servo, de la pantalla y del ultrasonido.

La idea sería mostrar en la pantalla los puntos que se consideran que bloqueen la "vista" del ultrasonido.

Sin más, les dejo el código:


//pantalla
#include <Adafruit_GFX.h>                                    // Core graphics library
#include "SWTFT.h"                                           // Hardware-specific library
//algunos colores
#define negro     0x0000
#define azul      0x001F
#define rojo      0xF800
#define verde     0x07E0
#define cyan      0x07FF
#define magenta   0xF81F
#define amarillo  0xFFE0
#define blanco    0xFFFF
//de la pantalla
SWTFT tft;

//para el touch
#include <stdint.h>
#include "TouchScreen.h"
//declaraciones para el touch
#define YP A1                                                // must be an analog pin, use "An" notation!
#define XM A2                                                // must be an analog pin, use "An" notation!
#define YM 7                                                 // can be a digital pin
#define XP 6                                                 // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

//servo
#include <SoftwareServo.h>
SoftwareServo servo1;

//ultrasonido
#define trigPin 32
#define echoPin 34

int x = 0, y = 0, x1 = 0, y1 = 0, check = 1;
long distancia;

void setup() {
  servo1.attach(30);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  tft.reset();
  tft.begin();
  tft.fillScreen(negro);
  tft.setRotation(3);
  tft.fillCircle(50, 50, 10, blanco);
  Serial.begin(9800);
}

void loop() {
  tft.fillScreen(negro);
  for (int val = 0; val <= 180; val++)
  {
    servo1.write(val);
    ultrasonido();                                                                      //obtenemos la distancia hasta el objeto
    tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco);  //ubicamos el cursor en el medio abajo 
    SoftwareServo::refresh();                                                           //y situamos el punto donde esté el objeto
  }
  tft.fillScreen(negro);
  for (int val = 180; val >= 0; val--)
  {
    servo1.write(val);
    ultrasonido();                                                                      //obtenemos la distancia hasta el objeto
    tft.fillCircle((160-(distancia*cos(val))), (240-((distancia*sin(val))/2)), 2, blanco);  //ubicamos el cursor en el medio abajo
    SoftwareServo::refresh();                                                           //y situamos el punto donde esté el objeto
  }
}

void ultrasonido() {

  long duracion;
a:;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
  duracion = pulseIn(echoPin, HIGH);
  SoftwareServo::refresh();
  distancia = (duracion/2) / 29.1;
  if (distancia > 450)
  {
    goto a;                                                                              //si el objeto está muy lejos volvemos a
  }                                                                                      //buscar el valor
  Serial.println(distancia);
}