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 ();
}