Arduino-based Stratum-1 NTP Server

Open Source Hardware Engineering

Photo of Load Cell Shield
Assembled NTP server (click image for larger photo)

The Stratum-Ten NTP Server

You can build a highly accurate NTP server using an Arduino Mega, Etherenet shield and an inexpensive GPS receiver module. This is a stratum-1 server -- meaning that it obtains time directly from a hardware reference clock. The word Ten in the project name is a reference to the disciplined 10MHz reference clock produced by a GPS receiver.

The server supports a unique use of NTP's symmetric peer mode which transmits hardware timestamps in NTP packets. This can result in timestamp accuracies as good as 100ns. This is probably one to two orders of magnitude better than synchronization accuracies possible with Linux nano-kernels connected to the server on a quiet private network.

This is an advanced Arduino project and does require some modification of the Arduino boards. Two different GPS reference receivers are supported; the photo above depicts one of them -- the Trimble ICM SMT 360 timing receiver. This particular variant is easier to build using a custom PCB as shown in the photograph. The PCB uses 0603-sized SMT components and can be hand-assembled with a fine-tipped soldering iron and head-mounted magnifiers.

A complete project package can be downloaded here. This is a zip file containing the following documents:

The PDF report explains the design and construction of NTP server hardware and firmware (sketch). Test results and a discussion of expected performance are also included.

The download package was updated in August of 2016 to point out a possible one-second ambiguity in the time reported by the Advanced Variant. Users should compare the NTP server's time against one or more public servers. If there is an error of an exact multiple of one second either way it may be fixed as described in the section entitled "Unresolved Issues" in the PDF report. This update also adds a short user guide to the PDF document and upgrades firmware (the Arduino sketch) to provide more information on the status LEDs. The original version (from March, 2016) is still available, here.

HTML Validated
CSS Validated