Problème de communication série entre divers éléments ?

Bonjour à tous;

nouveau petit problème en vue dans le développement de mon application....

Je crée un système de contrôle pour un bateau à moteur, indiquant notamment la position et surtout la vitesse, relevé par un module GPS ( Réf : GY-GPS6MV2), l'interface utilisateur se faisant via un écran tactile Nextion. J'utilise une carte arduino NANO.

Afin de connecter les deux élements (écran et GPS), je passe via la library SoftwareSerial.h

  • pins 2 & 3 : ecran Nextion

  • pins 4 & 5 : GPS

pris séparément, chaque élément fonctionne parfaitement : l'écran envoie bien les informations lors d'un "click", et le GPS me renvoie bien la position, la vitesse, etc.

Par contre, lorsque les deux travaillent ensemble, l'écran fonctionne, mais le GPS ne m’envoie plus d'informations. (un clic sur l'écran demande l'affichage de la longitude et la latitude, via une fonction d'interrogation du GPS)

Se pourrait-il que la communication avec l'écran soit prioritaire vis-à-vis du GPS ?

quelqu'un a-t-il une idée de ce "blocage" de la communication série ?

Merci d'avance

Salut

Il me semble avoir déjà vu des commentaires du style "pas le lecture simultanée de plusieurs lignes série avec SoftwareSerial" sur ce forum.

@+

Bonjour,

Comme le dit hbachetti une seule liaison SoftwareSerial à la fois peut être en réception.
On peut changer la liaison qui reçoit par la méthode listen().

Bonjour cycloneseb

Pourquoi ne pas te passer de communication série (sauf pour l'écran) et passer au bus i2C.
Ainsi, tu "colles" un petit Arduino du genre Arduino Pro Mini à ton périférique que tu transformes en i2c Slave.
Le Nano transformé en i2C Master.Ainsi, si tu as d'autres périphériques à part ton GPS, tu n'as plus de problème.
Je peux te faire un tuto pour réaliser ceci.

Cordialement
jpbbricole

dans l'absolu vaut mieux éviter Software Serial quand on peut... un projet en production est souvent déconnecté du PC/Mac donc vous pouvez utiliser le port série matériel, ce sera bien plus robuste (même s'il faut un peu jongler lors du test)

Il me semblait qu'il existait une alternative à SotwareSerial.
J'ai trouvé : NeoSWSerial

Simultaneous transmit and receive is fully supported.

Si quelqu'un a déjà testé ou a un avis ...

@+

Nextion et GPS ça cause pas très vite mais utiliser 2 serial soft c'est pas terrible.

Je rejoins JML, utilise le port série materiel, sur lequel je placerai le GPS qui lui cause en permanence et envoi un bon paquet de donnée.

Le Nextion est moins bavard, autant le placer sur un port virtuel.

Et pour aller plus loin: utiliser une carte MEGA, elle dispose de 4 port serie materiel, tu ne sera pas embeté.

La place est un probleme: il existe des mini MEGA: ici

hbachetti:
Il me semblait qu'il existait une alternative à SotwareSerial.
J'ai trouvé : NeoSWSerial

Si quelqu'un a déjà testé ou a un avis ...

@+

oui c'est la librairie écrite par /dev, il l'avait annoncée sur le forum ici

c'est clairement mieux que software Serial en terme de stabilité mais limité en bauds et il faut toujours faire l'équivalent de Listen() (ça supporte le RX & TX simultanés mais pas plusieurs ports en Rx)

Salut à tous !

merci pour vos idées. Je suis actuellement en déplacement, je testerai vos solutions à mon retour.

J'ai testé directement le port série matériel, et j'ai toujours ce même problème : rien que le GPS ... ça fonctionne parfaitement, lorsque le Nextion est connecté, plus moyen d'avoir l'info du GPS, je n'ai que des 00000000 qui apparaissent.

J'ai voulu essayer avec une carte Arduino Mega mais ... pas encore eu le temps, je testerai en rentrant. L'idée à priori ne me plaisait pas trop, voulant utiliser une carte Nano car plus compacte, mais l'existence de MEGA compacte peut changer la donne...

bref, j'espère pouvoir avancer mardi prochain !

merci à vous tous !

bonne semaine

Bonjour

Une arduino à 16 Mhz devrait être capable de traiter plusieurs réceptions Série simultanément, surtout là avec des baudrate assez faibles (il me semble que le GPS est à 19200 bps par défaut, qui peut être baissé à 9600), même de manière software, simplement sur des pins avec gestion d'interruptions.

Le problème a l'air d'être software : difficile de trouver une bibliothèque pour le faire.
Dans le même ordre d'idée, je me souviens avoir galéré pour trouver une bibliothèque qui ne fasse que RX sans TX (sans cramer une pin pour un TX inutilisé, ni allouer des buffer en ram pour l'émission).

Si coincé, il reste toujours effectivement la solution de déporter le GPS sur une pro mini montée en esclave I2C. Là au moins on reste sur des bib standard, avec un résultat qui fonctionnera bien.
Mais c'est dommage de devoir compliquer le montage physique pour une histoire de software à la ramasse.

Partage ton code au cas où + ton fichier HMI . J’attend un nextion qui devrais plus tarder, je pourrai tester.

Une idée qui m’effleure: as tu besoin que ton écran Nextion fasse du RX et du TX?

Bonjour

bricoleau:
Une arduino à 16 Mhz devrait être capable de traiter plusieurs réceptions Série simultanément, surtout là avec des baudrate assez faibles

La bibliothèque SoftwareSerial offre un exemple de double réception.

bricoleau:
Si coincé, il reste toujours effectivement la solution de déporter le GPS sur une pro mini montée en esclave I2C.

Solution qui permet de se “lacher”, avec beaucoup moins de restrictions qu’avec des ports série.

Cordialement
jpbbricole

Salut à tous;

me voilà de retour après qq jours de congés… et maintenant, c’est la reprise du code …

Je suis tj confronté au même problème, à savoir que le GPS seul fonctionne parfaitement, mais que dès qu’un écran Nextion est accouplé, ca bugue, et je n’obtiens que des 0000000.

Remarque peut-etre intéressante : si je démarre la communication série du GPS lors du Void Setup, (dans ce cas ss.begin(9600)); l’écran Nextion ne répond plus…

j’ajoute que je dois rester constamment à l’écoute du NEXTION, car le code doit reconnaitre le ‘click’ sur le bouton de la fonction de localisation.

Voici mon code, en partie épurée des fonctions qui ne servent à rien… je cherche le loup…

//Librairies
#include <SoftwareSerial.h>
#include <Nextion.h>
#include <EEPROM.h>
#include <Wire.h>
#include <TinyGPS++.h>


//Connection avec l'écran HMI nextion - Pins digitales 2 & 3 pour NANO.
SoftwareSerial nextion(2, 3);// Nextion TX to pin 2 and RX to pin 3 of Arduino 

//ouverture de la communication, à 9600 bauds
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps


static const int RXPin = 5, TXPin = 4;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// The TinyGPS++ object
TinyGPSPlus gps;


// declaration de la variable message - écoute des messages de l'écran
String message;


 
// SETUP  - executé 1 fois

void setup() {
  Serial.print("Contrôle Bateau  - version 1.0");
  
  // l'entrée analogique A1 est définie comme ...entrée
  pinMode(AnalogInput,INPUT);
  
  Serial.begin(9600);



} // FIN DE SETUP

// Fonction qui tourne en boucle LOOP
void loop() {

  //lecture de la page affichée ou du bouton cliqué
  String message = myNextion.listen(); //check for message
  if(message != ""){ // si un message est reçu par l'ARDUINO
    Serial.println(message); //...affichage à l'écran
  }
  //Conditions  
  if(message == "3"){ //Si message = 3 => la page voltmètre est affichée
    //Serial.println("fonction voltmetre");
    //appel de la fonction correspondante "volt2"

  }
  else if(message == "6"){ //Si message = 6 => la page pompe de cale est affichée
     //Appel de la fonction correspondante "Pompe_Cale"
     
  }
  else if(message == "65 4 4 1 ffff ffff ffff")//click sur l'icône ON/OFF "feux de navigation"
  { 
     //lance la fonction de vérification et d'activation/désactivation des feux de nav

  }
  else if(message == "65 4 5 1 ffff ffff ffff")//click sur l'icône ON/OFF "lampe LED"
  { 
     //lance la fonction de vérification et d'activation/désactivation de la lampe LED

  }
  else if (message == "65 6 3 1 ffff ffff ffff")//click sur l'icône "Pompe de cale"
  { 
     //lance la fonction de vérification et d'activation/désactivation de la pompe de cale 

  }
    else if (message == "2")//click sur l'icône page GPS
  { 
     //lance la fonction de localisation par GPS
     Localisation();
  }



//Fin de la fonction LOOP
}


void Localisation() //FONCTION GPS
{
//boucle  
  do
  {
    
  ss.begin(9600);//ouverture de la communication série avec le GPS
  // Serial.println("ecoute nextion");
  //message = myNextion.listen(); //check d'un message exit du Nextion
  //delay (100);
  // Serial.println("calcul GPS");

    Serial.println("activation du GPS");//Afficahge des infos du GPS
  //vitesse = gps.speed.kmph();
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
    Serial.print("VITESSE (km/h)="); Serial.print(gps.speed.kmph(),1);

 delay(900);
    //message = myNextion.listen(); //ecoute du message EXIT provenant du Nextion

     }

    while (message != "65 2 2 1 ffff ffff ffff");
    //Serial.println("fin de boucle");


  

  
}

Bonjour,

Je ne suis pas sûr que l'utilisation d'un delay(900) avec une liaison série logicielle soit très judicieuse.

Comme il t'a été dit plus haut, il ne peut y avoir qu'une seule liaison SotfwareSerial qui reçoit à la fois.

Zlika:
Je ne suis pas sûr que l'utilisation d'un delay(900) avec une liaison série logiciel soit très judicieux.

+1 avec Zilka

Je n'ai malheureusement pas le matériel pour essayer, mais en lisant ton programme, je me suis permis de retoucher un peu ta void setup() comme suit

void setup() {
	Serial.begin(9600);
	ss.begin(9600);                    // Et non plus dans void Localisation()
	nextion.begin(9600);               // N'était pas dans le programme

	Serial.print("Contrôle Bateau  - version 1.0");
	
	// l'entrée analogique A1 est définie comme ...entrée
	pinMode(AnalogInput,INPUT);
} // FIN DE SETUP

A ta disposition...

Cordialement
jpbbricole

Il y a une meute entière de loups... :slight_smile: