GNSS受信機(ZED-F9PとHD9310)の遠隔リセット方法

categories: gnss
tags: f9p hd9310 rtklib

u-blox ZED-F9P受信機や、Allystar HD9310(TAU1302)受信機にて長期間、リモート観測をおこなっていると、特定のメッセージ(例えば、疑似距離)が出力されなくなることがあります。

このようなときには、接続しているマイコンごと再起動すると、直ることが多いです。しかしながら、このようなときには、GNSS受信チップにリセットコマンドを送っても、直ることがあります。u-bloxチップセットならば、専用ソフトウェアu-centerでチップセットにリセットコマンドを送信しても良いのですが、ここでは、Pythonコードにてリセットコマンドを送信します。

これらの受信機をマイコンRaspberry Pi 3のUSBポートに接続して、さらにRTKLIBのCUIアプリケーションstr2strの双方向オプション-bにて遠隔操作できるようにしていることを前提にしています。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Reference Documents:
#   R1: u-blox F9P HPG 1.30 Interface Description
#   R2: Allystar GNSS Receiver Protocol Specification V2.3

import socket
import sys

host = 'マイコンRaspberry Piのホスト名またはIPアドレス'

def send_cmd(port, preamble, command, payload):
    pllen = len(payload).to_bytes(2, 'little') # payload length in bytes
    csum1, csum2 = rtk_checksum (command + pllen + payload)
    csum = csum1.to_bytes(1, 'little') + csum2.to_bytes(1, 'little')
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.send(preamble + command + pllen + payload + csum)

def rtk_checksum(payload):
    checksum1 = 0
    checksum2 = 0
    for b in payload:
        checksum1 += b
        checksum2 += checksum1
        checksum1 &= 0xff
        checksum2 &= 0xff
    return checksum1, checksum2

if __name__ == '__main__':
    if sys.argv[1] == 'f9p':
        port = F9Pが接続されているマイコンのポート番号
        preamble = b'\xb5\x62' # preamble 0xb5 0x62, ref R1, p.53
        command  = b'\x06\x04' # UBX-CFG-RST, ref R1, p.86
        payload  = b'\x00\x00' # hot start
        payload += b'\x00'     # hardware reset immediately
        payload += b'\x00'     # reserved
        print ('warning: you may need restarting str2str')
    elif sys.argv[1] == 'hd9310':
        port = HD9310が接続されているマイコンのポート番号
        preamble = b'\xf1\xd9' # preamble, ref R2, p.21
        command = b'\x06\x40'  # CFG-SIMPLERST, ref R2, p.56
        payload = b'\x01'      # reset
    else:
        print ('Err: arg should be either f9p or hd9310')
        sys.exit()

    send_cmd(port, preamble, command, payload)

# EOF

このコードを、例えばgnss_reset.pyなどのファイル名にて保存し、chmod 755 gnss_reset.pyにて実行属性をつけます。

そして、./gnss_reset.py f9p、または./gnss_reset.py hd9310を実行すれば、受信機を遠隔リセットできます。

u-blox受信機も、Allystar受信機も、ともにプリアンブル、コマンド、データ、チェックサムの受信に送信することになっていて、両者ともに同様のチェックサム作成方法を用いていますので、コードを共通化できます。u-blox受信機の場合、リセット後にマイコンで実行しているstr2strを再起動する必要があるようです。