Antes que nada mi proyecto consiste en un radar detector de objetos que gira 180º y cualquier obstáculo lo muestra en un pequeño esquema en mi teléfono (LG K9 de 5 pulgadas). El problema llega en el esquema del teléfono, ya que el ángulo me muestra un pequeño porcentaje y no los 180º es decir, no cubre todo el esquema y no sé solucionarlo. Lo demás funciona bien, el único problema es ese. Habrá que ajustar el esquema para que vaya acorde a mi radar. Si alguien soluciona dar con el problema Y me ayuda, le hago un paypal de 30€. Es urgente, ya que a finales de diciembre tengo que presentarlo. El esquema del teléfono lo estoy haciendo con Android Studio y para el radar utilizo arduino. Paso datos:
PARTE ANDROID STUDIO (NO USAR BLOC DE ARDUINO PART, SINO EL QUE YO PASO QUE SE LLAMA DATOS ARDUINO
DATOS ARDUINO.ino (2.1 KB)
DIAGRAMA.pdf (114.0 KB)
No se si te has dado cuenta que estas en un foro de Arduino no de Android o Iphone.
Entonces todo lo que llega hasta el Arduino y su transmisión es competencia de este foro. De ahi en mas podemos darte alguna idea y si alguien en forma particular desea ayudarte esta perfecto.
Pero el resto de la resolución de este problema corresponde a un foro de Android, asi que tenlo presente.
Es el tipico sonar asociado a un servo que lo mueve.
Cada posición del servo dispara una lectura del sensor ultrasónico y eso es enviado via BT imagino al celular.
En ese punto debes verificar via Monitor Serie que se esta enviando.
Si los datos enviados se observan por el Monitor Serie, tal como dije, ahi termina la competencia de este foro.
Este es tu programa, una pena que no lo subieras de modo visible.
// Comando para añadir el microservo
#include <Servo.h>.
// Comando para añadir la función de cada pin del sensor ultrasónico
const int trigPin = 10;
const int echoPin = 11;
const int led1 = 9;
const int led2 = 8;
// Duración y distancia
long duration;
int distance;
Servo myServo; // Instrucciones para el funcionamiento del microservo y de los diodos
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
Serial.begin(9600);
myServo.attach(12); // Añadir el pin donde irá conectado el servomotor
}
void loop() {
// la rotación del servomotor desde los 15º hasta los 160º
for(int i=0;i<=180;i++){
myServo.write(i);
delay(30); // retardo del servomotor
distance = calculateDistance(); // Comando dirigido al sensor para añadir instrucciones sobre los grados
Serial.print(i); // Envia los grados al puerto serie
Serial.print(",");
Serial.print(distance); // Envía los grados al puerto serie
Serial.print(".");
}
// Se debe repetir la configuración del servomotor
for(int i=180;i>0;i--){
myServo.write(i);
delay(30);
distance = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(distance);
Serial.print(".");
}
}
// A contuinuación, se calcula la distancia mínima necesaria para que el sensor detecte el objeto (en este caso 40 cm)
int calculateDistance(){
if (distance < 50){
digitalWrite(led1, LOW); // Se programa el comportamiento de los dos diodos y del zumbador para que enciendan y se apaguen
digitalWrite(led2, HIGH);
}
else{
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
}
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Modificamos el desencadenador del sensor para determinar su condición en ALTA durante 10 microsegundos
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // Determina el tiempo de vuelta del pin echo
distance= duration*0.034/2;
return distance;
}
Bueno, la verdad no entiendo.
// la rotación del servomotor desde los 15º hasta los 160º
for(int i=0;i<=180;i++){
Escribes que vas de 15 a 160 y el for dice de 0 a 180. Cuando veo esto salta a la vista que lo que has hecho es encontrar un código en la web y te has tomado muy poco esfuerzo por entenderlo.
Si escribes que va de 15 a 160 hazlo coincidir con los for de ida y de vuelta. Los dos estan mal.
Sino pon, va de 0 a 180.
Ambos ciclos tienen impresiones por monitor serie. Abre el monitor serie y chequea las lecturas. Si ves cambios cuando tienes un objeto el sistema anda bien.
Lo que ocurre que para que tu Celular vea lo que esta pasando debes comunicarte con el.
Te falta un enlace con tu celular!!.
Será BT, sera WIFI. No se, pero no tienes un vínculo entre ellos.
Analizando el link de github se ve que el arduino lo uso para unas pruebas para mover el servo y nada mas, pero no hay un código en que resuelva todo con arduino.
Te falta un HC-06 como dice el tutorial. Y enviar los mismos datos relevados por el Monitor Serie al celular.
NOTA: tal vez te he malentendido y solo has copiado el trabajo de github y por eso requieres la ayuda. Si esta así ahora comprendo mejor tu pedido.
Debes colocar un BT como un dispositivo serie conectado a un puerto virtual usando SoftwareSerial.
De ese modo te conectas con el Androd y enviarás lo que requiera el celular hablando de angulo y magnitud como coordenadas polares por ejemplo.
Buenas! Estoy utilizando un hc-05 y se conecta correctamente a mi telefono mediante bluetooth. Con el android studio creo la aplicacion y una vez que entro en ella con el telefono me sale que me tengo que conectar al bluetooth. Ahi es donde selecciono hc-05 y ya puedo ver el esquema en el telefono. El problema como mencioné, es que en la aplicacion no gira de 0 grados a 180 grados, sino que gira algo asi como 30 grados en total y solo capta eso de los 180. Lo que quiero hacer es que llegue a girar por completo, pero algo lo impide y no se como resolverlo. Me imagino que sera algun fallo en la aplicacion de android studio pero no se dar con ella. Si me podrias ayudar estaria eternamente agradecido ya que le invertí mucho tiempo y no consigo solucion. Lo demas funciona bien el unico problema es ese, que no alcanza los 180 grados, sino que se atasca.
Ok. Entonces se comunican. Hay enlace, pero por alguna razón no gira todo lo que debe.
Bien.
Explicame algo, tienes conectado el BT a los pines 0 y 1 no?
Creo que los valores van demasiado rápido y no puede el celular recibirlos correctamente.
Agrega una pausa en cada loop. No pasa nada en este caso.
Agrega delay(100) dentro de los for()
Tienes ahora delay(30). Incrementa a 100.
Cambia la velocidad de comunicación del enlace a lo mas alto que tolere, digamos 57600 si lo acepta.
Algunos servos baratos me he encontrado que hay que retocar los impulsos para que funcionen. No usan los impulsos estándar y el resultado podría ser ese.
Prueba writemicroseconds(1500) que debería de ir al mismo sitio que write(90)
Saludos
Buenas! Siento contestarte tan tarde pero he probado lo que me has dicho y no funciona. En el radar se muestran puntos aleatorios ya que se vuelve loco al cambiar esos valores. Es decir, ahora me lo muestra todavia peor que antes ya que incluso se sale del esquema de 180•. La verdad no se que mas hacer porque estoy desesperado..
Buenas dan. Tengo que cambiar solo el valor de 90 por el de 1500 o poner todo writemicroseconds? Gracias. Me pondre con ello a ver y te digo
Haz una captura de pantalla de los datos que ves en el monitor serial y adjuntala así los vemos.
Estoy algo perdido,
Por un lado dices que no te gira 180º y por otro que quizá es un problema de la aplicación Android Studio?
No tiene sentido.
Viendo las fotos de nuevo, me parece raro que sea la solución que yo te he dado. parece ser el típico servo "barato". de todas formas paso a explicarte:
Visualmente, el ultrasonido se ve que gire los 180º? si es así el problema parece estar en Android Studio. Si no gira, el problema puede ser que no le des tiempo suficiente al servo (subir delay), que no le llegue suficiente corriente al servo (ver cómo lo alimentas) o que ese servo funcione con una frecuencia diferente.
En caso de que el problema se en Android Studio, no te podemos ayudar aqui.
En caso de que no le de tiempo al servo a girar deberías subir delays
Y en el caso de que ese servo use una frecuencia diferente de pulso habría que realizar más pruebas o saber marca y modelo para poder buscar. Yo en algún caso me ha pasado esto (se movía muy pocos grados, como 20 o 30) y tuve que cambiar valores del servo.
Yo de ti haría una prueba muy simple:
crear una aplicación y mover el servo a 1º, hacer pausa de 5 segundos y mover servo a 179º y ver si visualmente el servo se mueve esos casi 180º. Si se mueve bien, buscar el problema en el delay o Android
Si no se mueve los 180º, pues ya tirar de lo que te dije
Este es un ejemplo de lo que hice para controlar un servo que modifica la geometría de un turbo:
//variables servomotor turbo
Servo servomotor;
#define pinServo 6 //pin donde está el servomotor
#define servoSpeed 30 //velocidad de rotación del servo
#define servoIzquierda 700 //Us de pulso para enviar para -90º
#define servoDerecha 2300 //Us de pulso a enviar para +90º
//nota: para centro habría que mandar pulso con la siguiente fórmula:
// servoIzquierda+((servoDerecha-servoIzquierda)/2)=1500us
Crear así:
//servomotor del turbo de geometría variable
servomotor.attach(pinServo,servoIzquierda,servoDerecha);
Y giraba el servo así:
servomotor.write(map(ultimaLecturaTps,0,1023,0,180));
Lo del map es para establecer los valores pero puedo usar como tú: servomotor.write(0....180);
Haz la prueba del programa simple como este y nos cuentas:
void loop()
{
myServo.write(1);
delay(5000);
myServo.write(179);
delay(5000);
}
Saludos.
Saludos.
A la inversa lo mismo que le pedi hace 9 dias.
A ver si lo prueba y descubrimos el problema.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.