🛠 Dialoguer avec un GPS (ou tout module TTL) sur Serial1 sans bloquer la boucle
Objectifs
La Due possède 4 UART matériels : Serial (broches 0/1, relié au port Programming), Serial1 (USART0, broches 18/19), Serial2 (16/17) et Serial3 (14/15) — sans parler de SerialUSB. Vous allez brancher un module GPS (ou tout appareil série TTL) sur Serial1, libre de tout usage USB, et apprendre la lecture asynchrone par available/read avec découpage de trame NMEA, pour ne jamais bloquer la boucle avec un readString.
Matériel
- 1 Arduino Due
- 1 module GPS à sortie TTL (type NEO-6M/7M) — attention : alimenter en 3,3 V, la Due n'accepte que 3,3 V sur ses broches ; un module 5 V exige un adaptateur de niveau sur TX du module
- 4 fils mâche-mâche, câble micro-USB
- Éventuellement un adaptateur USB-série pour tester le GPS avant
Code complet
// Lecteur de ligne non bloquant sur Serial1 (RX=18, TX=19)
char ligne[128];
size_t len = 0;
uint32_t dernierOctetMs = 0;
void setup {
SerialUSB.begin(115200); // debug sur le port Native
Serial1.begin(9600); // typical GPS baud (NEO-6M : 9600)
}
void loop {
// 1) Vider le FIFO sans jamais bloquer
while (Serial1.available) {
char c = (char)Serial1.read;
dernierOctetMs = millis;
if (c == '\n' || len == sizeof(ligne) - 1) { // fin de trame
ligne[len] = '\0';
if (len > 6 && strncmp(ligne, "$GNGGA", 6) == 0) {
SerialUSB.printf("trame GGA (%u octets)\n", (unsigned)len);
}
len = 0;
continue;
}
if (c != '\r') ligne[len++] = c;
}
// 2) Clôturer une trame orpheline après 100 ms de silence
if (len && millis - dernierOctetMs > 100) {
ligne[len] = '\0';
SerialUSB.printf("flush timeout: %s\n", ligne);
len = 0;
}
// 3) Ici, toute autre logique : l'attente série ne vous bloque jamais
}
Vérification attendue
En extérieur (vue sur le ciel) ou près d'une fenêtre, le moniteur Native affiche des trames NMEA complètes ; la trame $GNGGA apparaît dès que le GPS a un fix. Débrancher le GPS ne gèle pas la boucle : le programme continue de tourner (testez avec une LED). La LED TX du module clignote en réception.
Erreurs fréquentes
- Utiliser
readStringoureadStringUntil: bloquant, il fait rater le loop pendant des secondes si le module se tait — d'où le motifavailable/readci-dessus. - Câbler un module 5 V directement sur RX1 : la broche est en 3,3 V max ; le TX du module doit passer par un niveau-baisseur (ou choisir un module 3,3 V).
- Inverser TX/RX : le module parle, la Due n'entend rien ; croiser TX(module)→RX1(18) et RX(module)←TX1(19).
- Confondre Serial (0/1, occupé par le port Programming) avec Serial1 : écrire sur le mauvais port série est le grand classique des 4 UART de la Due.
- Attendre des trames valides en intérieur : sans fix, beaucoup de trames arrivent vides ou sans données de position.
- Oublier que SerialUSB bloque si aucun hôte n'a énuméré le CDC : en autonomie totale, protéger les gros
printparif (SerialUSB).
Autres tutoriels pour cette carte
- Faire clignoter la LED de l'Arduino Due et apprivoiser ses deux ports USB
- Lire un potentiomètre avec le vrai ADC 12 bits de la Due
- Allumer une LED externe en respectant les broches 3,3 V et 9 mA de la Due
- Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)
- Scanner les deux bus I2C de la Due (Wire sur 20/21, Wire1 sur 70/71)
- Monter la Due sur un bus CAN 500 kbit/s avec un transceiver externe
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino