picaxe et GPS

polor

New Member
Bonjour,
j'essaie de lire les données émises par un module GPS par liaison série sur un picaxe et de les visualiser sur un afficheur AXE033.
Le problème que je rencontre est que je peux lire sans soucis l'heure mais impossible de lire les coordonnées latitude et longitude, je me retrouve toujours avec 00000.0000000000. par contre je peux lire N (nord)
J'ai essayé différents protocoles GPGGA, RMC... toujours le même constat !!!
Parmis vous quelqu'un aurait-il été confronté à ce problème et surout comment y pallier?
merci par avance
cordialement
 

PieM

Senior Member
Bonjour,


Il faut déjà savoir quel type de trame fournit votre GPS ...
quel code utilisez vous ?
 

polor

New Member
il s'agit bien du protocole NMEA 2.0
J'ai fait des essais aussi bien dans un batiment qu'à l'extérieur et le résultat est toujours le même: j'ai l'heure et pas de localisation, uniquement N (pour nord).
voici le programme:
Data_in:
serin c.0,T4800,("$GPGGA,"),b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21
b1=b1+1
serout 0,N2400,(254,128,"H:",b0,b1,"h",b2,b3,"min",b4,b5,"s") 'affichage 1ere ligne de l'heure
serout 0,N2400,(254,192,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21) 'affichage 2e ligne de la position
goto Data_in

ma première grande question est de savoir comment est-il possible que je puisse lire uniquement l'heure? je présume que la réception est correcte...
merci par avance de toute aide
 

PieM

Senior Member
Bonjour,

le Protocole NMEA est une chose. Ce qu'il faut savoir c'est la trame utilisée par le récepteur. Il y en a plus d'une vingtaine!
dans la trame RMC, après l'heure, ce n'est pas la latitude, mais un code de statut du récepteur (A/V).
En outre, dans les trames, les champs sont séparés par des virgules. Vous n'en tenez absolument pas compte dans votre code.
La première trame qui est l'heure, est effectivement bien reçue parce que c'est la première.
ensuite, b6 dans votre cas doit être le code ascii de la virgule !
 

BESQUEUT

Senior Member
Je ne sais pas si ça a été retapé, mais si c'est du copier/coller, il y a un blème sur b9 dans le serin et idem sur b15 dans le serout.
D'autre part, il faut lire au moins 30 caractères pour avoir la latitude et la longitude.
Celà dit, ça n'explique pas tout ces zéros et le "N". Ce serait bien d'avoir la trace des caractères reçus.
==> Merci de confirmer que le GPS a une bonne réception (il affiche bien des coordonnées) et pas seulement une présomption... ?
==> si oui, se connecter directement au GPS avec Hyperterminal et enregistrer les trames reçues.
 

PieM

Senior Member
dans une trame comme celle-ci :

$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E

il faut 35 caractères, car l'heure est donnée avec des ms.

Selon le constructeur les champs ne sont souvent pas de longueur fixe . Donc il est préférable de décoder systématiquement les séparateurs de champ.

Si la trame RMC existe aussi dans ce GPS, on peut voir aussi, si la donnée après l'heure est A ou V .
 

polor

New Member
bonjour,
merci à vous tous qui avez répondu.
@ Piem
comme annoncé, je peux aisément lire l'heure, par contre, sur la trame RMC, je lit V, pour réception invalide
d'où ma question, comment la réception peut-elle être incorrecte si je peux lire "l'heure"?
concernant b6, j'ai essayé également #b6, le résultat est le même, je lis toujours sur l'afficheur une ","
@besqueut
pour b9, il s'agit bien d'un défaut lors du copier/coller
comment fonctionne hyperterminal?
@anubis
il s'agit du récepteur GPS 41 MLR

Existerait-il des références de GPS mieux appropriées?

merci par avance pour votre aide
 

PieM

Senior Member
Bonjour,

D'après la doc du GPS 41 MLR: http://http://elecprojects.com/GPS_40-MLR.pdf

l'heure est donnée avec les centièmes de seconde. Donc en b6 vous avez un point et non un séparateur de champ. (virgule)

$GPGGA,104549.04,2447.2038,N,12100.4990,E,1,06,01.7,00078.8,M,,*5C<CR<<LF>

A priori, un seul satellite est suffisant pour avoir l'heure, ce qui n'est pas le cas de la position. Vous avez un problème de réception.
Vous restez suffisamment longtemps pour le demarrage à froid (~50 s) ?

La trame $GPGSA vous donne le nombre de satellites reçus.

Et décodez les trames en vous servant des séparateurs de champ ( , ) !!
 

polor

New Member
Bonjour,
concernant b6, il s'agit bien d'un point et non d'une virgule
effectivement j'attends bien les 50s
j'ai refait des tests, voici un résumé:
GPGGA: comme indiqué dans les mails précédents et je peux lire "N"
GPGSA: A,1
GPGLL: rien
GPGSV: 3,1,12,62,090,05,60,0 (voit 12 satellites)
GPRMC: heure, V (pour data not valid), pas de localisation

des idées?
merci par avance
polor
 

polor

New Member
pour information, cela fonctionne maintenant, mais avec le programme suivant qui est très proche de mon 1er prog

Data_in:
serout 0,N2400,(254,128,"H:",b0,b1,"h",b2,b3,"min",b4,b5, "s") 'affichage 1ere ligne de l'heure
serout 0,N2400,(254,192,b6,b7,b8,b9,b10,b11,b12,b13,b14,b 15,b16,b17,b18,b19,b20,b21) 'affichage 2e ligne de la position
serin c.0,T4800,("$GPGGA,"),b0,b1,b2,b3,b4,b5,b6,b7,b8,b 9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21
b1=b1+1
goto Data_in

à titre personnel, j'avoue être surpris car c'est uniquement en déplaçant les lignes de programmation relatives à l'affichage qui m'a permis de faire fonctionner le programme. Si vous avez des explications, je suis preneur
 

PieM

Senior Member
Bonjour,

:confused:
En fait ce qui est inquiétant c'est que "cela fonctionne" (?) ... alors que la trame décrite ne correspond pas au module 41MLR, et avec un b6 qui est un point ?
La trame indiquée avec ses 22 bytes devrait donner au plus, la virgule après le N de la latitude.

Sinon, il est possible que selon le Picaxe utilisé et sa fréquence, le serin de 22 bytes ait un problème de timing .
C'est pour cela qu'il est préférable de stocker les données dans un scratchpad avec une commande du type serin C.0,T4800,("$GPGGA,"),@bptrinc, .....
voir un excellent exemple: ICI

Encore une fois, (mais je n'insiste plus) les programmes de liaison avec GPS adoptent une structure de lecture de champs, les uns après les autres.

Que recevez vous pour chaque valeur de b0 à b21 ?

2011-12-28 000.jpg
 

polor

New Member
Bonjour Piem,
voici le programme que j'utilise et qui pour le moment me donne satisfaction:
Data_in:
serout 0,N2400,(254,128,b0,b1,"h",b2,b3,"m",b4,b5,"s ",b19,b20,b21,b22,b23,b24) 'affichage heur et date
serout 0,N2400,(254,192,b7,b8,"'",b9,b10,b11,b12,b13,b14,b15,"'",b16,b17,b18,b25,b26) ' affichage latitude longitude et satellites dispo
' H H M M S S L L L L N/S , l l l l l E/W J J M M A A
serin c.0,T4800,("$GPRMC,"),b0,b1,b2,b3,b4,b5,b6,b6,b6,b6,b6,b6,b7,b8,b9,b10,b6,b6,b6,b6,b6,b6,b11,b12,b13,b14,b15,b16,b17,b6,b6,b6,b6,b6,b6,b18,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b19,b20,b21,b22,b23,b24
'lecture nbre satellites dispo:
serin c.0,T4800,("$GPGGA,"),b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b6,b25,b26
b1=b1+1
goto Data_in

Pour que cela fonctionne, la partie serout et gestion de l'affichage doit impérativement se trouver avant la réception des signaux GPS
b6 ne pose pas de souci, aussi bien sur l'afficheur (lorsque je visualise) ou sur l'écran PC avec debug, b6 est aussi bien capable d'afficher "." ou ","
dans le cas ci-dessus b6 est utilisé comme valeur refuge pour masquer tout ce qui ne m'intéresse pas
Je suis conscient que ce n'est pas la meilleure façon de faire et que cela reste de la "bidouille", mais, je me débrouille comme je peux
à noter que j'utilise un 14M2
J'ai pris bonne note de vos recommandations, mais j'avoue que je ne maîtrise pas tout sur les pointeurs, d'ou le résultat ci-dessus. Ceci étant, avec l'exemple ci-dessus je vais pouvoir m'y atteler!!! car c'est la première fois que je rencontre une telle application. Merci pour les exemples communiqués qui me serviront à refaire un nouveau programme, c'est ma prochaine étape.
 

PieM

Senior Member
Bonjour,

Ce que je veux dire avec la valeur b6 qui est un point et non une virgule, c'est que les valeurs qui viennent après appartiennent encore aux heures, et non à un champ suivant.
d'ailleurs votre nouveau code avec la trame GPRMC en tient compte ...
serin c.0,T4800,("$GPRMC,"),b0,b1,b2,b3,b4,b5,b6,b6,b6,b 6,b6,b6,b7,b8,b9,b10,b6,b6,b6,b6,b6,b6,b11,b12,b13 ,b14,b15,b16,b17,b6,b6,b6,b6,b6,b6,b18,b6,b6,b6,b6 ,b6,b6,b6,b6,b6,b6,b6,b6,b6,b19,b20,b21,b22,b23,b2 4

le premier b6 est un point, donc les b6 suivants sont 1/10 et 1/100 de secondes. le b6 d'après est une virgule, donc le champ d'après est un A si la position est valide. on retrouve ensuite une virgule, puis la latitude avec 4chiffres. (pas précise car vous ignorez les décimales !! donc c'est à ~2km près ...))

Ce qu'il faut comprendre également, c'est que si la latitude, par exemple,change en nombre de chiffres significatifs, tout votre décodage qui suit est faux !

Evitez de traverser l'atlantique avec votre GPS ! :rolleyes:
 
Top