[Non réglé] Interférences GPS et Servo

Bonjour,

Je reconstruis sur une carte BotBoarduino (Duemilanove) un ancien projet qui tournait sur BasicStamp il y a une quinzaine d'années. Il s'agit du guidage GPS d'un bateau modèle réduit.
Les composants utilisés sont énumérés dans le programme.
Je suis bloqué par un problème d'interférence entre le fonctionnement du GPS Shield et la rotation d'un servo qui se met à battre au rythme de la réception des données NMEA.
Si je désactive ss.begin, le servo reste bien à la position souhaitée.
J'ai trouvé sur des posts en anglais que je ne suis pas le seul dans ce cas, mais sans trouver de solution dans les réponses ...

Mon code étant trop long, j'ai un message qui limite la taille à 9000 caractères quand je le mets entre les balises. Comment puis-je le joindre en entier ?
Celui joint n'est qu'un extrait pour passer dans le message.

/

******************************************************************************************************
   Position acquisition with GPS Shield https://www.elecrow.com/gps-shield-with-antenna-p-696.html
   Use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   9600-baud serial GPS device hooked up on pins 6(rx) and 7(tx)(Arduino).

   Bearing with Compass GY-282 (HMC5983)  https://wiki.eprolabs.com/index.php?title=GY-282_HMC5983_Module


   Acquisition de position par Shield GPS https://www.elecrow.com/gps-shield-with-antenna-p-696.html
   Utilise TinyGPS++ (TinyGPSPlus)et SoftwareSerial
   Nécessite l'utilisation d'un GPS série à 9600 bauds raccordé aux pins 6(rx) et 7(tx)de l'Arduino.

   Orientation par Boussole GY-282 (HMC5983)  https://wiki.eprolabs.com/index.php?title=GY-282_HMC5983_Module

   Carte Botboarduino (basée sur l'Arduino Duemilanove) https://www.robotshop.com/media/files/pdf2/botboarduinomanual.pdf

                    Thierry Maleval
                    14 août 2020


******************************************************************************************************/

// Pas de bug, mais

//    NON TERMINÉ (le servo balaye en permanence !!! interférence GPS et servo)




/******************************************************************************************************
   GPS Shield
******************************************************************************************************/

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const double WP_LAT = 44.078562, WP_LON = 6.174634; // WayPoint, Destination
static const uint32_t GPSBaud = 9600; // Vitesse transfert  GPS ==> Carte
static const int RXPin = 6, TXPin = 7; // Rx-Tx de l'Arduino (pas du GPS)
SoftwareSerial ss(RXPin, TXPin);
TinyGPSPlus gps; // The TinyGPS++ object

unsigned long distancemToWP;
double capToWP;

void gps_pc_monit()  // Ecriture texte sur Moniteur PC
{
  Serial.println(F("Sats Latitude   Longitude     Date      Heure   Alt     Route Vitesse Card Distance   Cap    Dir  Chars Sentences Checksum"));
  Serial.println(F("      (deg)      (deg)                          (m)     --- from GPS ----   du WP   vers WP  ----  RX    RX       Fail"));
  Serial.println(F("---------------------------------------------------------------------------------------------------------------------------"));
}


void gps_data() // Envoi des données GPS vers Moniteur PC
{



  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 9, 2);
  printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
  printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
  printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.value()) : "*** ", 6);



  distancemToWP =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      WP_LAT,
      WP_LON);


  printInt(distancemToWP, gps.location.isValid(), 9);


  capToWP =
    TinyGPSPlus::courseTo(
      gps.location.lat(),
      gps.location.lng(),
      WP_LAT,
      WP_LON);
  printFloat(capToWP, gps.location.isValid(), 8, 2);

  const char *cardinalToWP = TinyGPSPlus::cardinal(capToWP);
  printStr(gps.location.isValid() ? cardinalToWP : "*** ", 6);
  printInt(gps.charsProcessed(), true, 7);
  printInt(gps.sentencesWithFix(), true, 10);
  printInt(gps.failedChecksum(), true, 9);
  Serial.println();

}



//.....................................................................



/*******************************************************************************
                                 SETUP
********************************************************************************/

void setup()
{
  init_led();
  Serial.begin(9600); // Début de transfert (Vitesse)  Carte ==> PC
  ss.begin(GPSBaud); // Début de transfert (Vitesse)  GPS ==> Carte
  gps_pc_monit();
  init_boussole();
  init_servo (); // !!!!!!!!!  pour le moment  -  interfère avec ss.begin  !!!!!!!!!!

}



/*******************************************************************************
                                 LOOP
********************************************************************************/

void loop()
{
  gps_data();

  smartDelay(1000);

  gps_valid();
  wp_prox();

  data_boussole ();

  calc_route ();

  pos_servo ();

}

Bonjour

Pour joindre ('attacher') le fichier source complet utiliser 'Attachments and other options' en bas de l'écran d'édition /réédition du message. Bien prendre connaissance des contraintes de taille et d'extension pour les fichiers joints

Ok, merci.

Je mets le code complet ci-dessous.

GPS-Autonome-Forum.ino (9.45 KB)