Arduino Forum

International => Français => Topic started by: Endown on Mar 24, 2019, 08:58 pm

Title: Problème de communication entre 2 Ports Series
Post by: Endown on Mar 24, 2019, 08:58 pm
Bonjour,

Voici mon projet: j'ai pour objectif de construire un aéroglisseur de A à Z, pour l'instant je m'occupe de la partie numérique avec les capteurs et je suis entrain de programmer mon capteur GPS pour connaître la position exacte de mon aéroglisseur.

J'utilise le capteur GPS Grove v1.2. J'ai utilisé le programme à disposition sur leur site pour voir comment ce capteur fonctionnait.

J'obtenais des trames comme celles-ci : https://raw.githubusercontent.com/SeeedDocument/Grove-GPS/master/img/GPS_result.jpg mais il n'y a que la partie en rouge qui m'intéressait.
J'ai donc modifié le programme pour obtenir quelque chose comme ça :

Code: [Select]

#include <SoftwareSerial.h>
#include <stdio.h>
SoftwareSerial gps(10, 11);
unsigned char buffer[64];
unsigned char lat1[26];
unsigned char lng2[26];
    
int count=0;
int mot1=0;
int mot2=0;


                              
void setup()
{
    gps.begin(9600);                
    Serial.begin(9600);
                      
}

void loop()
{
    if (gps.available())                    
    {
        while(gps.available())              
        {
            buffer[count++]=gps.read();      
            if(count == 64)break;
        }

    
        delay(500);
        clearBufferArray();                        
        count = 0;
    }


    if(gps.available())
    {
      char currentchar1 = 'p';
      while(gps.available())
      {
        char currentchar1 = gps.read();
        if(currentchar1 == '4')
        {
          lat1[mot1++]='4';
          break;
        }
      }

      currentchar1 = '.';
      while(gps.available() && currentchar1 != ',')
      {
        currentchar1 = gps.read();
        lat1[mot1++]=currentchar1;
        
      }
      if(mot1 != 10)
      {
        clearLat1Array();
        mot1=0;
      }
      else
      {
      lat1[9] = '\0';    
      }
    }


    if(gps.available())
    {
      char currentchar2 = 'p';
      while(gps.available())
      {
        char currentchar2 = gps.read();
        if(currentchar2 == '0')
        {
          lng2[mot2++]='0';
          break;
        }
      }

      currentchar2 = '.';
      while(gps.available() && currentchar2 != ',')
      {
        currentchar2 = gps.read();
        lng2[mot2++]=currentchar2;
        lng2[11-1] = '\0';
        
      }
      if(mot2 != 11)
      {
        clearLng2Array();
        mot2=0;
      }
      else
      {
      lng2[11] = '\0';    
      }
    }


// Conversion de DD en DMS
{
  if(mot1!=0 && mot2!=0)
  {
    double latitude;
    double longitude;
      
    latitude = atof(lat1);
    longitude = atof(lng2);

    float latitude1 = latitude/100;
    int latitude1a = latitude1;        
    float longitude1 = longitude/100;
    int longitude1a = longitude1;        
    float latitude2 = (latitude1 - latitude1a)*60;
    int latitude2a = latitude2;      
    float latitude3 = (latitude2 - latitude2a)*60;
    float latitude3a = latitude3;
    float longitude2 = (longitude1 - longitude1a)*60;
    int longitude2a = longitude2;      
    float longitude3 = (longitude2 - longitude2a)*60;
    float longitude3a = longitude3;
    float lg[2];
    float la[2];
    for(int i=0; i<2; i++)
    {
      lg[i]=longitude1;
      la[i]=latitude1;
      delay(1000);
    }
    
    float M = (60*acos( sin(la[0]) * sin(la[1]) + cos(la[0]) * cos(la[1]) * cos(lg[1] - lg[0]) )*1842);



      Serial.println("Coordonnées GPS:");
      Serial.println();  
      Serial.println("          Latitude       ;      Longitude");
      Serial.print("DD:    ");
      Serial.print(latitude1,9);
      Serial.print("     ;     ");
      Serial.print(longitude1,9);
      Serial.println();
      Serial.print("DMS:   ");
      Serial.print(latitude1a);
      Serial.print("°");
      Serial.print(latitude2a);
      Serial.print("'");
      Serial.print(latitude3a);
      Serial.print("''");
      Serial.print("     ;     ");
      Serial.print(longitude1a);
      Serial.print("°");
      Serial.print(longitude2a);
      Serial.print("'");
      Serial.print(longitude3a);
      Serial.print("''");
      Serial.println();
      Serial.println();
      Serial.print("Vitesse:");
      Serial.print(M);        
      Serial.println("m/s");
      Serial.println();
      Serial.println("----------------------------------");
      delay(1000);

  }
}
 





    if (Serial.available())                
    gps.write(Serial.read());  
    clearLat1Array();
    mot1=0;
    clearLng2Array();
    mot2=0;    
}


void clearBufferArray()                    
{
    for (int i=0; i<count;i++)
    {
        buffer[i]=NULL;
    }                      
}

void clearLat1Array()                    
{
    for (int i=0; i<mot1;i++)
    {
        lat1[i]=NULL;
    }                      
}

void clearLng2Array()                    
{
    for (int i=0; i<mot2;i++)
    {
        lng2[i]=NULL;
    }                      
}

 
J'ai réussit à isoler la partie qui m'intéressait et réussit à faire des calculs avec.
J'obtiens comme résultat quelque chose comme ceci: https://ibb.co/94cZxwV

C'est à partir de là que j'ai un problème, je souhaite recevoir ces informations sur mon téléphone, j'ai donc installé un Port Série Bluetooth (HC-05 et comme application sur téléphone "Bluetooth Terminal HC-05") et quelques lignes sur mon programme pour les recevoir.

Code: [Select]


SoftwareSerial BTSerial(2, 3);



                              
void setup()
{


    
    
    boolean NL = true;
               
    
    BTSerial.begin(9600);
    
                        
}

void loop()
{
      BTSerial.println("Coordonnées GPS:");
      BTSerial.println();
      BTSerial.print("Latitude:");
      BTSerial.print(latitude1,8);
      BTSerial.print("   ;   ");
      BTSerial.print("Longitude:");
      BTSerial.print(longitude1,8);
      BTSerial.println();
      BTSerial.println();
      BTSerial.print("Latitude:");
      BTSerial.print(latitude1a);
      BTSerial.print("°");
      BTSerial.print(latitude2a);
      BTSerial.print("'");
      BTSerial.print(latitude3a, 4);
      BTSerial.print("''");
      BTSerial.print("    ;    ");
      BTSerial.print("Longitude:");
      BTSerial.print(longitude1a);
      BTSerial.print("°");
      BTSerial.print(longitude2a);
      BTSerial.print("'");
      BTSerial.print(longitude3a);
      BTSerial.print("''");
      BTSerial.println();
      BTSerial.println();
      BTSerial.print("Vitesse: ");
      BTSerial.print(M);
      BTSerial.println("m/s");
      BTSerial.println();
}



Mon programme est le même qu'avant avec ces lignes en plus
Quand je rentre ces commandes plus rien ne marche dans mon programme, je peux le téléverser et le vérifier, aucuns messages d'erreur ne s'affiche mais mon depuis le Port Série du PC je ne reçois aucunes données ni sur mon téléphone.
J'utilise aussi un Port Série Bluetooth pour un autre programme avec les mêmes lignes que j'ai rajouté et je reçois bien les données que je veux sur mon téléphone.

Si quelqu'un saurait comment résoudre ce problème je suis preneur.

Merci, bonne soirée
Title: Re: Problème de communication entre 2 Ports Series
Post by: J-M-L on Mar 25, 2019, 02:02 am
Deux Software Serial... ça met de la pression sur votre arduino... (même si un en lecture et l'autre qu'en écriture)  si vous envisagez un fonctionnement déconnecté du pc, mettez le BT sur Le port hardware serial (0 et 1) mais faudra le débrancher lors des uploads
Title: Re: Problème de communication entre 2 Ports Series
Post by: Endown on Mar 25, 2019, 06:37 am
D'accord merci je vais essayer.