Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Nauwkeurige tijdmeting: DS3231 RTC synchroniseren met GPS op Arduino Nano

Onderdelen en benodigdheden

OnderdeelAantal
Arduino Nano R31
DS3231 klokmodule1
NEO 6M GPS-module1
Bidirectionele level shifter1
LCD 16x2 display1
I2C LCD backpack1
15-polige 0.1 inch sockets2
6-polige 0.1 inch sockets2
4-polige 0.1 inch socket1
5-polige 0.1 inch socket1
4-polige 0.1 inch pin strip1
Stripboard 24 strips x 37 kolommen1
4k7 weerstanden2
Drukknop (enkelpolig momentary 6mm vierkant)1

Over dit project

Mijn DS3231 liep af. Ik probeerde het normaal te updaten door code te compileren met de systeemtijd, maar dit was onnauwkeurig omdat compileren en uploaden steeds onderbroken werd door andere processen op mijn computer.

Na ontdekking dat GPS nauwkeurige tijd (UTC) en datum geeft, besloot ik die te gebruiken om mijn DS3231 in te stellen.

Schakeling

LCD backpack naar Arduino:

  • GND - GND
  • VCC - 5V
  • SDA - SDA (A4)
  • SCL - SCL (A5)

DS3231 klokmodule naar Arduino:

  • GND - GND
  • VCC - 5V
  • SDA - SDA (A4)
  • SCL - SCL (A5)

LEVEL SHIFTER vanaf Arduino:

  • 5V - 5V
  • GND - GND
  • D3 - BUS
  • D4 - BUS

NEO 6M GPS vanaf level shifter:

  • 3V - VCC
  • GND - GND
  • BUS - TXD (eindigt op D3)
  • BUS - RXD (eindigt op D4)

SCHAKELAAR CONTACTEN:

  • SCHAKEL - D9
  • SCHAKEL - GND

Voeding

Ik voed mijn schakeling via de USB-kabel.

Software

99% van de software is het parsing.ino-voorbeeld uit de Adafruit GPS-bibliotheek. Ik voegde een klein beetje code toe om de uitgepakte GPS-datum en -tijd door te geven aan de DS3231 en wat extra code om de tijd van de DS3231 op een LCD-display weer te geven.

Gebruikte bibliotheken

  • Adafruit GPS Library door Adafruit versie 1.0.3
  • RTClib door Adafruit versie 1.2.0
  • NewLiquidCrystal voor de I2C display backpack.

Bediening

  1. Schakel het apparaat in.
  2. De LCD toont de datum- en tijdwaarden die momenteel in de DS3231-registers staan.
  3. Wacht even tot de GPS een fix heeft.
  4. Druk op de knop om de tijd via het GPS-signaal in te stellen.
  5. De LCD toont de nieuwe tijd.

Bedieningsbeperkingen

  • De GPS-module heeft tijd nodig om een fix te krijgen en er is geen indicator dat de fix bereikt is. Het indrukken van de set-knop zonder fix resulteerde in mijn DS3231 datum ingesteld op 2000:0:0 en tijd op 0:0:0.
  • Nadat de rode LED op de GPS-module begint te knipperen, lijkt het de beste tijd om de set-knop in te drukken – dit kan 10-tallen minuten duren (binnen).
  • Initieel had de DS3231 die ik gebruikte een lege batterij; bij indrukken van set werd de datum ingesteld op 2000:0:0 en de tijd op 0:164:164. Het duurde een hele poos voordat de batterij voldoende opgeladen was om de GPS-data te accepteren en correct door te tikken.

GPS-kwalen

Het bord dat ik kocht had simpelweg "NEO 6M GPS" erop staan en de pinnen waren gemarkeerd met hun functies. Ik keek naar het datasheet [1] en dat stelde dat het apparaat op ongeveer 3V functioneert, vandaar mijn gebruik van een level shifter. Bij nader inzien vond ik een 4A2D-chip gesoldeerd op het bord; een internetzoektocht toont aan dat het een spanningsregelaar is, maar dit garandeert niet dat de communicatielijnen level-shifted zijn (mijn eenheid kwam zonder schema).

Ik heb ook online gelezen dat verschillende GPS-modules variëren in hun vermogen om binnen een goed signaal te ontvangen, vandaar mijn toevoeging van een LCD-display zodat ik het naar buiten kon nemen.

LCD-kwaliteit

Ik gebruik een van de vreemde typen met een I2C-adres van 0x3F; de meeste gebruiken 0x27. Als je niets ziet, probeer dan eerst dat adres te wijzigen.

Bibliotheek-kwaliteit

De bibliotheek RTClib (Adafruit versie 1.2.0) stelt de tijd- en datumregisters in, maar niet het dagregister van de DS3231. De bibliotheek heeft een functie om de dag van de week terug te geven, berekend op basis van de waarden in het datumregister. Ik vond dit vreemd, maar realiseerde me later dat het zinvol is: het instellen van het dagregister zou vereisen dat je code het aanpast op schrikkeljaren, terwijl het genereren van de dag via een formule dit voorkomt.

UTC & Lokale tijd

Ik deed een zoekopdracht naar UTC en ontdekte dat voor mijn lokale tijd geen wijziging nodig was. Als je het nodig hebt, moet je die code zelf toevoegen.

Referenties

[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf (geraadpleegd dec/2018)

Code

DS3231 instelcode

// Datum en tijd functies met DS3231 RTC via I2C en Wire lib
#include 
#include "RTClib.h" // Adafruit versie 1.2.0
RTC_DS3231 RTC;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int days_string_length = 12;

// Voor LCD display
#include 
// Let op het ongewone adres 0x3F, meeste LCD's gebruiken 0x27
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Voor knop
#define button 9

// Testcode voor Adafruit GPS modules met MTK3329/MTK3339 driver
#include 
#include 

SoftwareSerial mySerial(3, 2); // GPS TX->D3, RX->D2
Adafruit_GPS GPS(&mySerial);

#define GPSECHO false
boolean usingInterrupt = false;
void useInterrupt(boolean);

void setup() {
  Serial.begin(115200);
  Serial.println("Adafruit GPS library basic test!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // RMC + GGA
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update
  GPS.sendCommand(PGCMD_ANTENNA); // Antenna status
  useInterrupt(true);
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);
  
  lcd.begin(16,2);
  lcd.backlight();
  lcd.clear();
  pinMode(button, INPUT_PULLUP);
}

SIGNAL(TIMER0_COMPA_vect) {
  char c = GPS.read();
  #ifdef UDR0
  if (GPSECHO) if (c) UDR0 = c;
  #endif
}

void useInterrupt(boolean v) {
  if (v) {
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

uint32_t timer = millis();

void loop() {
  if (!usingInterrupt) {
    char c = GPS.read();
    if (GPSECHO) if (c) Serial.print(c);
  }
  
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) return;
  }
  
  if (timer > millis()) timer = millis();
  static bool second_time_round = false;
  
  // Schrijf data naar klok als knop ingedrukt
  if (!digitalRead(button)) {
    // Let op: RTClib stelt dag-van-de-week register NIET expliciet in op DS3231.
    // In plaats daarvan wordt bij dayOfTheWeek() de dag berekend op basis van datum.
    // Zondag = 0.
    RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.seconds));
    
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Pressed set");
    delay(5000);
    lcd.clear();
  }
  
  DateTime now = RTC.now();
  lcd.setCursor(4,0);
  lcd.print(now.year(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.day(), DEC);
  lcd.print(' ');
  lcd.setCursor(4,1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  lcd.print(now.second(), DEC);
  lcd.print(" ");
}

Schema's

Nauwkeurige tijdmeting: DS3231 RTC synchroniseren met GPS op Arduino Nano Nauwkeurige tijdmeting: DS3231 RTC synchroniseren met GPS op Arduino Nano

Productieproces

  1. Een Blijvende Nalatenschap Naelaten: Authentiek Leiderschap voor een Betere Toekomst
  2. SMRP Publiceert Gestandaardiseerde KPI Set voor Onderhouds- & Betrouwbaarheidsprofessionals
  3. Vlakschuiven: Traditionele Technieken voor Precisie
  4. Waarom een box-way CNC-draaibank de optimale keuze is voor precisie en prestaties
  5. Stamper Sets Ontrafeld: Een Uitgebreide Gids
  6. Lineaire geleiding CNC-draaibanken: precisie, snelheid, licht-zware productie
  7. Essentiële Gids voor het Kiezen van de Juiste Monteur Toolset
  8. Venndiagrammen Begrijpen: Visuele Relaties Tussen Verzamelingen
  9. Zetschroeven Uitgelegd: Ontwerp, Verschillen en Toepassingen
  10. Geodriehoeken uitgelegd: doel, typen en gebruik in technisch tekenen
  11. Java 10 Ontwikkelomgeving instellen: Bouwen, compileren en uitvoeren