mercredi 25 novembre 2015

Mise en oeuvre du module NavSpark GL

Mise en oeuvre du module Navspark GL


NavSpark-GL est une minuscule platine de développement puissante et facile à mettre en oeuvre.
Le circuit principal, nommé "SKYTRAQ Venus 822A" spécialisé dans le système de positionnement par satellite contient, en outre, un processeur LEON3.
La platine possède 17 Pins d'Entrées/Sorties numérique programmables.
Elle est 'compatible' Arduino, se programme comme un Arduino avec l'API Arduino!

Pour environ 30 Euros,(platine = 22 Euros + antenne active = 9 Euros) vous disposez donc d'un module 'compatible' Arduino équipée de:

Un processeur LEON3, 100MHz, 32 bits avec jeu d'instructions aux normes SPARC V8 
- 1 FPU (unité de calcul en virgule flottante) au normes IEEE-754
- 1024 Ko de mémoire Flash + 212 KB de RAM
- 1 UART duplex asynchrone
- 1 UART transmission asynchrone
- 1 Bus SPI pouvant contrôler 3 appareils esclaves
- 1 interface 2 fils
- 1 PWM
- 1 Horloge synchronisée sur Horloge atomique P1PPS (référence de temps avec une précision de +/- 10nsec)

Un système de positionnement par satellite de classe mondiale, recevant les signaux GPS (américains), GLONASS (russes), mais aussi, quand ils seront actifs, les signaux Beidou (chinois) et Galileo (européens):
- 167 canaux
- 2 entrées RF pour antenne passive et active
- Taux d’échantillonnage 1/2/4/5/8/10/20/40 Hz (default: 1Hz) 
- Précision de position à 2,5 m
- Précision de vitesse de 0,1 m/s
- Fréquence d’échantillonnage interne 12ns
- TTFF (Temps de démarrage à chaud) à ciel ouvert moyenne 1sec
- TTFF (Temps de démarrage à froid) à ciel ouvert moyenne 30sec
- Sensibilité de démarrage à froid:  -148dBm
- Sensibilité de fonctionnement normal: -165dBm 
- Plage de fonctionnement maximal: ( altitude < 18km) ou (vitesse < 515m/s )
- Consommation en mode de fonctionnement de 70mW

Grand merci à spyou de m'avoir offert un de ces petits modules ! 

Mise en oeuvre:

Afin de dialoguer avec la carte, il est primordial d'informer l'API ARDUINO de l'arrivée de la nouvelle recrue et d'y installer toute les librairies nécessaires, afin de pouvoir téléverser dans la mémoire du circuit toute sortes de programmes...
(Procédure sous Windows:)

-Télécharger et installer le dernier API ARDUINO:
https://www.arduino.cc/en/Main/Software
-Télécharger et installer le pilote USB serial:
http://navspark.mybigcommerce.com/content/PL2303_Prolific_DriverInstaller_v1_9_0.zip
-Télécharger et décompresser dans “c:\opt” les librairies du processeur:
http://navspark.mybigcommerce.com/content/sparc-elf-3.4.4-mingw.zip
-Connecter la carte NavSpark à votre ordinateur via un câble micro USB .
Les LEDs rouge(power) et verte doivent s'allumer.
-Lancer l'API ARDUINO.
-Afin de faire reconnaître votre carte par l'API, dans (File > Préférences > Additional Board Manager URLs), ajouter l'URL suivante:
http://navspark.mybigcommerce.com/content/package_navspark_index.json
- Sélectionner ensuite, dans le menu (Tools>Board) la carte qui correspond à votre module NavSpark(GPS).

La dernière étape est de choisir la page "sketch" et sélectionner "Vérifier/Compiler" ou appuyer simplement sur "Ctrl + R" pour commencer le processus de téléversement.
Si aucune erreur de codage survient, le binaire compilé sera placé dans le répertoire
"Users \ UTILISATEUR \ AppData \ Local \ Temp" .
(Par défaut, la connexion utilise une vitesse de transmission de 115200 baud .)

Dans l'article suivant, nous allons étudier en détail comment utiliser les fonctions intéressantes de ce fabuleux circuit et entre autre, comment récupérer les données et commander certains pins du GPIO...

En Avant!

Dans cet article, on suppose que:
- Vous maîtrisez 'a peu prés' L'API Arduino.
- Vous avez déjà écrit un petit skelch, même simple.
- Vous avez déjà téléversé un programme dans une carte.
- Vous connaissez 'a peu prés'ce qu'est une 'library' et a quoi elle sert...
Bon ben moi aussi, alors on y va!
(On considère, par la suite que GNSS = GPS, puisque c'est la partie du circuit qui gére le GPS)

Construire l'image binaire par défaut pour le NavSpark:

Tout d'abord , démarrer l' IDE Arduino et ouvrir un sketch par défaut.
Dans le type de carte, sélectionner votre "NavSpark Boards".
sélectionner ensuite "Processeur", et sélectionnez la bibliothèque qui vous préférez:
La bibliothèque "NavSpark -xxx avec bibliothèque GNSS" est utilisé pour construire le binaire avec GNSS ( donc, avec GPS actif ) et la bibliothèque "NavSpark -xxx sans bibliothèque GNSS" est utilisé pour construire le binaire sans le GNSS, permettant à l'utilisateur plus de ressources processeur.
Ajouter donc "GnssConf.init () ;" dans void setup(), car nous, nous allons évidement utiliser le GPS!
Donc, vous devriez voir apparaître, dans votre skelch, la ligne      #include "sti_gnss_lib.h"

Pourquoi avoir le choix dans l'initialisation?
Par ce que vous pouvez utiliser le processeur Leon3 dans une montage qui demande énormément de rapidité ou de puissance de calcul, sans avoir besoin de la fonction GPS!
(Un microcontrôleur qui tourne a 100 Mhz, ça doit vous donner des idées...)

Lorsque NavSpark démarre, il exécute d'abord toutes les initialisations nécessaires pour le processeur LEON3 puis passe à l'entrée "main()"
Le code complet pour "main()" peut être trouvé dans le "main.cpp" avec d'autres fichiers sources dans le répertoire  "Hardware/Arduino/Leon/cores/Arduino".

Comme indiqué ci-dessus , plusieurs initialisations pour GNSS se fait dans"init()" qui est défini dans "wiring.c".
(Nous verrons plus loin que nous pouvons modifier certains paramètres dans le fichier "wiring.c".)

 Vient ensuite le traditionnel "setup ()", dans lequel vous devez avoir déjà ajouté "GnssConf.init () ;" et ou vous pouvez aussi ajouter vos propres paramètres application dans le sketch.

Les Fonctions de base très utiles:

La fonction "gnss_process ()" est, en général, mise dans une boucle 'for'ou 'if'.
Quand elle est exécutée, elle retourne la valeur 'True' une fois par intervalle de fréquence de mise à jour du GPS.
Par exemple, si NavSpark est configuré pour mettre à jour le GNSS à 5 Hz, la fonction "gnss_process()" peut être appelée plusieurs fois par seconde, mais elle renvérra 'true' toutes les 0,2 secondes.
C'est dans cette boucle 'for'ou 'if'que vous pouvez mettre votre code, afin de récupérer les données du GPS.
La fonction "gnss_process()" fonctionne en mode 'appel', car vous l'utiliserez dans votre programme, qu'a certains moments, quand vous en avez besoin...

Exemple rapide:

if (gnss_process())
{
// oui, le GPS vient de passer a 1!
//Mettre du code içi...
}
else
{
// rien à déclarer.
}

NavSpark propose aussi la fonction très intéressante et sûrement même, la plus importante:

"Task_called_after_GNSS_update(void)",
qui est une fonction 'automatique'du genre 'interruption':
Dès qu'une intervalle de fréquence GNSS est mise à jour, cette fonction interrompt le programme principal en cours.
C'est dans cette fonction que vous pouvez mettre votre code, afin de récupérer les données du GPS.
Note: task called after GNSS update = tâche appelée après la mise à jour GNSS
Vous pouvez mettre cette fonction en fin de votre programme...

Exemple rapide:

void task_called_after_GNSS_update(void)
{
// Excuse-moi, programme principal, mais je t’interromps pour signaler que 
//des données sont prêtes a être lues!
//Mettre du code ici...
}

Taux de mise à jour NavSparksupports GNSS de 1/2/4/5/8/10 Hz, 1 Hz par défaut.
Pour modifier ce paramètre, vous devez modifier le code dans le fichier "Wiring.c".
Les valeurs possibles sont définies dans "sti_sdk_lib.h".
init_mode_p->position_update_rate=STGNSS_POSITION_UPDATE_RATE_1HZ;
----------------------------------------------------------------------------------------
Exemple simple utilisant la fonction "Task_called_after_GNSS_update(void)" pour allumer
une Led toute les secondes sur le pin13 et paramétrage de la transmission:

uint8_t led = 13;

void setup() {
GnssConf.init();
// Mettre votre code du setup ici. Il sera exécuté 1 fois.
pinMode(led, OUTPUT);
Serial.config(STGNSS_UART_8BITS_WORD_LENGTH, STGNSS_UART_1STOP_BITS, STGNSS_UART_NOPARITY);
Serial.begin(9600);
}
void loop()
{
// Mettre votre code programme principal ici. Il sera exécuté indéfiniment.
}
void task_called_after_GNSS_update(void)
{
static uint8_t val = HIGH;
char buf[32];
if (val == HIGH) {
digitalWrite(led, HIGH);
sprintf(buf, "Hello world (GPIO%02d high)\r\n", led);
Serial.print(buf);
val = LOW;
}
else if (val == LOW) {
digitalWrite(led, LOW);
sprintf(buf, "Hello world (GPIO%02d low)\r\n", led);
//Serial.print(buf);
val = HIGH;
}
}
Exemple de trame GPS:
Dans la ligne suivante:
$GPRMC,194509.000,A,4042.6142,N,07400.4168,W,2.03,221.11,160412,,,A*77

Cette ligne est appelée la phrase RMC ( minimum recommandé ) et contient à peu près toutes les données les plus utiles . Chaque bloc de données est séparé par une virgule .
La première partie est 194509.000. C'est l'heure actuelle GMT ( Greenwich Mean Time) .
Les deux premiers chiffres indiquent l'heure 19 ( 1900h , autrement connu comme 19 heures ) les deux suivantes sont les minutes , les deux suivants sont les secondes et enfin les millisecondes. Ainsi, le moment où a été prise cette capture d'écran est 19:45 et 9 secondes.
Le GPS ne sait pas dans quel fuseau horaire vous êtes, et ne sais pas non plus si vous êtes en "heure d'été ", de sorte que ce sera a vous de faire le calcul pour vous trouver dans votre fuseau horaire GMT.

La deuxième partie est le « code de statut »:
Si un 'V' s'affiche, cela signifie que les données sont invalide (Void ).
Si un 'As'affiche, cela signifie que ses données sont actives ( les GPS pourraient obtenir un verrou / fix )

Les 4 morceaux de données suivantes sont les données de géolocalisation:
Selon le GPS , la position indique:
4042.6142 , N ( Latitude 40 degrés , 42.6142 minutes décimales nord ) 
et 07400,4168 , W . ( Longitude 74 degrés , 0.4168 décimales minutes ouest).
En regardant cet emplacement dans Google Maps , tapez + 40 ° 42,6142 ' , -74 ° 00.4168dans la boîte de recherche Google Maps .
Malheureusement gmaps vous oblige à utiliser à la place de la notation +/- NSWE .
N et E sont positifs , S et W sont négatifs .