DesignSpark Electrical Logolinkedin

GPS電波をRaspberry Piで読み取り、時間と位置把握する

Raspberry PiにGPSレシーバを搭載すいると、位置情報と性格な時間を把握できるようになります。車等の移動体の機器で位置情報を表示させたり、厳密な時間同期が必要なシステムに大変便利です。

 Adafruit Ultimate GPS HATを使えば、Raspberry PiへのGPS機能を簡単に搭載できます。さらにRTC情報を保存しておき、Raspberry Pi電源オフ時でも時間を保持しておくことが可能です。

 この例では、Raspberry Pi 3 Model B (896-8660)及びAdafruit Ultimate GPS HAT (124-5481)Phoenix Contact (122-4298)のDINレール対応ケースに収納しますが、Raspberry PiとGPS HATの両方を収納できるのであれば、どのようなケースでも構いません。

組み立て

GPS Hatの組み立て作業は、スルーホールヘッダのはんだ付けのみです。その後HATをRaspberry PiのP1ヘッダに接続します。

 

ケース底側の左上隅には穴が開いており、メスSMA-オスU.FLケーブル(794-2897)を取り付けられるようになっています。GPSモジュールにはアンテナが内蔵されていますが、空が十分に見えない場所やレシーバが金属製のケースに納められる場合には、外付けアンテナが必要です。

U.FLケーブルが、HATと組み立て済みのケースに接続されている状態です。

テストでは、RF SolutionsのGPSアンテナをウィンドウに配置しました。

 

OSの構成

Linuxの完全版は必要ありません。「lite」バージョンのRaspbian Jessieで十分です。以下のコマンドで、Micro SDカード(121-3897)にOSを書き込みます。

$ sudo dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/mmcblk0 bs=4M

入力ファイル名(if)パラメータは、Raspbian Liteのバージョンによって異なります。同様に、出力ファイル(of)パラメータも、使用されるLinuxのディストリビューション及びSDカードハードウェアによって異なることがあります。Windowsのユーザーは、通常のユーティリティを使用してOSをMicro SDカードに書き出すことができます。

 

画面なしで操作する場合、私はSSHでRaspberry Piプロジェクトの作業をする方が好きです。これは現在デフォルトでは無効になっていますが、カードのブートパーティションに「ssh」という空のファイルを作成すれば再度有効にできます。これは、別のマシンにカードを挿入して行うことも、又は使用しているRaspberry Piにカードを挿入して実行することもできます。キーボードとモニタを接続した状態で通常通りに起動し、コマンドプロンプトで次を入力します。

sudo touch /boot/ssh

リブート後、SSHでログインできるようになります。Raspberry Piは、ブート時にsshファイルを検索します。このファイルが見つかるとsshが有効になります。

Raspberry Pi 3では、デフォルトで、BluetoothにハードウェアUART (シリアルポート)が使用され、一般的な用途にパフォーマンスの低いソフトウェアシリアルポート(mini-UART)が使用されます。今回、Bluetoothは必要ないためこれを交換しますが、先にraspi-configを実行してシリアルを無効にします。

$ sudo raspi-config

「P5 Interfacing Options」を「P6 Serial (disable)」にします。

これは、ブートメッセージがシリアルポートに送信されないようにし、ログインサービスが有効にならないようにするためです。

次に、/boot/config.txtを編集して以下の行を追加し、UARTを有効にして、mini-UARTBluetoothで使用されるようにします。

enable_uart=1

dtoverlay=pi3-miniuart-bt

リブート後、以下を使用し、/dev/serial0がハードウェアUART (AMA0)を指定しており、serial1がソフトウェアUART (S0)を指定していることを確認します。

pi@ntpi:~ $ ls -l /dev/ser*

初期テスト

テストでは、Adafruitの説明書に従いました。最初にsttyを実行して構成の設定をしなくても、シリアルポートからデバッグ出力を得られることに気付きました。その一方、指定されたオプションを設定するために実行した場合にはそうではありませんでした。早い話、GPSモジュールからデータを得られているかをテストするには、次を使用します。

$ cat /dev/ttyAMA0

すべて順調に行けば、上記のスクリーンショットのような出力が得られるはずです。多くのコンマと空のフィールドが表示される場合には、GPSの修正がなされていないことを示します。

また、Adafruit説明書が書かれた時点では、Ultimate GPS HatにはRaspberry Pi 3との互換性がないとされていましたが、上述のとおり、UART構成で解決しました。

この時点では、アプリケーションはGPSレシーバから出力されるデータを直接使用できます。この出力は標準の「NMEAセンテンス」としてフォーマットされたテキストに過ぎません。Python用のpynmeaなど、出力の解釈を容易にするライブラリもあります。

gpsd

gpsdは、次のように説明されています。「シリアル又はUSBポートを介してホストコンピュータに接続された1つ又は複数のGPS又はAISレシーバを監視するサービスデーモンで、センサの場所/針路/速度に関するすべての情報を、ホストコンピュータのTCPポート2947でクエリできるようにするもの。

gpsdを使用すると、複数の場所を検知するクライアントアプリケーションが競合したりデータを損失したりすることなく、サポートされているセンサへのアクセスを共有できる。また、gpsdは、大半のGPSのNMEA 0183出力よりも解析が非常に簡単なフォーマットでクエリに返答する」

gpsdを使用することで、GPSデータがネットワーク中のアプリケーションで使用できるようになり、基底ハードウェアをシンプルに抽象化できます。gpsdは、GPSナビゲーションやワイヤレスネットワーク検知/マッピングソフトウェアなど、さまざまなアプリケーションによってサポートされています。

gpsdは、次を実行してインストールできます。

$ sudo apt-get update

$ sudo apt-get install gpsd gpsd-clients python-gps

構成するには、/etc/default/gpsdを編集し、USBAUTO、DEVICES、GPSD_OPTIONS行を以下のように変更します。

USBAUTO="false"

DEVICES="/dev/ttyAMA0"

GPSD_OPTIONS="-n"

ブート時に起動できるようにするには、次を実行して、Raspbian Jessieで修正を行う必要があります。

$ sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/

次を使って起動します。

$ sudo service gpsd start

次を使ってテストを実行します。

$ gpsmon

この結果、端末ベースのアプリケーションが起動し、上記の画像のような出力が表示されます。

この時点で、gpsdをサポートしている既存のアプリケーションでGPSレシーバを使用できます。あるいは、このシンプルなインターフェイスを使用する新しいアプリケーションを開発することもできます。

pps

このGPS HATが優れている点の1つは、NMEAデータを提供するだけでなく、秒ごとのパルス(PPS)信号をGPSから提供することです。NMEAセンテンス出力から時間を抽出できるのに、なぜこれが便利なのでしょうか?ASCIIテキストは情報を伝達するために設計されているため、非効率的な方法で、しかもこの場合、比較的低速なシリアルポートから送信されており、オペレーティングシステム遅延も発生します。

便利なことに、GPSモジュールによって生成されたPPS信号は、Raspberry Pi GPIOを介してサンプリングすることができ、Linuxカーネルは/dev/pps0デバイスでのアクセスをサポートしています。このことは、アプリケーションは、NMEAデータとPPS信号を併用することで、使用している機器のコストを考えると、驚くほど高い精度の時間データを取得することができることを意味します。

 

PPSにアクセスするには、次を入力してpps-toolsソフトウェアをインストールする必要があります。

$ sudo apt-get install pps-tools

次のラインを/boot/config.txtに追加して、Linuxカーネルを適切に構成します。

dtoverlay=pps-gpio,gpiopin=4

リブート後、次を入力してテストします。

$ sudo ppstest /dev/pps0

前出の画像のような出力が表示されます。

NTPサーバ

NTPは、Network Time Foundationによって開発されました

GPS対応のRaspberry Piの非常に便利な用途の1つは、Network Time Protocol (NTP)を使用してLANクライアントに時間を配信するサーバーを作成することです。これに使用されるntpdソフトウェアは非常に柔軟で、接続が可能な状態であれば、インターネット上の「ピア」NTPサーバから時間を取得できます。さらに、気の利いた調節可能なアルゴリズムを使用して、使用可能なソースの中で最適な時間のソースを選択し、NMEAやPPSを介してGPSから時間を取得できます。

NTPは、それ自体がまったく別のトピックであり、特定の用途ごとに構成を行う必要があります。しかし、David Taylor氏のWebサイトに数多くの有用な情報が公開されていますので参考にしてください。

NTPを使用する場合には、以下を考慮する必要があります。

  • Raspbian提供のNTPソフトウェアは、ソースからのビルドに交換する必要がある(これはシンプル)
  • ntpdは時間情報をGPSモジュールから直接取得(/dev/ttyAMA0を介して)、又はgpsdを介して取得するように構成できる
  • 最適なパフォーマンスを得るためにNTP構成を微調整する必要があり得る

まとめ

Ultimate GPS Hatを使用することで、位置と正確な時間を取得する機能をRaspberry Piベースのプロジェクトに素早く簡単に追加できます。そしてこの情報をアプリケーションやその他のネットワークデバイスで使用する方法は数限りなくあります。

 

  — Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.