Le projet de pilote automatique

De minos2
Révision datée du 30 août 2019 à 15:58 par Phil (discussion | contributions) (L'anemometre)
Aller à : navigation, rechercher

Navigation: Accueil -> Le projet de pilote automatique

L'objectif du projet

J'ai eu l'idée et l'envie de concevoir un pilote automatique pour mon bateau basé sur un Raspberry PI et un arduino.

A cette étape j'imagine que le Raspberry sera trop lent pour réagir suffisament vite sur la barre.

J'ai lu quelques articles dans lesquels les formules mathématiques m'ont un peu effrayé.

J'ai donc décidé une approche plus empirique;

Voici le principe général de réalisation du pilote :

L'arduino

Commande du cap

L'arduino aura la tâche d'assurer le cap demandé.

Le cap sera programmé par un clavier équipé de boutons poussoir.

+ 1° - 1° + 10° - 10° auto -> passage en mode pilote automatique standby -> passage en pilotage manuel

Gyroscope, accéléromètre et magnétomètre

L'arduino sera relié à une carte comportant les fonctionnalité suivantes

  • gyroscope
  • accéléromètre
  • magnétomètre

MPU-9250.png

Le lien vers le site aliexpress : https://www.aliexpress.com/item/SPI-IIC-MPU9250-MPU-9250-MPU-9250-9-Axis-Attitude-Gyro-Accelerator-Magnetometer-Sensor-Module-MPU9250/32216818498.html?spm=a2g0s.9042311.0.0.27424c4dz3S4pD

La station météo basée sur un BME280

Le BME280 est un composant qui fournit la température, la pression et l'hygrométrie.

Bme280.jpeg

Pour la programmation je me suis inspiré du site de Gilles Thebault : http://gilles.thebault.free.fr/spip.php?article47 ...merci à lui...!

Le code du programme arduino

Le code ci-dessous effectue les mesures de température, pression et humidité et aussi la lecture des trames du GPS.

#include <SoftwareSerial.h>
#include <Wire.h>
#include "SparkFunBME280.h"

BME280 bme280;
 
//Création de la variable SoftSerial (connexion software au port serie) RX sur le pin D2 et TX sur le pin D3
#define rxPin 10
#define txPin 11

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

//On crée un tableau de caractères qui contiendra notre trame GPS
unsigned char buffer[256];
// On conserve l'heure courante
char heureCourante[10];
//la variable count nous servira à ne pas dépasser les 256 caractères du tableau.
int count=0;   
// On déclenche une mesure de température, pression et humidité toutes les ...
long compteur = 0;
 
void setup() {
  // Initialisation du GPS
  // -----------------------
  //On initialise le port série software 
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(9600);

  // Initialisation du BME280
  // ------------------------
  //configuration du capteur
  bme280.settings.commInterface = I2C_MODE; 
  bme280.settings.I2CAddress = 0x76;
  bme280.settings.runMode = 3; 
  /*
      bme280.settings.tStandby = ...

      bme280.settings.tStandby = 0  durée du standby entre 2 mesures 0.5ms
      bme280.settings.tStandby = 1   durée du standby entre 2 mesures 62.5ms
      bme280.settings.tStandby = 2   durée du standby entre 2 mesures 125ms
      bme280.settings.tStandby = 3   durée du standby entre 2 mesures 250ms
      bme280.settings.tStandby = 4   durée du standby entre 2 mesures 500ms
      bme280.settings.tStandby = 5   durée du standby entre 2 mesures 1000ms
      bme280.settings.tStandby = 6   durée du standby entre 2 mesures 10ms
      bme280.settings.tStandby = 7   durée du standby entre 2 mesures 20ms
  */
  bme280.settings.tStandby = 0;
  /*
    bme280.settings.filter = ... (permet de filtrer et supprimer les variations brusques (courant d’air ...))

    bme280.settings.filter = 0  pas de filtrage
    bme280.settings.filter = 1   coefficient de filtrage 2
    bme280.settings.filter = 2   coefficient de filtrage 4
    bme280.settings.filter = 3   coefficient de filtrage 8
    bme280.settings.filter = 4   coefficient de filtrage 16
  
   */
  bme280.settings.filter = 0;
  /*
   *  bme280.settings.tempOverSample = ...

      bme280.settings.tempOverSample=0  pas de mesure de la température.
      bme280.settings.tempOverSample=1   sur-échantillonnage x1. Résolution : 16 bit / 0.0050°C
      bme280.settings.tempOverSample=2   sur-échantillonnage x2. Résolution : 17 bit / 0.0025°C
      bme280.settings.tempOverSample=3   sur-échantillonnage x4. Résolution : 18 bit / 0.0012°C
      bme280.settings.tempOverSample=4   sur-échantillonnage x8. Résolution : 19 bit / 0.0006°C
      bme280.settings.tempOverSample=5   sur-échantillonnage x16. Résolution : 17 bit / 0.0003°C
   */
  bme280.settings.tempOverSample = 1 ;
  /*
   *  bme280.settings.pressOverSample =...

      bme280.settings.pressOverSample =0  pas de mesure de pression
      bme280.settings.pressOverSample =1   sur-échantillonnage x 1. Résolution 16 bit / 2.62 Pa
      bme280.settings.pressOverSample =2   sur-échantillonnage x 2. Résolution 17 bit / 1.31 Pa
      bme280.settings.pressOverSample =3   sur-échantillonnage x 4. Résolution 18 bit / 0.66 Pa
      bme280.settings.pressOverSample =4   sur-échantillonnage x 8. Résolution 19 bit / 0.33 Pa
      bme280.settings.pressOverSample =5   sur-échantillonnage x 16. Résolution 20 bit / 0.16 Pa
   */
  bme280.settings.pressOverSample = 1;
  /*
   *  bme280.settings.humidOverSample = ...

      bme280.settings.humidOverSample =0  pas de mesure d’humidité
      bme280.settings.humidOverSample =1   sur-échantillonnage x 1.
      bme280.settings.humidOverSample =2   sur-échantillonnage x 2.
      bme280.settings.humidOverSample =3   sur-échantillonnage x 4.
      bme280.settings.humidOverSample =4   sur-échantillonnage x 8.
      bme280.settings.humidOverSample =1   sur-échantillonnage x 16.
   */
  bme280.settings.humidOverSample = 1;
 
  Serial.println("Starting BME280... ");
  delay(10);  // attente de la mise en route du capteur. 2 ms minimum
  // chargement de la configuration du capteur
  bme280.begin();
  
  //On initialise le port série de l'arduino
  Serial.begin(9600); 
  Serial.println("Lancement...");
}
 
void loop() {
  // On récupère la trame GPS
  getGPS();

  // Le relevé des mesures température, pression et humidité est rapide
  // le compteur permet d'avoir un relevé toute les seconde environ
  compteur++;
  if (compteur>64000)
   {
    getBME280();
    compteur = 0;
   } 
}

void getBME280() {
  // Construit une trame au format similaire à NMEA
  //sprintf(trame,"$BME280,%f,%f,%f*FF",bme280.readTempC(),bme280.readFloatPressure()/100,bme280.readFloatHumidity());
  Serial.print("$BME280,");
  Serial.print(heureCourante);
  Serial.print(",");
  Serial.print(bme280.readTempC(), 2);
  Serial.print(",");
  Serial.print(bme280.readFloatPressure()/100, 2);
  Serial.print(",");
  Serial.print(bme280.readFloatHumidity(), 2);
  Serial.println("*FF"); // Checksum n'est pas calculé, il est là pour respecter la syntaxe.

}

void getGPS() {
   static int trameEnCours = 0;
   
   if (mySerial.available()>0)                    
    {
      char currentchar = mySerial.read();
      
      if (trameEnCours == 1)
      {
        if ((currentchar != 0x0A) && (currentchar != 0x0D))
        buffer[count++] = currentchar;
      }

      if (currentchar == '$')
      {
        trameEnCours = 1;
        count=0;
        buffer[count++] = '$';
      }
      
      if (currentchar == '*')
      {
        // Les caractères du checksum
        while (mySerial.available()==0) ; // wait for one char
        currentchar = mySerial.read();
        buffer[count++] = currentchar;
        while (mySerial.available()==0) ; // wait for one char
        currentchar = mySerial.read();
        buffer[count++] = currentchar;
        trameEnCours = 0;
        // conserver la date courante : $GPGGA,222625.00,4
        if((buffer[1]=='G') && (buffer[2]=='P') && (buffer[3]=='G') && (buffer[4]=='G') && (buffer[5]=='A')) {
          int i;
          for (i=0; i<9;i++) 
            heureCourante[i]=buffer[i+7];
          heureCourante[i]=0;
        }
        Serial.write(buffer,count);
        Serial.println("");
      }
    }
}

Un témoin d'angle de barre

Le GPS

Le GPS est connecté sur les pin 10 et 11 de l'arduino. (10 = TX du GPS , 11 = RX du GPS)

Le code du programme pour gérer les trames NMEA du GPS
#include <SoftwareSerial.h>
 
//Création de la variable SoftSerial (connexion software au port serie) RX sur le pin D2 et TX sur le pin D3
#define rxPin 10
#define txPin 11

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
//On crée un tableau de caractères qui contiendra notre trame GPS
unsigned char buffer[256];
//la variable count nous servira à ne pas dépasser les 200 caractères du tableau.
int count=0;   
 
void setup() {
  //On initialise le port série software 
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  mySerial.begin(9600);
  //On initialise le port série de l'arduino
  Serial.begin(9600); 
  Serial.println("Lancement...");
}
 
void loop() {
  //On récupère la trame GPS
  getGPS();
}

void getGPS() {
   static int trameEnCours = 0;
   
   if (mySerial.available()>0)                    
    {
      char currentchar = mySerial.read();
      
      if (trameEnCours == 1)
      {
        if ((currentchar != 0x0A) && (currentchar != 0x0D))
        buffer[count++] = currentchar;
      }

      if (currentchar == '$')
      {
        trameEnCours = 1;
        count=0;
        buffer[count++] = '$';
      }
      
      if (currentchar == '*')
      {
        trameEnCours = 0;
        // buffer[count++] = 0; // Fin de la chaine de caractères
        Serial.write(buffer,count);
        Serial.println("");
      }
    }
}
 
//Fonction permettant de vérifier si la trame commence par les caractères $GPGGA
int isGPSGPGGA(unsigned char* trameGPS) {
  if(trameGPS[0] == '$' && trameGPS[1] == 'G' && trameGPS[2] == 'P' && trameGPS[3] == 'G' && trameGPS[4] == 'G' && trameGPS[5] == 'A')
    return 1;
  else
    return 0;
  }
 
//Methode permettant de remettre à 0 le tableau de caractères
void clearBufferArray()                     
{
    for (int i=0; i<count;i++)
    { buffer[i]=NULL;}                      
}
Exemple de trames générées
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.49,3.30,4.38*0F
$GPGSV,3,1,12,02,40,300,18,03,12,107,21,05,11,292,,06,61,218,20*75
$GPGSV,3,2,12,07,42,155,21,09,71,055,18,16,06,057,,19,08,225,*78
$GPGSV,3,3,12,23,40,060,17,26,05,031,07,29,02,343,,30,18,179,23*72
$GPGLL,4709.75657,N,00123.61570,W,192009.00,A,A*71
$GPRMC,192010.00,A,4709.75675,N,00123.61542,W,0.871,,200818,,,A*6C
$GPVTG,,T,,M,0.871,N,1.612,K,A*29
$GPGGA,192010.00,4709.75675,N,00123.61542,W,1,05,3.30,4.9,M,47.9,M,,*4F
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.49,3.30,4.38*0F
$GPGSV,3,1,12,02,40,300,17,03,12,107,20,05,11,292,,06,61,218,19*71
$GPGSV,3,2,12,07,42,155,22,09,71,055,17,16,06,057,,19,08,225,*74
$GPGSV,3,3,12,23,40,060,17,26,05,031,07,29,02,343,,30,18,179,23*72
$GPGLL,4709.75675,N,00123.61542,W,192010.00,A,A*78
$GPRMC,192011.00,A,4709.75666,N,00123.61571,W,0.362,,200818,,,A*66
$GPVTG,,T,,M,0.362,N,0.670,K,A*25
$GPGGA,192011.00,4709.75666,N,00123.61571,W,1,05,3.30,5.2,M,47.9,M,,*46
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.49,3.30,4.38*0F
$GPGSV,3,1,12,02,40,300,17,03,12,107,20,05,11,292,,06,61,218,19*71
$GPGSV,3,2,12,07,42,155,22,09,71,055,16,16,06,057,,19,08,224,*74
$GPGSV,3,3,12,23,40,060,17,26,05,031,07,29,02,343,,30,18,179,23*72
$GPGLL,4709.75666,N,00123.61571,W,192011.00,A,A*7B
$GPRMC,192012.00,A,4709.75763,N,00123.61639,W,0.905,,200818,,,A*65
$GPVTG,,T,,M,0.905,N,1.676,K,A*29
$GPGGA,192012.00,4709.75763,N,00123.61639,W,1,05,3.30,5.4,M,47.9,M,,*48
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.48,3.30,4.38*0E
$GPGSV,3,1,12,02,40,300,17,03,12,107,20,05,11,292,,06,61,218,18*70
$GPGSV,3,2,12,07,42,155,22,09,71,055,17,16,06,057,,19,08,224,*75
$GPGSV,3,3,12,23,40,060,17,26,05,031,07,29,02,343,,30,18,179,22*73
$GPGLL,4709.75763,N,00123.61639,W,192012.00,A,A*73
$GPRMC,192013.00,A,4709.75708,N,00123.61644,W,0.344,,200818,,,A*6C
$GPVTG,,T,,M,0.344,N,0.636,K,A*23
$GPGGA,192013.00,4709.75708,N,00123.61644,W,1,05,3.30,5.5,M,47.9,M,,*4F
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.48,3.30,4.38*0E
$GPGSV,3,1,12,02,40,300,17,03,12,107,19,05,11,292,,06,61,218,18*7A
$GPGSV,3,2,12,07,42,155,22,09,71,055,18,16,06,057,,19,08,224,*7A
$GPGSV,3,3,12,23,40,060,16,26,05,031,07,29,02,343,,30,18,179,21*71
$GPGLL,4709.75708,N,00123.61644,W,192013.00,A,A*75
$GPRMC,192014.00,A,4709.75743,N,00123.61658,W,0.743,,200818,,,A*6A
$GPVTG,,T,,M,0.743,N,1.376,K,A*20
$GPGGA,192014.00,4709.75743,N,00123.61658,W,1,05,3.30,5.8,M,47.9,M,,*47
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.48,3.30,4.38*0E
$GPGSV,3,1,12,02,40,300,18,03,12,107,19,05,11,292,,06,61,218,19*74
$GPGSV,3,2,12,07,42,155,22,09,71,055,18,16,06,057,,19,08,224,*7A
$GPGSV,3,3,12,23,40,060,16,26,05,031,08,29,02,343,,30,18,179,22*7D
$GPGLL,4709.75743,N,00123.61658,W,192014.00,A,A*70
$GPRMC,192015.00,A,4709.75755,N,00123.61721,W,0.989,,200818,,,A*6B
$GPVTG,,T,,M,0.989,N,1.832,K,A*23
$GPGGA,192015.00,4709.75755,N,00123.61721,W,1,05,3.30,6.1,M,47.9,M,,*44
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.48,3.30,4.38*0E
$GPGSV,3,1,12,02,40,300,18,03,12,107,19,05,11,292,,06,61,218,18*75
$GPGSV,3,2,12,07,42,155,23,09,71,055,18,16,06,057,,19,08,224,*7B
$GPGSV,3,3,12,23,40,060,17,26,05,031,08,29,02,343,,30,18,179,22*7C
$GPGLL,4709.75755,N,00123.61721,W,192015.00,A,A*79
$GPRMC,192016.00,A,4709.75726,N,00123.61727,W,0.662,,200818,,,A*60
$GPVTG,,T,,M,0.662,N,1.226,K,A*26
$GPGGA,192016.00,4709.75726,N,00123.61727,W,1,05,3.30,6.3,M,47.9,M,,*47
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.48,3.30,4.37*01
$GPGSV,3,1,12,02,40,300,18,03,12,107,19,05,11,292,,06,61,218,19*74
$GPGSV,3,2,12,07,42,155,23,09,71,055,18,16,06,057,,19,08,224,*7B
$GPGSV,3,3,12,23,40,060,17,26,05,031,08,29,02,343,,30,18,179,23*7D
$GPGLL,4709.75726,N,00123.61727,W,192016.00,A,A*78
$GPRMC,192017.00,A,4709.75647,N,00123.61751,W,0.741,,200818,,,A*66
$GPVTG,,T,,M,0.741,N,1.372,K,A*26
$GPGGA,192017.00,4709.75647,N,00123.61751,W,1,05,3.30,6.2,M,47.9,M,,*40
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.48,3.30,4.37*01
$GPGSV,3,1,12,02,40,300,18,03,12,107,19,05,11,292,,06,61,218,18*75
$GPGSV,3,2,12,07,42,155,23,09,71,055,19,16,06,057,,19,08,224,*7A
$GPGSV,3,3,12,23,40,060,17,26,05,031,08,29,02,343,,30,18,179,22*7C
$GPGLL,4709.75647,N,00123.61751,W,192017.00,A,A*7E
$GPRMC,192018.00,A,4709.75657,N,00123.61796,W,0.771,,200818,,,A*60
$GPVTG,,T,,M,0.771,N,1.428,K,A*2D
$GPGGA,192018.00,4709.75657,N,00123.61796,W,1,05,3.30,6.3,M,47.9,M,,*44
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.47,3.30,4.37*0E
$GPGSV,3,1,12,02,40,300,18,03,12,107,19,05,11,292,,06,61,218,19*74
$GPGSV,3,2,12,07,42,155,22,09,71,055,19,16,06,057,,19,08,224,*7B
$GPGSV,3,3,12,23,40,060,17,26,05,031,08,29,02,343,,30,18,179,22*7C
$GPGLL,4709.75657,N,00123.61796,W,192018.00,A,A*7B
$GPRMC,192019.00,A,4709.75635,N,00123.61707,W,0.286,,200818,,,A*60
$GPVTG,,T,,M,0.286,N,0.530,K,A*29
$GPGGA,192019.00,4709.75635,N,00123.61707,W,1,05,3.30,6.5,M,47.9,M,,*4F
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.47,3.30,4.37*0E
$GPGSV,3,1,12,02,40,300,18,03,12,107,19,05,11,292,,06,61,218,18*75
$GPGSV,3,2,12,07,42,155,22,09,71,055,19,16,06,057,,19,08,224,*7B
$GPGSV,3,3,12,23,40,060,16,26,05,031,08,29,02,343,,30,18,179,22*7D
$GPGLL,4709.75635,N,00123.61707,W,192019.00,A,A*76
$GPRMC,192020.00,A,4709.75682,N,00123.61680,W,0.209,,200818,,,A*6F
$GPVTG,,T,,M,0.209,N,0.386,K,A*25
$GPGGA,192020.00,4709.75682,N,00123.61680,W,1,05,3.30,6.5,M,47.9,M,,*47
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.47,3.30,4.37*0E
$GPGSV,3,1,12,02,40,300,17,03,12,107,18,05,11,292,,06,61,218,17*74
$GPGSV,3,2,12,07,42,155,22,09,71,055,20,16,06,057,,19,08,224,*71
$GPGSV,3,3,12,23,40,060,16,26,05,031,09,29,02,343,,30,18,179,22*7C
$GPGLL,4709.75682,N,00123.61680,W,192020.00,A,A*7E
$GPRMC,192021.00,A,4709.75652,N,00123.61685,W,0.321,,200818,,,A*6D
$GPVTG,,T,,M,0.321,N,0.594,K,A*2B
$GPGGA,192021.00,4709.75652,N,00123.61685,W,1,05,3.29,6.6,M,47.9,M,,*45
$GPGSA,A,3,23,03,06,09,07,,,,,,,,5.47,3.29,4.37*06
$GPGSV,3,1,12,02,40,300,17,03,12,107,18,05,11,292,,06,61,218,16*75
$GPGSV,3,2,12,07,42,155,21,09,71,055,20,16,06,057,,19,08,224,*72
$GPGSV,3,3,12,23,40,060,16,26,05,031,09,29,02,343,,30,18,179,22*7C
$GPGLL,4709.75652,N,00123.61685,W,192021.00,A,A*77
$GPRMC,192022.00,A,4709.75656,N,00123.61764,W,0.491,,200818,,,A*68

Le Raspberry

Le Raspberry sera raccordé au GPS et recevra les relevés du gyroscope, de l'accéléromètre et du magnétomètre via le port RS232.

Finalement , après réflexion le GPS est raccordé à l'Arduino.

Montage de la girouette et anemometre

La girouette

Mesure de 0 a 360 degres

Input voltage: 12V-24V DC 
The output signal "4-20mA 
Wind direction value = (Output current -4) / 16 * 360 

L'anemometre

Range:0~32. 4 m/s

Supply voltagec:12V~24V  DC  
Output signals:4~20 mA
Load capacity:≤200Ω
Wind speed values =(output current -4)/16*32.4

QS-FX01.png

La carte de conversion

Current-to-Voltage-Signal-ModuleExemple.png

Description:

Module parameters

1, the working voltage: 9V ~ 17V
2, the input current: 4.00MA ~ 20.00MA
3, the output voltage: 0.00V ~ 5.00V /
4, the control mode: 4.00MA (mA) ~ 20.00MA (mA) input is converted to the corresponding 0.00v (V) to 5.00V (volts)
5, Size: (L) 26mm * (W) 23mm * (height) 10mm
6, drive: no drive.
7, Applications: Current signal transduction voltage signal; remote data acquisition and control equipment;
8, the module interface:
12V: power supply positive interfaces (9V ~ 17V).
G: Power to the ground interface.
IN: Signal input interface (4.00MA ~ 20.00MA).
G: Power to the ground interface.
OUT: Signal output connector (0.00V ~ 5.00V).
G: Power to the ground interface.

Les données AIS

Pour gérer l'AIS j'ai mis en oeuvre un transpondeur AIS Matsuteck HA102


La liaison série (38400) donne ces informations lorsque le transpondeur n'est pas connecté à l'antenne GPS , ni à l'antenne VHF.

$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
!AIVDO,1,1,,B,B00000000;?8mP=18D3Q3wP10400,0*57
!AIVDO,1,1,,A,C00000000;?8mP=18D3Q3wP000000000000000000000BP`4T3R0,0*13
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
!AIVDO,1,1,,B,B00000000;?8mP=18D3Q3wP10D00,0*27
!AIVDO,1,1,,A,C00000000;?8mP=18D3Q3wP000000000000000000000BP`4T3R0,0*13
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
!AIVDO,1,1,,B,B00000000;?8mP=18D3Q3wP10400,0*57
!AIVDO,1,1,,A,C00000000;?8mP=18D3Q3wP000000000000000000000BP`4T3R0,0*13
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48  

Voici le lien vers AIVDM/AIVDO protocol decoding : https://gpsd.gitlab.io/gpsd/AIVDM.html

Liens utiles