GNSS受信機(ZED-F9PとHD9310)の遠隔リセット方法
category: gnss
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
を再起動する必要があるようです。