Raspberry Piに「みちびき」対応のGPSモジュールを接続して、高精度の位置情報と時刻を取得したいと思います。
目次
Raspberry Piに「みちびき」対応GPSモジュールを接続
使用する材料
Raspberry Pi本体
この記事の設定は、Wi-Fi内蔵のRaspberry Pi 3及びPi Zero W用の設定になります。Wi-Fi無しのモデル(Pi 2、Pi Zero)はUART端子の設定が異なりますのでご注意下さい。GPSモジュール
秋月電子通商さんの『GPS受信機キット 1PPS出力付き 「みちびき」対応』を使用させて頂きました。基板へ部品実装済みですが、コネクタと電池ボックスをハンダ付けする必要がありました。
※18.3.29追記:2018年11月以降予定の4機のみちびき正式運用に対応した、新しいGPS受信機キットが発売されるようです(4機すべてに対応かどうかは未確認です)。詳細は秋月電子通商さんのページを御覧ください。既存のGPSモジュールも、ファームウェアアップデートで対応して頂けるのでしょうか?
ケーブル
配線は、ジャンパーワイヤーのメス-メスを使用しました。配線図
GPSモジュールの信号線は3.3Vですが、Raspberry PiのGPIOも3.3Vですので、そのまま接続すればOKのようです。図のように、GPSモジュールをUART端子に接続しました。
1PPS端子をGPIO18に接続することで、シンプルな一直線な配線で済みました。
ジャンパーワイヤーの色は抵抗値のカラーコードになっています。茶色が1、赤が2、緑が5になりますので、その順番で配線した感じです。端子の親和性が高いおかげで配線がシンプルになりました。ありがたいですね。
時刻・位置情報の受信設定
OSはRaspbianのStretch版を使用しました。Raspbianの設定はこちらの情報を参考にさせて頂きましたが、gpsdでppsを読み込む設定など、いくつか工夫を織り込ませて頂きました。
コンソールをserial0からtty1へ変更
UARTを使用する都合から。まずは、シリアルコンソールを無効にします。
- /boot/cmdline.txtを編集し、既存のdwc_ort.lpm_enableをコメントアウトして、コンソールをserial0からtty1に変更します。
sudo nano /boot/cmdline.txt
#dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=2924e30a-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
- systemdの設定を変更し、シリアルコンソールを無効化します。
Pi 3, Pi Zero W:sudo systemctl stop serial-getty@ttyS0.service sudo systemctl disable serial-getty@ttyS0.service
- /boot/config.txtを編集し、UARTを有効にします。
sudo nano /boot/config.txt
次の1行を追加します。
enable_uart=1
タイムパルスの受信設定
Raspberry PiのGPIO端子に1PPS出力の配線を行いました。タイムパルスを受信できるように設定しましょう。
- /boot/config.txtを編集し、dtoverlay行を追加します。
sudo nano /boot/config.txt
次の1行を追加します。
dtoverlay=pps-gpio,gpiopin=18
※20.7.5追記:「,assert_falling_edge=true」付きが正しいとのご指摘を頂きましたため追記致します。
dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true
- /etc/modulesを編集し、pps-gpioを追加します。
sudo nano /etc/modules
次の1行を追加します。
pps-gpio
- 再起動すると、pps-gpioモジュールが読み込まれ、1PPS信号を受信することができます。
sudo reboot
GPS関連ツールのインストール
- gpsdとpps-toolsをインストールします。
sudo apt-get install gpsd gpsd-clients pps-tools
gpsd設定
- /etc/default/gpsdを編集し、gpsdの接続デバイスとオプションを設定します。GPSモジュールにバッテリーを接続、ポーリングは行わないため、-nオプションを有効にしました。
sudo nano /etc/default/gpsd
Pi 3, Pi Zero W:
START_DAEMON="true" DEVICES="/dev/ttyS0 /dev/pps0" GPSD_OPTIONS="-n"
- systemdの設定を変更し、gpsd.socketを有効にします。
sudo systemctl enable gpsd.socket
- 再起動すると/dev/ttyS0と/dev/pps0をターゲットデバイスとしてgpsdが起動します。
sudo reboot
GPS信号の受信確認
- 窓際など、空が直接見える位置へ、GPSモジュールを水平に(アンテナ部が天頂を向くように)配置します。
- 1PPS信号は1秒おきに出力されるようです。ppstestを実行すると、1秒おきに受信したPPS情報が表示されます。
sudo ppstest /dev/pps0
- gpsmonを起動します。位置情報が表示されるかどうか、1PPS信号を受信できているか確認します。
gpsmon
以上で、Raspberry PiにGPSモジュールを接続し、時刻・位置情報と、1PPS情報を受信できるかどうか確認が完了しました。
受信したGPS情報は、時刻同期サーバやGPSロガー等に活用することができます。
まあ、とりあえず配線と下準備が終わりましたということで・・・・活用方法は、別の記事でご紹介できればと考えています。
ではまたお会い致しましょう!
コメント
始めまして!
私も昔購入してお蔵入りに成っていた、Raspberry Pi B+で宅内LANのGPS NTPサーバーが作れないかと調査していて貴殿の記事を拝見させて頂きました。
貴殿のお使いの「GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応」
ユニットも昔購入して今回ファームアップしていますが以下の理由から採用に踏み切れません。
「理由」
1.PPSがキットの基板に実装されているインバータでパルス極性が反転し、通常のパルスと極性が逆の100mS負パルスとなり100mSecの遅延が考えられる。(PPS受信のドライ設定でパルスの立下りタイミングに変更が可能でしょうか?)
2.私の環境が屋根にソーラーパネルが乗っかっておりGPS受信機をケーブルで延長したく防滴型のユニットを採用したい。(http://akizukidenshi.com/catalog/g/gM-12905/)
出力データ形式がNMEA0183V3.01準拠とNMEA0183V4.0準拠とバージョンが異なるようですが設定などの変更が必要でしょうか?
tankimonoさん
はじめまして。コメント頂きまして誠にありがとうございます
> 1.PPSがキットの基板に実装されているインバータでパルス極性が反転し、通常のパルスと極性が逆の100mS負パルスとなり100mSecの遅延が考えられる。(PPS受信のドライ設定でパルスの立下りタイミングに変更が可能でしょうか?)
PPS信号の極性について、そのあたりの情報は全く存じ上げませんでした。ふむふむふむ。
記事では、Raspbianのpps-gpioカーネルモジュールでpps信号を読み取り、/dev/pps0デバイスとしてアクセスしております。
想像で恐縮ですが、たとえばpps-gpioのオプション指定のようなもので、仰るようなタイミング変更が可能なら良いのですが・・・pps-gpio.c(ソースコード)あたりから、何か情報を読み取れれば良いのですが。申し訳ありませんが、私には難しそうです。orz
> 2.私の環境が屋根にソーラーパネルが乗っかっておりGPS受信機をケーブルで延長したく防滴型のユニットを採用したい。(http://akizukidenshi.com/catalog/g/gM-12905/)
> 出力データ形式がNMEA0183V3.01準拠とNMEA0183V4.0準拠とバージョンが異なるようですが設定などの変更が必要でしょうか?
tankimonoさんにご紹介頂いたGPSモジュールは、みちびき3機に対応しつつ、アンテナの延長も可能、設置しやすくて大変良さそうですね。ふむふむ。
恐らくですが、NMEAの信号は、gpsdとntpdのソフトウェアでプロトコル解析(時刻や位置情報の取り出し)されるのかと思います。
gpsdのオプションを拝見したところ、NMEA関係のオプションは、ダンプする/しない等、NMEAバージョンに関係しないもののようです。
gpsd, ntpdともに、NMEA信号に含まれるバージョンを読み取って、自動的に切り替えて動作するかと思います。
NMEAバージョンが異なっても、特に何か設定変更を行う必要は無さそうですが・・・いかがでしょうか?
負パルスのGPS受信機を接続して検証してみました。
http://hirai.ddns.net/phpbb3/viewtopic.php?f=4&t=725&p=795&sid=f7ba8d07097c315e9edc7dc58f8b02e6#p795
PPSパルスドライバーやNTSサーバーでパルスエッジの立ち上がりや立下りの選択があるなら問題は解消されますが今のところ確認は出来ておらずデフォルトの正極性パルスの立ち上がりエッジでの動作しか行えていません。
ソフトの設定が出来ておらず見やすく観測は出来ませんでしたが、この様に負パルスのGPS受信機を接続すると75~100mSec程度遅延オフセットしており、
又数十mSecのジッタが発生している様です。
このジッタの主原因はPPSパルスの負パルス幅がGPS精度を有しておらずパルス幅がCR定数?で変動しているように思われます。
hide さん
早速のご返事ありがとう御座います。
実は私の本名も秀幸で同じですね!
私も昨日からhideさんの記事を参考に年寄りの手習いで接続テストを始めたが上手く動作しませんでした。
結果を私のブログに記載を始めています。
無断ですが此処のサイトの説明(画像)にリンクを張っていますが支障があれば仰ってください削除します。
何しろ痴呆症状が出始め視力の衰えた年寄りでトラブル続きです。
最終的にはGPS時計精度の宅内NTPサーバー運用なのですが上手くいけるか不安でご返事を記載しました。
はじめまして。tankimonoさんが指摘されているPPSパルスのエッジは
http://www.seekers.jp/?p=122
によりますと、以下引用
/boot/config.txt に以下を追記
enable_uart=1
dtoverlay=pps-gpio,gpiopin=18,assert_falling_edge=true
ここまで引用。
上記で指定できます。私の手持ちのRaspberry Pi Zero WとAE-GYSFDMAXBで動作しました。
ZeroWを使いRaspbianのbusterでここを参考にやってみたのですがgpsmon(もしくはcgps)でのチェックまでは進めるのですがGPSから何もデータを受け取れず(辛うじてPPS情報だけは取得できます)位置情報が確認できません。
そこでStretch Liteの最新版でやってみたのですが今度は
sudo systemctl enable gpsd.socket
の部分で「Failed to enable unit: File gpsd.socket: No such file or directory」が発生してしまい先に進めません。
ツール関係のインストールログを見たところ、404ばかりでインストールできていないように見えます。 もしかして今ではもうここの方法では無理なのでしょうか…?
busterの方で受信できました。
うっかりbluetoothモジュールを切り替えてそれと干渉してたのが原因でした
andoさんはじめまして。
コメント頂きましてありがとうございます。
なるほどbluettothモジュールの干渉ですか、ふむふむ。
ZeroWでGPSモジュールのデータを無事受け取れたということで、おめでとうございます!!
andoさんの目的が達せられますように、陰なら応援させて頂きます。
2021年に申し訳ないのですが、この記事の通り設定をしましたがpps信号は受信できるもののgpsmon及びcgpsでのgps情報の受信が全くできません。
no fixが表示されて手詰まりです。
半日ほどネットの海で様々な解決例を探しましたがどれも決定打にはなりませんでした。
ppsが受信できているのでシリアル通信ができていないということはないと思うのですが何か解決法ご存知でしたらご教授いただければと思います。
okzさん はじめまして。
コメント頂きまして、誠にありがとうございます。
返信が遅れまして申し訳ありません。
no fixとのお話で。ふむふむ。
何点か整理させて頂きます。
GPSモジュールは、衛星と同期している状態でしょうか?
衛星と同期していますと、赤いLEDが1秒おきに点滅します。
これは、ラズパイと通信できていなくても、衛星の電波が、受信できていれば、電源を入れて数分〜数十分で同期します。
同期していない場合、no fixを返す場合があるようです。
次に、PPSですが、PPSはシリアル端子ではなく、GPIO端子で受信しています。たしか18番ピンです。
このため、もしかすると、シリアル通信ができていない可能性があるかもしれません。
物理的な接続、断線・接触不良の可能性を疑ってみたり、通信速度・パリティ設定の不整合があるかもしれません。
記事では触れていませんが、GPSモジュールのデフォルトの通信速度9600bps、パリティ、フロー制御設定が、ラズパイのデフォルトと同じ前提になっています。
GPSモジュール側か、ラズパイ側の設定を変えてしまうと、不整合が発生してしまい、うまく通信できなくなってしまいます。
GPSモジュール側の設定方法は、取扱説明書に記載されていますので、宜しければ確認してみて下さい。
大変参考になる記事で助かります。
一連の設定をしたあと何故かwifiに繋がらなくなりDHCPがうまく動かなくなってしまいました。
ルータ側で固定IPを割り振るよう設定したところ解決しましたので、メモ書きとしてここに残しておきます。
Raspberry pi初代でGPSの信号を受信できず試行錯誤しておりましたので情報共有です。
・/dev/ttyS0ではなく、RasPi第2世代まではシリアルデバイスは/dev/ttyAMA0となること。
・記載の配線図は、TXDがRXDピンに、RXDがTXDピンに刺さっているように見受けられます。これを逆にしたところgpsmon及びcgpsでのgps情報の受信ができるようになりました。
はじめまして。
コメント失礼します。
先程まで1秒おきに赤いLEDが点滅していましたが、GPSモジュールを抜き差しして再度電源を入れたら点滅しなくなりました。
sudo ppstest /dev/pps0を実行しても最初の4行くらい表示されるだけでそこから何も表示されなくなりました。なぜだかわかりますか?
konさんはじめまして。コメント頂き、ありがとうございます。
赤いLEDが点滅している状態は、GPS衛星 3基以上と同期できている状態だと思います。
3基以上の衛星と同時に同期するためには、アンテナから衛星の間に障害物が無く、天気が良い状態である必要があります。
gps 3d-fixで検索して頂くと関連情報が得られると思います。
経験的にですが、天気が悪かったり、視界が悪い場所にGPSモジュールを配置した影響で、何日間も同期しなかった場合もあります。
そのあたりをご考慮頂いて、状態の良い場所にアンテナを配置してみてください!
お返事ありがとうございます。
窓から3mくらい離れた机に置いているのですが、天気も関係するんですね。
天気のいい日に試してみようと思います。