Nortel GPSTM

From i3Detroit
Jump to: navigation, search
Nortel GPSTM
Trimble PPS.jpg
Name Nortel GPSTM
Zone Infrastructure


Owner Nate Bezanson
Make Model Nortel GPSTM
Part Number NTBW50AA-11
Date Acquired
Storage Location Server Rack
Authorization Required No
Status Running
Value $150
IP Address 10.13.0.95
MAC Address 00:01:2e:49:5d:ba
Hostname harrison.i3detroit.local
Documentation Manuals

ntpsec

Other References


Intro

The Nortel GPSTM is a GPS disciplined, temperature controlled oscillator and time source. The current purpose is for it to provide a high accuracy, high precision time source for the space and provide a 10Mhz reference clock for the E-Room.

Rules

Instructions

Maintenance Info

FAQ

ToDo

  • Use distribution amplifier to route 10Mhz/PPS to E-Room
  • Front panel VFD wiring/software
  • Integrate with ntpsec
  • Mount antenna
  • 48-hour site survey
  • Add PPS output from marked via.
  • Rackmount case


Nortel GPSTM Nate Bezanson Zone: Infrastructure https://wiki.pumpingstationone.org/images/Authorization_not_required.svg "/> https://www.i3detroit.org/wiki/Nortel_GPSTM

PPS Discovery

Amelia Meyer and Benjamin Fedorka found inside the unit a PPS output pin, which is exciting because the native output on the unit of PP2S is unsuitable for ntpd.

After some tracing, a more-suitable location near several ground points was located at TP13.

Discussion here: https://www.febo.com/pipermail/time-nuts/2015-May/092151.html

And here's the prior work Ignacio EB4APL refers to, on a different version of the unit (NTGS50AA): https://www.febo.com/pipermail/time-nuts/2014-November/088332.html

Inside of unit, showing a handwritten callout of "PPS" near the oven, pointing to the via upon which the signal was found
Inside of unit, showing handwritten callouts: arrows indicate vias with the PPS signal including the chosen test point TP13; the arc is a pair of ground points
Inside of unit, showing added coax to bring PPS signal out to front panel and power tapped from C22 for the buffer circuit, shown at top
Schematic of the buffer circuit on the PPS signal, to protect the internal circuits
Front side of buffer circuit on the PPS signal, to protect the internal circuits
Back side of buffer circuit on the PPS signal, to protect the internal circuits
Trace of the signal, 1.00Hz with a negative pulse width of 8 μs and a nominal level of 5VDC
Trace of the PPS, PP2S, and 10MHz signals, showing a difference between pulse edges of 226ns and good alignment with the 10MHz signal
Zoomed trace showing the offset between the 1pps and the pp2s signal
Partial schematic of circuit to inject PPS into COM2 (shared with VFD)
Front side of circuit to inject PPS into COM2 (shared with VFD)
Front panel VFD showing example system status

Antenna location

23:10, 12 March 2016 (12-hours, ish): delta of 239.8mm in latlong, 502.9mm alt

Latitude
42.4538034°N
Longitude
83.1138062°W
Altitude
160.73505694 m

13:40, 27 June 2015 (48-hour site survey)

Latitude
42.4538028°N
Longitude
83.1138090°W
Altitude
161.23804233 m

NTP stratum-1 server

Hostname
harrison.i3detroit.local
IP address
10.13.0.95
Services
  • NTP on UDP port 123

LCD Front Panel

Noritake CU24063-Y100 Serial VFD cable

Attach FTDI adapter to MAX232 board to VFD CN2 (1x6 0.1" header)

PC Pin PC Function VFD Pin VFD Function
10 5VDC 1 VCC
5 TXD 2 SIN
9 GND 3 GND
6 CTS 4 SBUSY
NC NC 5 NC
NC NC 6 /RESET

Example VFD Text

Generated by the following script, depending on psutil, dateutil, and ntpsec

#!/usr/bin/env python
# ~*~ coding: utf-8 ~*~

import socket
from datetime import datetime
import dateutil.tz
import psutil
import os
import ntp.packet
import ntp.util
import ntp.ntpc
import ntp.version
import ntp.control
import ntp.magic

if __name__ == '__main__':
    # Hostname
    output = '%24s'%(socket.getfqdn())

    # ISO8601 in local time
    output +='|%24s'%(datetime.now(dateutil.tz.tzlocal()).strftime('%Y-%m-%d %H:%M:%S%z'))

    # NTP refclock statistics
    session = ntp.packet.ControlSession()
    session.debug=0
    session.logfp=None
    session.openhost('localhost')
    peers = session.readstat()
    gps = []
    pps = []
    for peer in peers:
        stats = session.readvar(peer.associd,raw=True)
        if stats['refid'][0] == 'PPS':
            pps.append(stats['delay'][1][:5])
            pps.append(stats['offset'][1][:5])
            pps.append(stats['jitter'][1][:5])
            pps = tuple(pps)
        if stats['refid'][0] == 'GPS':
            gps.append(stats['delay'][1][:5])
            gps.append(stats['offset'][1][:5])
            gps.append(stats['jitter'][1][:5])
            gps = tuple(gps)

    output +='|GPS:d% 4s o% 4s j% 4s'%gps
    output +='|PPS:d% 4s o% 4s j% 4s'%pps

    # CPU, RAM, and load average
    cpu = psutil.cpu_percent()
    ram = psutil.virtual_memory().percent
    load = os.getloadavg()[0]
    output +='|CPU%3d%% RAM%3d%% Load%3.2f'%(cpu,ram,load)

    # System temperatures
    temps = psutil.sensors_temperatures()
    sys_t = temps['acpitz'][0].current
    c0_t = temps['coretemp'][0].current
    c1_t = temps['coretemp'][1].current
    output +='|C0+%3.1fC C1+%3.1fC SY+%2dC'%(c0_t,c1_t,sys_t)
    print output.replace('|','\n')
h a r r i s o n . i 3 d e t r o i t . l o c a l
2 0 1 7 - 0 7 - 0 4 0 0 : 5 2 : 2 8 - 4 : 0 0
G P S : r 3 7 7 o 1 6 . 9 7 j 1 . 2 3 4 5
P P S : r 3 7 7 o - 4 2 . 1 2 j 1 . 2 3 4 5
C P U 7 % R A M 3 7 % L o a d 0 . 2 3
C 0 + 5 3 . 0 C C 1 + 5 6 . 0 C S Y + 4 4 C