Il NEO-6M è un modulo ricevitore GPS usato per determinare posizione, velocità e ora dai segnali satellitari. Di solito comunica con un microcontrollore tramite UART seriale usando TX e RX, con VCC e GND per l'alimentazione, e un pin PPS per un'uscita temporale precisa.
| Pin | Segnale | Descrizione |
|---|---|---|
TX |
TX | UART transmit output from the GPS module — connect to the host MCU RX. |
GND |
ground | Ground reference for power and UART signals. |
VCC |
power | Power input for the GPS module, typically 3.3–5V depending on board regulator. |
RX |
RX | UART receive input to the GPS module — connect to the host MCU TX. |
PPS |
digital | Pulse-per-second timing output from GPS lock for precise synchronization. |
| Da | A | Filo |
|---|---|---|
board:5V |
x1:VCC |
red |
board:GND |
x1:GND |
black |
board:D4 |
x1:TX |
green |
board:D3 |
x1:RX |
blue |
Questo esempio è stato scritto e verificato in compilazione per arduino-uno. Codey Online lo adatta a qualsiasi altra scheda supportata.
#include <SoftwareSerial.h>
// GPS NEO-6M canonical example for Arduino Uno
// Wiring:
// GPS VCC -> 5V
// GPS GND -> GND
// GPS TX -> D4 (Arduino receives on this pin)
// GPS RX -> D3 (Arduino transmits on this pin)
SoftwareSerial gpsSerial(4, 3); // RX, TX
char lineBuffer[120];
uint8_t lineIndex = 0;
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
Serial.println(F("GPS NEO-6M example started."));
Serial.println(F("Waiting for NMEA sentences..."));
}
void printField(const char *label, const char *value) {
Serial.print(label);
Serial.print(value);
}
void handleRMC(char *sentence) {
// Example: $GPRMC,hhmmss.sss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,,,A*hh
char *fields[12] = {0};
uint8_t count = 0;
char *token = strtok(sentence, ",");
while (token && count < 12) {
fields[count++] = token;
token = strtok(NULL, ",");
}
if (count < 10) return;
if (fields[2] == NULL || fields[2][0] != 'A') {
Serial.println(F("No GPS fix yet."));
return;
}
Serial.println(F("--- Valid Fix (RMC) ---"));
if (fields[1]) printField("Time (UTC): ", fields[1]), Serial.println();
if (fields[3] && fields[4]) {
Serial.print(F("Latitude: "));
Serial.print(fields[3]);
Serial.println(fields[4]);
}
if (fields[5] && fields[6]) {
Serial.print(F("Longitude: "));
Serial.print(fields[5]);
Serial.println(fields[6]);
}
if (fields[7]) {
Serial.print(F("Speed (knots): "));
Serial.println(fields[7]);
}
if (fields[8]) {
Serial.print(F("Course (deg): "));
Serial.println(fields[8]);
}
if (fields[9]) {
Serial.print(F("Date (ddmmyy): "));
Serial.println(fields[9]);
}
}
void handleGGA(char *sentence) {
// Example: $GPGGA,time,lat,N,lon,E,fixquality,numsat,hdop,alt,M,...
char *fields[15] = {0};
uint8_t count = 0;
char *token = strtok(sentence, ",");
while (token && count < 15) {
fields[count++] = token;
token = strtok(NULL, ",");
}
if (count < 8) return;
int fixQuality = fields[6] ? atoi(fields[6]) : 0;
int satellites = fields[7] ? atoi(fields[7]) : 0;
Serial.println(F("--- GGA Status ---"));
Serial.print(F("Fix quality: "));
Serial.println(fixQuality);
Serial.print(F("Satellites: "));
Serial.println(satellites);
if (fields[8]) {
Serial.print(F("HDOP: "));
Serial.println(fields[8]);
}
if (fields[9] && fields[10]) {
Serial.print(F("Altitude: "));
Serial.print(fields[9]);
Serial.print(' ');
Serial.println(fields[10]);
}
}
void loop() {
while (gpsSerial.available()) {
char c = (char)gpsSerial.read();
if (c == '\n') {
lineBuffer[lineIndex] = '\0';
lineIndex = 0;
// Trim trailing carriage return if present
char *sentence = lineBuffer;
size_t len = strlen(sentence);
if (len > 0 && sentence[len - 1] == '\r') {
sentence[len - 1] = '\0';
}
if (strncmp(sentence, "$GPRMC", 6) == 0 || strncmp(sentence, "$GNRMC", 6) == 0) {
char temp[120];
strncpy(temp, sentence, sizeof(temp));
temp[sizeof(temp) - 1] = '\0';
handleRMC(temp);
} else if (strncmp(sentence, "$GPGGA", 6) == 0 || strncmp(sentence, "$GNGGA", 6) == 0) {
char temp[120];
strncpy(temp, sentence, sizeof(temp));
temp[sizeof(temp) - 1] = '\0';
handleGGA(temp);
}
} else {
if (lineIndex < sizeof(lineBuffer) - 1) {
lineBuffer[lineIndex++] = c;
} else {
lineIndex = 0; // overflow protection
}
}
}
}
Descrivi cosa vuoi realizzare. Codey Online scrive il codice, disegna lo schema di collegamento, lo compila e programma la tua scheda direttamente dal browser.
Inizia gratis