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);
}