Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad

Componentes y suministros

Arduino UNO 1
Pantalla LCD RGB 16x2 (en mi caso LCD 20x4 I2C genérico) 1
Protoboard (genérica) 1
Cables jumper (genéricos) 1
Receptor GPS (genérico) – GY-GPS6Mv2 con u-blox NEO-6M 1

Aplicaciones y servicios online

Acerca del proyecto

Hasta ahora he usado varios RTC para proyectos de reloj u obtenía la hora de servidores NTP. En este proyecto presento otra fuente: parsear la cadena NMEA de satélites GPS.

Me sorprendió lo barato que es un receptor GPS hoy: consigue uno (uso GY-GPS6Mv2).

Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad

a) Prueba opcional en Windows: Instala "u-center" de U-Blox. Con adaptador FTDI, el GPS llega al puerto COM y muestra la fijación (fix) a los satélites en ~1 min (LED rojo parpadea). Con F8 → Text Console ves las cadenas NMEA.

b) Test de decodificación online: rl.se/gprmc

Una vez verificado que el GPS funciona (necesita vista al cielo), extraemos la info deseada.

Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad

Usamos la librería Adafruit "Adafruit GPS Library" (instalar desde IDE).

c) Circuito

Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad
Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad
Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad

Conexiones I2C LCD: Arduino A4 → SDA, A5 → SCL.


#include 
#include 
LiquidCrystal_I2C lcd(0x3F, 20, 4); // dirección LCD, suele ser 0x27 o 0x3F

Conexiones GPS (tolerante 3.3/5V):


#include 
#include 
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);

d) Nuestro reloj mostrará: hora, fecha, indicación de velocidad del viento y altitud. No necesitamos ubicación porque el reloj estará en la ventana.

La cadena NMEA da la hora en UTC. La conversión a hora local es nuestra. Añado +1 para zona Europa/Berlín (UTC+0100).


int timezone = +1; // Europa/Berlín (UTC+0100)

La variable hour se usa para mostrar en LCD en lugar de GPS.hour (UTC).


// Salida a LCD
lcd.setCursor(5,0); // línea 1
int hour = (GPS.hour) + timezone;
if (hour < 10) lcd.print('0');
lcd.print(hour, DEC); lcd.print(':');
// ... minutos y segundos similar

En Europa usamos km/h en lugar de nudos para velocidad viento. Convierto: 1 nudo = 1.852 km/h.


float speed = (GPS.speed) * 1.852; // nudos a km/h

Evaluación según Wikipedia (escala Beaufort simplificada):


if (speed <= 1) lcd.print(" Windstille");
else if (speed <= 9) lcd.print(" leiser Zug");
else if (speed <= 46) lcd.print(" Brise");
else if (speed <= 56) lcd.print(" starker Wind");
else if (speed <= 74) lcd.print(" stuerm. Wind");
else if (speed <= 83) lcd.print(" Sturm");
else if (speed <= 102) lcd.print(" schwerer Sturm");
else if (speed > 102) lcd.print(" Orkan");
else lcd.print(" ohne Bewertung");

Resultado en pantalla (adaptable a gusto):

Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad

Dejé frecuencia de actualización a 2 segundos en el loop. Incluso prescindo de segundos y altitud para usar un display 16x2.

Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad
Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad

¡Diviértete explorando las opciones del GPS!

En Europa también existe señal horaria DCF77, pero es más cara y su manejo es muy sensible.

Código

GPS_SoftwareSerial_Parsing_ilo (C/C++)


// Test code for Adafruit GPS modules using MTK3329/MTK3339 driver
// Modified 01.02.2020 - Ingo Lohs
// GPRMC & GPGGA decoder: https://rl.se/gprmc
#include 
#include 
LiquidCrystal_I2C lcd(0x3F,20,4);
#include 
#include 
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
int timezone = +1; // Europe/Berlin (UTC +0100)

void setup() {
  lcd.init(); lcd.backlight();
  Serial.begin(115200);
  delay(5000);
  Serial.println("Adafruit GPS library basic test!");
  GPS.begin(9600); // UBLOX 6M: GY-GPS6Mv2
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // RMC + GGA (incluye altitud)
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz
  GPS.sendCommand(PGCMD_ANTENNA);
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);
}

uint32_t timer = millis();
void loop() {
  char c = GPS.read();
  if (c && GPSECHO) Serial.write(c);
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) return;
  }
  if (timer > millis()) timer = millis();
  if (millis() - timer > 2000) {
    timer = millis();
    // Serial output
    Serial.print("\nTime: ");
    if (GPS.hour < 10) Serial.print('0');
    Serial.print(GPS.hour, DEC); Serial.print(':');
    if (GPS.minute < 10) Serial.print('0');
    Serial.print(GPS.minute, DEC); Serial.print(':');
    if (GPS.seconds < 10) Serial.print('0');
    Serial.print(GPS.seconds, DEC); Serial.print('.');
    if (GPS.milliseconds < 10) Serial.print("00");
    else if (GPS.milliseconds < 100) Serial.print("0");
    Serial.println(GPS.milliseconds);
    Serial.print("Date: ");
    Serial.print(GPS.day, DEC); Serial.print('/');
    Serial.print(GPS.month, DEC); Serial.print("/20");
    Serial.println(GPS.year, DEC);
    Serial.print("Fix: "); Serial.print((int)GPS.fix);
    Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
    // LCD output
    lcd.setCursor(5,0);
    int hour = (GPS.hour) + timezone;
    if (hour < 10) lcd.print('0');
    lcd.print(hour, DEC); lcd.print(':');
    if (GPS.minute < 10) lcd.print('0');
    lcd.print(GPS.minute, DEC); lcd.print(':');
    if (GPS.seconds < 10) lcd.print('0');
    lcd.print(GPS.seconds, DEC);
    lcd.setCursor(5,1);
    if (GPS.day < 10) lcd.print('0');
    lcd.print(GPS.day, DEC); lcd.print('.');
    if (GPS.month < 10) lcd.print('0');
    lcd.print(GPS.month, DEC); lcd.print('.');
    lcd.print(GPS.year, DEC);
    if (GPS.fix) {
      Serial.print("Location: ");
      Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
      Serial.print(", "); Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
      Serial.print("Speed (knots): "); Serial.println(GPS.speed);
      Serial.print("Angle: "); Serial.println(GPS.angle);
      Serial.print("Altitude: "); Serial.println(GPS.altitude);
      Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
      lcd.setCursor(0,2);
      float speed = (GPS.speed) * 1.852;
      lcd.print(speed);
      if (speed <= 1) lcd.print(" Windstille");
      else if (speed <= 9) lcd.print(" leiser Zug");
      else if (speed <= 46) lcd.print(" Brise");
      else if (speed <= 56) lcd.print(" starker Wind");
      else if (speed <= 74) lcd.print(" stuerm. Wind");
      else if (speed <= 83) lcd.print(" Sturm");
      else if (speed <= 102) lcd.print(" schwerer Sturm");
      else if (speed > 102) lcd.print(" Orkan");
      else lcd.print(" ohne Bewertung");
      lcd.setCursor(0,3);
      lcd.print("Hoehe: "); lcd.print(GPS.altitude);
    }
  }
}

Proceso de manufactura

  1. Controlador de guante DIY de bajo coste y coche de hélice – Construya su propio controlador manual Arduino
  2. Proyecto Sensor DHT11 Temperatura y Humedad con Indicadores LED y Altavoz Piezo
  3. Registrador GPS con Análisis Espacial en Azure IoT Hub
  4. Registrador de Temperatura y Humedad con Arduino, DHT11 y Ethernet Shield
  5. Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
  6. Reloj analógico por persistencia de visión (POV) con Arduino Nano – Proyecto DIY
  7. Celebra con Luz y Sonido: Proyecto Arduino de Cumpleaños DIY
  8. Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
  9. Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
  10. Tacómetro Arduino de Alta Velocidad – Algoritmo "Single-Shot" para RPM Preciso
  11. Púa de Velocidad y Pedal Stomp para Guitarra DIY – Construye tu Propia Púa Motorizada Impresa en 3D