Je débute dans la programmation et j'essais de faire une acquisition de donnée avec enregistrement sur carte SD.
Actuellement j'enregistre les 5 entrées analogiques et un capteur de température infrarouge avec une fréquence de 10 hertz.
Je viens d'investir dans un capteur GPS GPS6MV2.
Il fonctionne parfaitement avec la librairie :TinyGPS++.
En revanche, je ne sais pas comment faire pour que je puisse acquérir sur ma carte SD la position GPS à cette fréquence. le GPS ne doit pas avoir une fréquence suffisante. à ce jour c'est lui qui dicte ma fréquence d'acquis ...
Quelqu'un aurait une idée pour afficher la valeur de la position gps avec une fréquence aussi rapide ? Dans le cas contraire, est il possible d'acquérir une position gps enregistrée ( par exemple la dernière connu) et faire en sorte qu'elle se mette à jour dès que possible ?
J'espère avoir été claire
Dans l'attente de vous lire
Bonsoir,
D'après la doc de cette carte, la fréquence max d'acquisition est de 5Hz.
Il faut faire tourner dans loop() une tâche de manière asynchrone qui va mettre à jour la position GPS dès qu'elle sera disponible (en testant la méthode isUpdated()).
La partie enregistrement lira la dernière position connue.
Il y a un petit mécanisme de sécurité (à base de sémaphores ou d'un système de double buffer) à mettre en place pour garantir qu'enregistrement ne lit pas une position en cours de mise à jour.
Pour ce qui est du isUpdated() : je pense que je devrais y arriver ( j'ai bien dit je pense ...)
En revanche la tu m'a perdu sur la fin
Les systèmes de buffer je comprend le fonctionnement mais je ne sais pas du tout programmer cela ...
Actuellement voici mon programme " gps " que j'appel toute les 100 ms avec par la suite l'écriture de la valeur latitude et longitude sur mon fichier texte dans la carte SD.
J'ai récupérer ce code dans les exemple mais il ne fonctionne pas.
j'ai l'impression qu'il envoie la demande de lecture que dans cette partie de code ce qui expliquerai pourquoi il ne se met jamais à jour ?
Votre problème étant relatif au GPS, voici le code, expurgé, que vous auriez dû présenter :
void GPS() {
unsigned long t0 = millis(); //
if (millis() - t0 > 200) { // toutes les 200 mS
while (ss.available() > 0) //
gps.encode(ss.read()); //
latitude = gps.location.lat(); // programme lecture gps
longitude = gps.location.lng(); //
} //
}
void setup() {
// ...........................................................
}
void loop() {
boolean demandeAcqui = digitalRead(2); //
if (demandeAcqui == LOW) { // test si bouton appuyé
monFichier = SD.open(nomfichier, FILE_WRITE); // ouverture du fichier
while (demandeAcqui == LOW ) { //
demandeAcqui = digitalRead(2); //
GPS(); //
monFichier.print(latitude, 6); //
monFichier.print(';'); //
monFichier.print(longitude, 6); //
monFichier.println(';'); //
delay(100); // fréquence d'acqui
}
monFichier.close(); // ferme le fichier
}
}
Mais pour autant, cela ne suffit pas. Il manque toute la partie (relative au GPS et à la carte SD) avant le setup et celle comprise dans le setup.
Maintenant, oubliez tout cela et faites un tout petit programme qui ne fait qu'interroger le GPS et reporter les valeurs de position à l'aide du moniteur série.
// les #include et les déclarations des variables et des objets (GPS) qui vont bien.
void setup() {
// les initialisations qui vont bien (le port série de communication avec la GPS, ...)
Serial.begin(9600);
}
void loop() {
GPS();
}
void GPS() {
while (ss.available() > 0)
gps.encode(ss.read());
latitude = gps.location.lat();
longitude = gps.location.lng();
Serial.println("latitude : "+String(latitude));
Serial.println("longitude : "+String(longitude));
}
}
Merci pour tes conseils, en effet j'ai mal présenté la chose ... je suis encore novice en programmation et sur ce forum.
J'ai effectué ton code, il fonctionne bien ( j'avais deja fait une chose équivalente auparavent).
Mon soucis est la fréquence d'acquisition, en effet pour une mesure de 51 secondes à 20 hz j'ai obtenue un fichier texte avec 273 lignes de mesures.
Je pense que le choix du délays de 50 ms n'est pas judicieux car je ne prend pas en compte le temps d'éxécution du programme.
je m'exprime peut etre mal, mais si c'est suffisament explicite peut tu me dire ce que tu en pense stp ?
je te joints ma boucle while qui en théorie devrait être effectué toutes les 50 ms.
et lancez le moniteur série. Vous verrez à chaque fois que la boucle s'exécute, le temps qu'il lui faut.
Par ailleurs, la fonction GPS(), telle que je l'ai ré-écrite ne se rafraichit que toutes les 200 ms au mieux ; ce peut même être plus long si la fréquence max de rafraichissement du GPS est plus petite.
Maintenant, pour cerner au plus près ce qui est gourmand en temps, il suffit de déplacer l'instruction "unsigned long td = millis();"en amont de ce que vous voulez tester et l'instruction "Serial.println(millis()-tm);" en aval.
je m'excuse pour ce moment de blanc, mais je suis étudiant et partie au canada pour un semestre, l'arduino est resté dans la valise un moment
j'ai pu tester ton système de mesure du temps PIERRE,
Je ne comprend pas tout, j'ai placé les deux instruction aux bord des instructions de la partie GPS.
void GPS() {
unsigned long td = millis();
while (ss.available() > 0)
gps.encode(ss.read());
latitude = gps.location.lat();
longitude = gps.location.lng();
Serial.println(millis()-td);//
}
et le résultat me surprend, j'aurais une partie de code qui parfois ne s'effectuerai pas ? ou le temps est lié à la fréquence de rafraichissement du module GPS ?
le soucis vient bien du GPS qui necessite plus de 120 ms à chaque mise à jour .... s'il n'existe pas de technique pour gagner du temps sur cette mise à jour je vais devoir revoir mes ambitions et réhaussé la fréquence d'acquisition ...
Peut être voir si un autre capteur avec une fréquence plus élevée éxiste ?
Simple question : un arduino UNO suffit il pour réaliser une fréquence d'acquis de l'ordre de 100 Hz avec un GPS ?
Maintenant que je commence à bidouiller le code, pourquoi pas passer sur un arduino DUE ? cela resolurait il mon problème ?
schumi22:
... le soucis vient bien du GPS qui necessite plus de 120 ms à chaque mise à jour ....
Je ne comprends pas, le relevé que vous avez donné indique qu'il faut environ 48 mS pour acquérir les données et vous dites maintenant qu'il en faut 120 ?
schumi22:
.. Peut être voir si un autre capteur avec une fréquence plus élevée éxiste ? ...
Simple curiosité quel est votre besoin impérieux de renouveler les infos GPS si rapidement ?
schumi22:
...Simple question : un arduino UNO suffit il pour réaliser une fréquence d'acquis de l'ordre de 100 Hz avec un GPS ? ...
Ce qui limite la fréquence de rafraîchissement, c'est :
la fréquence max de renouvellement des données par le GPS,
la vitesse de transmission de ces données vers l'Arduino.
Est-il possible de paramétré la vitesse à une valeur supérieure qui, je suppose, doit être 9600 bauds en standard.