🛠 Ajouter un deuxième port série avec SoftwareSerial (GPS sur broches 10/11)
Objetivos
La Duemilanove solo tiene un UART de hardware (pines 0/1) y ya está ocupado por el puente USB-serial FTDI. La página oficial lo dice explícitamente: «una biblioteca SoftwareSerial permite la comunicación serie en cualquier pin digital». Vas a conectar un GPS a los pines 10/11 y a hacer un puente serie bidireccional entre el GPS y el monitor USB — la técnica que ha permitido a generaciones de proyectos GPS/GSM/MP3 funcionar en AVR.
Material
- 1 Arduino Duemilanove (se recomienda la ATmega328: los 1 KB de SRAM de la 168 limitan el tamaño del programa)
- 1 módulo GPS TTL (tipo NEO-6M, 4800 o 9600 baudios) — a 5 V es compatible con la lógica de 5 V de la Duemilanove, no se necesita ningún conversor de nivel
- 4 cables macho-macho, cable mini-USB
Código completo
// Pont moniteur USB <-> GPS sur SoftwareSerial (RX=10, TX=11)
#include <SoftwareSerial.h>
SoftwareSerial gps(10, 11); // RX, TX
void setup {
Serial.begin(9600); // USB (FTDI)
gps.begin(4800); // NEO-6M par defaut : 4800
Serial.println("Pont GPS actif — attendez le fix");
}
void loop {
if (gps.available) Serial.write(gps.read); // GPS -> moniteur
if (Serial.available) gps.write(Serial.read); // moniteur -> GPS
}
Verificación esperada
El monitor serie (9600) muestra las frases NMEA $GPGGA, $GPRMC… en cuanto el GPS capta señal (unos minutos en frío, cerca de una ventana). Al enviar un comando UBX o una frase válida desde el monitor, este se reenvía al GPS. El LED de estado del GPS parpadea cada segundo.
Errores frecuentes
- Creer que SoftwareSerial es full-duplex a 9600+ en AVR: a 4800 funciona; a 9600 y más, se pierden bytes si el loop hace otra cosa — es el límite físico de la emulación por software en un AVR de 16 MHz.
- Invertir el cruce: TX del GPS → pin 10 (RX por software), RX del GPS ← pin 11 (TX por software); sin cruce, silencio total.
- Usar el pin 11 en PWM al mismo tiempo: SoftwareSerial en los pines 10/11 monopoliza el temporizador utilizado por el PWM de los pines 9/10/11 — los
analogWriteen estos pines se degradan. - Conectar el GPS a los pines 0/1: conflicto directo con la FTDI, el monitor y el GPS se comunican por ahí y la carga del programa se vuelve imposible.
- Elegir los pines 2/3 para el GPS: es posible, pero a menudo se reservan para interrupciones externas; 10/11 es la elección clásica.
- Esperar una posición fija (fix) en interiores: sin vista al cielo, las frases llegan vacías — sal a probar.
- Olvidar el
delay(1000)después de abrir el puerto en un script del host: el auto-reset DTR hace perder el primer medio segundo (ver el tutorial del botón).
Otros tutoriales para esta placa
- Faire clignoter la LED 13 d'une Duemilanove (et choisir le bon ATmega)
- Bouton poussoir et moniteur série sur la Duemilanove (avec ses 0,5 s de silence)
- Potentiomètre et variation LED : l'ADC 10 bits et le PWM 8 bits version AVR
- Régler la référence de mesure avec AREF et analogReference
- Persister une calibration dans l'EEPROM de l'ATmega (512 octets ou 1 Ko)
- Convertir la Duemilanove en programmateur AVR (ArduinoISP) pour graver des puces nues
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduinoservo-balayage.inoArduinobuzzer-melodie.inoArduino