This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 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



       }



   }


}
  Responder
#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)
  Responder