Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
bloqueo de gps
#1
hola a todos
necesito ayuda con un proyecto
estoy intentando  sacar un pulso con una frecuencia determinada por el puerto del arduino
esta frecuencia  viene determinada por la señal recibida  por el  gps
pero se bloquea  y  se queda  pillado en la ultima lectura
 sabeis a que es debido? no tengo mucha experiencia en arduino
he usado el arduinoblock debido a su sencillez

#include <SoftwareSerial.h>



#include "ABlocks_TinyGPS.h"

#include <ABLocks_TimerFreeTone.h>



double velocidad;

double bucle;

double tiempo;



TinyGPS gps;

float gps_lat=0;

float gps_long=0;

float gps_speed_kmph=0;

float gps_speed_mph=0;

float gps_altitude=0;

float gps_course=0;

bool gps_fixed=false;

byte gps_day=0;

byte gps_month=0;

int gps_year=0;

byte gps_hour=0;

byte gps_min=0;

byte gps_sec=0;

byte gps_hund=0;

SoftwareSerial gps_serial(3,2);



void fnc_gps_update()

{

unsigned long fix_age;

gps_serial.listen();

while (gps_serial.available()){

if(gps.encode(gps_serial.read())){

gps_fixed=false;

gps_lat=gps_long=gps_speed_kmph=gps_speed_mph=gps_course=0;

gps_day=gps_month=gps_year=gps_hour=gps_min=gps_sec=0;

gps.f_get_position(&gps_lat, &gps_long, &fix_age);

if (fix_age != TinyGPS::GPS_INVALID_AGE && fix_age<5000){

gps_fixed=true;

gps.crack_datetime(&gps_year, &gps_month, &gps_day,&gps_hour, &gps_min, &gps_sec, &gps_hund, &fix_age);

gps_altitude=gps.f_altitude();

gps_course=gps.f_course();

gps_speed_kmph=gps.f_speed_kmph();

gps_speed_mph=gps.f_speed_mph();

}

}

}

}



void setup()

{

  gps_serial.begin(9600);// asigna velocidad al serial

gps_serial.println("$PMTK220,1000*1F");

Serial.begin(9600);



pinMode(11, OUTPUT);  // declara el pin 11 como salida

}





void loop()

{

fnc_gps_update();

  

 velocidad = (unsigned long)(gps_speed_kmph); // convierte velocidad en numero entero y asigna a variable  velocidad



   Serial.println(gps_altitude);// envia a puerto serie la altitud

   if (gps_fixed) {

     Serial.println(velocidad); // envia a puerto serie variable velocidad

       if ((velocidad == 1)) {

         TimerFreeTone(11,650,3500);// si la velocidad es 1 envia al pin 11 la frecuencia determinada



       }

       if ((velocidad == 2)) {

         TimerFreeTone(11,350,3500); // si la velocidad es 2  envia  al pin 11 la frecuencia determinada



       }



   }


}
Citar
#2
Buenas, ¿a que te refieres con que se queda pillado con la última lectura? A que le llamas lectura. ¿que se supone que debería hacer?
Lo primero, corrige la linea en la que tienes esto:
Código:
velocidad = (unsigned long)(gps_speed_kmph); // convierte velocidad en numero entero y asigna a variable  velocidad
has puesto paréntesis de más, no se si afecta, pero la sintaxis correcta es: [
Código:
velocidad = (unsigned long)gps_speed_kmph; // convierte velocidad en numero entero y asigna a variable  velocidad

Tal y como lo tienes hasta que no tenga un "fix" no va a emitir ningún tono,

¿Cómo sabes que se queda pillado y no que lo que suceda es que no hay fix?

A demás sólo envias tono si la velocidad es ==1 o ==2, Y el resto de velocidades??? Piensa, que estas "casteando" es decir convirtiendo un float a un entero. Si gps.f_speed_kmph() es 0.9 al convertiro al long int, se convierte en 0. Es decir cualquier valor entre 0 y 0.999... va a ser 0. Y cualquier número que sea 3 o superior, ya no va a hacer sonar un tono.

Lo ideal es que hagas debug a través del puerto serie de tu PC, utilizando serial.print en las diferentes partes del código para saber donde falla exactamente. (se puede hacer conectandote en paralelo al tx-rx del gps, sin necesidad de usar pines a mayores)
Citar


[-]
Respuesta rápida
Mensaje
Escribe tu respuesta a este mensaje aquí.

Verificación de la imagen
Escribe el texto que aparece en la imagen, en el campo que está abajo. Este proceso se usa para evitar mensajes automáticos.
Verificación de la imagen
(no distingue MAYÚSC/minúsc)