compilation avec la librairie SoftwareSerial.h + mkrfox 1200

Bonjour,

Je n'arrive à compiler aucun programme ayant besoin de la librairie SoftwareSerial.h

Dans mon cas, je doit utiliser la carte Module GPS NEO6MV2 (librairie Tiny GPS) + arduino MKRFOX 1200 et j'ai toujours un message d'erreur.
Existe-il une livraison SoftwareSerial compatible ?
Merci.

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

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 4800;

// The TinyGPS++ object
TinyGPSPlus gps;

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

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);

  Serial.println(F("FullExample.ino"));
  Serial.println(F("An extensive example of many interesting TinyGPS++ features"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
  Serial.println(F("Sats HDOP  Latitude   Longitude   Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum"));
  Serial.println(F("           (deg)      (deg)       Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail"));
  Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
}

void loop()
{
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printInt(gps.location.age(), gps.location.isValid(), 5);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 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.deg()) : "*** ", 6);

  unsigned long distanceKmToLondon =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT, 
      LONDON_LON) / 1000;
  printInt(distanceKmToLondon, gps.location.isValid(), 9);

  double courseToLondon =
    TinyGPSPlus::courseTo(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT, 
      LONDON_LON);

  printFloat(courseToLondon, gps.location.isValid(), 7, 2);

  const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);

  printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);

  printInt(gps.charsProcessed(), true, 6);
  printInt(gps.sentencesWithFix(), true, 10);
  printInt(gps.failedChecksum(), true, 9);
  Serial.println();
  
  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }
  
  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartDelay(0);
}

Bonjour,

tu devrais simplifier ton programme pour ne garder que les lignes problématiques afin que ceux qui veulent t'aider en testant ton code ne soient pas obligés de télécharger TinyGPS++...

Bon je l'ai fait ci-dessous :

#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;

SoftwareSerial ss(RXPin, TXPin);

static const uint32_t GPSBaud = 4800;

void setup() {
   ss.begin(GPSBaud);
}

void loop() { }

Ce programme compile chez moi. S'il ne compile pas chez toi :

  • donne nous les messages d'erreurs du compilateur
  • ta version de l'IDE arduino
  • ton système d'exploitation

Et toute autre info utile.

voila le debut du message d'erreur :

C:\Users\User\Documents\Arduino\libraries\SoftwareSerial-master\SoftwareSerial.cpp:260:2: error: #error This version of SoftwareSerial supports only 20, 16 and 8MHz processors

#error This version of SoftwareSerial supports only 20, 16 and 8MHz processors

^

C:\Users\User\Documents\Arduino\libraries\SoftwareSerial-master\SoftwareSerial.cpp: In member function 'bool SoftwareSerial::listen()':

C:\Users\User\Documents\Arduino\libraries\SoftwareSerial-master\SoftwareSerial.cpp:316:23: error: 'SREG' was not declared in this scope

uint8_t oldSREG = SREG;

Ok, c'est plus clair :wink:

La bibliothèque softwareSerial n'est pas disponible pour le microcontrôleur Atmel SAMD21 de ta carte arduino MKRFOX 1200.

Je ne connais pas ce microcontrôleur Atmel SAMD21 mais après quelques recherches sur le net il semblerait qu'il possède 3 UART (véritables ports séries) et donc qu'utiliser SoftWareSerial n'est pas utile (voir même contre productif compte tenu de l'émulation logicielle peu performante de SoftwareSerial pour les débits supérieurs à 9600 bauds).

du coup je ne sais pas si on peut faire fonctionner NEO6MV2 gps avec l'arduino mkrfox, si on peut pas se servir de la librairie softwareserial, quelle est la méthode pour afficher les coordonnées GPS du module ?

Merci.

Si c'est juste un problème de port série crée toi un nouveau port série sur ta carte mkrfox 1200 :

D'autres l'on déjà fait :

Il va falloir lire de la doc, ou attendre qu'un forumeur passe par là en te donnant plus d'infos.

Bonne chance :wink:

avec un MKRFOX 1200 vous n'avez même pas besoin de vous ennuyez, puisqu'il a déjà un second port Série configuré pour vous (Serial1)

il est bon de comprendre que le microcontroller Atmel SAMD21 de votre MKRFOX (et autres Zero, MKRZero, MKR1000,...) ont six modules internes paramétrables pour faire de la communication série et vous pouvez choisir le protocole que vous voulez parmi ceux ci:

  • Série (USART full-duplex et single-wire half-duplex)
  • I2C jusqu'à 3.4MHz
  • SPI
  • (et esclave LIN que vous n'utiliserez sans doute pas à moins que vous ne soyez dans le monde de l'automobile).

Votre MKRFOX1200 est configuré pour vous avec 3 de ces modules internes déjà paramétrés (Serial via USB, I2C et SPI) et un port Série (USART) supplémentaire Serial1 sur les pins 14 (TX) et 13 (RX)

Il vous suffit donc de connecter votre GPS sur les pins 13 et 14, et ne pas oublier de joindre les masses - en vous assurant bien évidemment avant d'alimenter le tout que votre GPS est en 3.3Volts (sinon il vous faudra un petit module d'adaptation de tension) et d'utiliser Serial1 pour interagir avec le GPS

Si vous voulez en savoir plus vous pouvez explorer le monde des SERCOM.


Un petit exemple pour tester et montrer que cela fonctionne bien: J'ai effectué le montage suivant

c'est à dire que j'ai mon MKRFOX connecté via USB à mon mac et j'utilise un petit adaptateur USB Série FTDI qui d'un côté est aussi relié à mon ordinateur via USB et de l'autre j'ai connecté 3 fils:

  • le fil vert relie les GND
  • le fil Jaune Rx (Adaptateur) --> pin 14 (TX) du MKRFOX
  • le fil Orange Tx (Adaptateur) --> pin 13 (RX) du MKRFOX

Ensuite j'ai chargé le programme suivant dans mon MKRFOX

void setup() {
  Serial.begin(115200);  // Serial USB
  while (!Serial); // on attend la connexion effective
  Serial.println("Hello Serial");

  Serial1.begin(115200); // Serial1 sur pins 14 (TX) et 13 (RX)
  Serial1.println("Hello Serial1");
}

void loop() {
  if (Serial1.available()) {
    int c = Serial1.read();
    if (c != -1) Serial.write((char) c);
  }

  if (Serial.available()) {
    int c = Serial.read();
    if (c != -1) Serial1.write((char) c);
  }
}

Avec la console série Arduino réglée à 115200 bauds

ainsi qu'u émulateur série (CoolTerm dans mon cas) que je règle à 115200 bauds et associe au port de mon FTDI

Le programme est tout bête il écoute les 2 ports série et s'il voit passer quelque chose sur l'un, il le recopie sur l'autre.

Donc si je tape COUCOU dans la liaison FTDI

et que je valide alors, la console Arduino me l'affiche

et inversement si je tape HELLO, HOW ARE YOU? dans la console série Arduino

alors, c'est magique, je vois le texte apparaître côté FTDI

si au lieu de mon adaptateur FTDI vous avez votre GPS (en 3.3.V) et qu'il est configuré pour bavarder en ASCII toutes les secondes par exemple, vous devriez voir les trames du GPS s'afficher côté arduino

Merci,
Je viens d'adapter mon programme avec vos conseil, ça marche impeccable
Merci encore de vos lumières.

Bravo :slight_smile: