月別アーカイブ: 2018年11月

GPSモジュールについて

ラズパイを用いた自作GPS端末を製作するにあたり、購入したGPSモジュールについて、紹介していこうと思う。

購入したのは以下の2つ。

(1)GPS受信機キット[AE-GYSFDMAXB](1PPS出力付き「みちびき」3機受信対応)・・・¥2,100。秋月電子通商にて購入。

<主なスペック>

  • 受信(トラッキング)感度:-164dBm
  • 測位確度(緯経度の水平位置):2m(-135dBm時)
  • 電源電圧:DC5V(電源電流:40mA)
  • 入出力信号レベル:3.3V(CMOSレベル)
  • 出力データ更新レート:毎秒1回(デフォルト。毎秒1~10回出力可)
  • サイズ:30x30x13.5 mm(電池ボックス実装時)
  • 重量:11g(バックアップ電池装着時)

(2)ADAFRUIT GPSモジュール[ID:746]・・・¥2,649。Amazonで購入。

<主なスペック>

  • ウォーム/コールドスタート 34秒
  • 受信(トラッキング)感度: -165dBm
  • 更新レート 最大10Hz
  • 電源電圧 3.0〜5.5VDC (最大電流 20mA)
  • 寸法:25.5x35x6.5(うち、アンテナ部:15x15x4)[mm]
  • 重量 8.5g

当初は、(1)で進める予定であったが、GPS端末用に用意したケースに固定して、バッテリやラズパイなどの必要なパーツを稼動可能な状態で、とりあえずケースに押し込み、公園に行って、ラズパイのシリアルポートからのデータをシリアルコンソールプログラム(cu)で画面に出力させてみたところ、いつまでたってもGPSから正しくデータを受信することができなかった!(30分程度放置したり、向きを変えたりするものの、自宅内で動作させたときと同様な出力状況であった)

当時、原因として、GPSモジュールに対して、半田付けやケースに固定する際に物理的に無理をさせてしまったのが原因で壊れてしまったのでは?と思い、

後日、あらたに(2)のGPSモジュールを購入して、今度はノートパソコン(Debian)に前回とほぼ同様の構成で接続して動作確認してみたところ、正しく測位されたNMEAデータが出力された。

寸法も(2)のモジュールのほうが、長方形型で寸法形状的にレイアウトしやすいことから、(2)を採用することにした。

あらためてこの(2)のモジュールを、新たに別のケースを用意。設置方法はモジュール(1)のときと同様、ケースにGPSセンサ部の四角い形状に合わせて穴を開け、ケースの内側からその窓穴からGPSセンサが空を覗けるように固定した。

下図は、(1)使用時の固定方法

側面図
上面図

この状態で、改めて動作確認をしたところ、最初はGPSデータが受信できず、20~30分ほどケースの向き(GPSセンサーの向き)を変えるなどして格闘してたところ、ようやくデータが表示された!

前回のケース固定との違いから、ケースの厚さが薄くなり、センサ部位がケース表面近くにまで露出させたことがよかったのかもしれない。

 

GPSDのインストール

以下に、GPSモジュールの利用に有効なGPSDサービスプログラムおよびGPS関連のユーティリティプログラムのパッケージインストール手順を示す。

0.準備作業として、前提となるGPSモジュールを接続してシリアルポートの信号受信を確認
1)シリアルポートのデバイスファイルの確認

 pi@raspberrypi:/boot $ ls -l /dev/* |grep serial
 lrwxrwxrwx 1 root root 5 Jan 3 00:52 /dev/serial0 -> ttyS0
 lrwxrwxrwx 1 root root 7 Jan 3 00:52 /dev/serial1 -> ttyAMA0
 pi@raspberrypi:/boot $

2)シリアルポートの設定確認

# vi /boot/cmdline.txt
 dwc_otg.lpm_enable=0 console=tty1 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo
 # vi /boot/config.txt
 enable_uart=1

3)以上から、下記コマンドを実行して、シリアルポートの信号受信を確認。

 $ sudo cat /dev/serial0
 <出力内容は省略するが、NMEAフォーマットのデータが表示されることを確認>

※NMEAフォーマットデータについては、こちらを参照のこと。

以上、GPSモジュールが接続され正しく動作し、その出力がラズパイに届いていることを確認できたら、ここから本題のGPSDの導入作業に移る。

1.GPSモジュールを接続したラズパイにて下記コマンドを実行して、gpsd及びそのクライアントパッケージをインストールする。

pi@raspberrypi:/boot $ sudo apt-get install gpsd gpsd-clients
 Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 The following extra packages will be installed:
 libgps21 python-gps
 The following NEW packages will be installed:
 gpsd gpsd-clients libgps21 python-gps
 0 upgraded, 4 newly installed, 0 to remove and 11 not upgraded.
 Need to get 524 kB of archives.
 After this operation, 1,079 kB of additional disk space will be used.
 Do you want to continue? [Y/n] Y
 Get:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libgps21 armhf 3.11-3 [208 kB]
 Get:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main gpsd armhf 3.11-3 [93.4 kB]
・・・・・・・

<一部省略>
・・・・・・・
 Setting up gpsd-clients (3.11-3) ...
 Processing triggers for libc-bin (2.19-18+deb8u10) ...
 Processing triggers for systemd (215-17+deb8u7) ...
 pi@raspberrypi:/boot $

2.インストール直後にプロセスが上がるとのことなので、確認する。

pi@raspberrypi:/boot $ ps aux|grep gps
 gpsd 2572 0.0 0.7 13924 7204 ? S<s 22:09 0:00 /usr/sbin/gpsd -N

3.これを以下の手順で停止させる。
1)サービス名の確認と停止

# systemctl --all | grep gps
 gpsd.service loaded active running GPS (Global Positioning System) Daemon
 gpsd.socket loaded active running GPS (Global Positioning System) Daemon Sockets
# service gpsd stop

2)Defaultサービスのスタートアップ無効化

root@raspberrypi:~# systemctl disable gpsd.socket
Removed symlink /etc/systemd/system/sockets.target.wants/gpsd.socket.
root@raspberrypi:~#

4.スタートアップスクリプト/etc/default/gpsdにて、下記の通り追加修正する。

USBAUTO=”true”   =>"false"に変更

DEVICES=""      =>”/dev/serial0”に変更
 GPSD_OPTIONS=""   =>"-n"に変更
 

下記の一文を追加

GPSD_SOCKET=/var/run/gpsd.sock"

5.GPSDデーモンを起動させる。(上記設定の確認も含めて)

# service gpsd start
# ps -ef|grep gps
gpsd 2671 1 3 19:54 ? 00:00:00 /usr/sbin/gpsd -N -n /dev/serial0

参考)GPSD起動中にpsコマンドでプロセスを確認すると、上記ファイル内のGPSD_OPTIONSの値に記述されていないくても、デフォルトでgpsdのオプションとして”-N”が指定されているが、これは /lib/systemd/system/gpsd.service内にて、記述されているためである。

6.gpsmonを実行して動作確認を図る。

$> sudo gpsmon

[q]<RET>で、CUI画面を終了させることができる。

7.GPSDデーモンのスタートアップ起動の有効化

$ sudo insserv -d gpsd
または
$ sudo systemctl enable gpsd
Synchronizing state for gpsd.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d gpsd defaults
Executing /usr/sbin/update-rc.d gpsd enable
Created symlink from /etc/systemd/system/sockets.target.wants/gpsd.socket to /lib/systemd/system/gpsd.socket.
$
本来なら、上記のいずれかでスタートアップが有効になるはずだが、
下記のコマンドを実施しないと、OS起動時に自動起動してくれない。
$ sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/

以上により、端末起動後、GPSDからGPSモジュールの測位データをいつでも取得できる状態となった。

以上

 

ラズパイのUSBポートの出力電流

ラズパイの初代B+, 2代目model B の USB ポートからの電源供給量はデフォルトでは、全ポート合計で500ないし 600mA までに制限されています。
しかし、ラズパイ Model B+以降からは、スペック的に全ポート合計で 1200mA(1.2A) まで出力できるよう設計され、/boot/config.txt の設定によって変更することができます。さらに、Raspberry Pi 3からはデフォルトで1.2Aとなっています。
ラズパイモデル USB ポート最大合計電源供給量
Raspberry Pi Model A 500mA
Raspberry Pi Model B 500mA
Raspberry Pi Model A+ 500mA
Raspberry Pi Model B+ 600mA
Raspberry Pi 2 Model B 600mA
Raspberry Pi 3 Model B 1200mA
Raspberry Pi 3 Model B+ 1200mA
 ※ラズパイ・ゼロの USB ポートの電力供給量が 1200mAに対応しているかは不明。

1200mA にすることで、USB機器をやたらと接続して、電力不足によって、起動できなかったり、動作が不安定になったり、リセットがかかったりしていた症状を解消してくれます。(USBポート全てに、キーボード+光学式マウス+WiFiドングル+USBメモリであれば利用可能。)
とはいえ、バスパワーのポータブルHDDは厳しいかと思われ、不足したらデータ消失のリスクが大きいので利用は避けたほうがいいかと思われます。
設定:
/boot/config.txt に以下の内容を追加します。
max_usb_current=1
最新の kernel では max_usb_current=1 だけ追加してください。
なお、古い kernel では
safe_mode_gpio=4
を追加する必要があったが、現在では追加不要。
/boot/config.txt を変更後、再起動(シャットダウン&電源ON)してください。
注) 変更後、ラズパイ本体への供給電源は、
2A 以上の電力を供給できるものに交換すること。