WSLでシリアルポートやGPSを使う

前書き

 2019年11月3日にGPSロールオーバーが発生しました。これにより、一部のGPSレシーバで正常な日付時刻が出力されなくなってしまう事象が発生します*1
 Panasonic Let's noteのLTEモデルを使用しているのですが、LTEモデルには実はGPSレシーバも搭載されています。最近Panasonicのドライバダウンロードのページにアクセスしたところ、Let's noteに搭載されたSIERRA WIRELESSのモジュールもGPSロールオーバーの影響を受けるということを知りました。詳細は以下のページに記されていますが、ざっくりとSX3, NX3, AX3など**3シリーズ以降のモデルはアップデート対応が可能で、SX2, NX2, AX2など**2シリーズ以前のモデルはアップデート不可で誤った日付時刻が出力されるようです。
2019年11月3日に発生する弊社製パソコンにおけるGPS週数ロールオーバー対応について | パソコン(法人向け) | Panasonic
 幸い私の使用しているモデルはアップデート可能なのでアップデートしたのですが、Windows環境でGPS機能を使っていなかったので、正しい日付時刻が出力されるようになったのか確認できません。
 COMポートを変えながらArduino IDEのシリアルモニタで確認してみると、どうやらCOM6にGPSレシーバが接続されているようで、NMEAフォーマットと思しきテキストデータが出力されるのが確認できました。個人的にRaspberryPi ZERO WHにGPSモジュールを接続して、NTPサーバーを作ってみたりした経験があるので、Linux環境でGPSを取り扱う方が馴染みがあるので、シリアル接続されたGPSモジュールから出力されるNMEAフォーマットから日付時刻をデコードするのにWSLが使えないか試してみることにしました。
 

 以下、WSLで使用しているLinuxはUbuntu18.04を前提としています。

WSLのシリアルポート

 Windows環境でCOMxとして認識されているシリアルポートは、/dev/ttySxとして認識されるようです。
 例としてCOM6の場合は、下表のとおりです。

Windows Ubuntu 18.04 (using WSL)
COM6 /dev/ttyS6

 権限を確認してみると、デフォルトでは以下のようにrootがownerでdialoutグループとなっており、それぞれに読み書きの権限が付与されています。

$ ls -l /dev/ttyS6
crw-rw---- 1 root dialout 4, 70 Dec 11 18:52 /dev/ttyS6

 WSLの初期セットアップ時に作成したLinuxユーザーもデフォルトでdialoutグループに属していますので、chmodやsudoなど特に何もしなくてもシリアルポートにアクセス可能です。

$ groups
adm dialout cdrom floppy sudo audio dip video plugdev lxd netdev

 というわけで、WSLでシリアルポートを使うには/dev/ttySxにアクセスすればよいわけです。
 

gpsmonを使う

 Ubuntuにはデフォルトではインストールされていませんが、コンソールで使えるgpsmonというGPSモニタがあります。これを使うとNMEAをデコードして人が読めるフォーマットで表示することが可能です。GPSを司るデーモンのgpsdのパッケージを導入すると利用可能になるので、以下のコマンドでインストールします*2

$ sudo apt install gpsd gpsd-clients

 インストール後、以下のようにGPSレシーバが接続されたシリアルポートを指定してgpsmonを起動します。

$ gpsmon /dev/ttyS6

 GPSが受信できていれば、以下のように現在時刻や緯度経度、補足している衛星情報などが表示されます。
gpsmon (using WSL)
 正しい日付時刻が表示されているので、Let's noteのSIERRA WIRELESSのLTEモジュールのGPSレシーバーは正常にアップデートされたことが確認できます。
 

蛇足

 このLet's noteにはSIERRA WIRELESSのEM7330というLTEモジュールが搭載されています。このLTEモジュールに搭載されたGPSレシーバの出力から確認できたNMEAセンテンスはGPRMC, GPGSV, GLGSV, GNGNS, GPVTG, GPGSA, GNGSA, GPGGA, PQXFIとなっています。
 GPで始まるセンテンスはアメリカのGPS情報ですが、GNで始まるのはロシアのGLONASSによる情報です。またPQXFIというのはProprietary Qualcomm eXtended Fix Informationとのことで、そのデータフォーマットは公表されていないようですが、Qualcomm社による独自拡張情報が出力されているようです(QualcommってGPSレシーバー製造してたっけ?と思い検索してみると、SiRF StarシリーズのGPSレシーバチップを製造していたアメリカのSiRF Technology社を2009年に買収したイギリスのCSR社を、2015年にQualcommが買収していたようです)。
 というわけで、SIERRA WIRELESSのEM7330に搭載されているGPSチップは2015年以降のSiRF Starシリーズと思われます。また、GPS以外にもGLONASSにも対応していることが判ります。一方で、数時間放置しても、みちびきのPRNは表れなかったので、残念ながら日本のQZSSには非対応のようです。
 



以上。

*1:週番号のロールオーバーに合わせて、日付時刻算出時に加算すべき初期値も変えないと過去に戻ってしまう。

*2:gpsmonの利用に際してgpsdが動作している必要はありません。