秋月電子でGPS受信機キットを買ったので、位置情報を取得してみた1
GPS受信機キット
小型高感度GPSモジュールを使ったGPS受信機キットで、バックアップ電池の電池ボックスとピンヘッダのはんだ付けが必要 ※ バックアップ電池を使わない場合、電池ボックスは不要
配線
Raspberry Pi Zero | GPSモジュール |
---|---|
5V | 5V |
GND | GND |
RxD | TxD |
TxD | RxD |
なし | 1PPS |
とても基本的なことなんですが、RxDとTxDはクロスさせて接続します。これを間違えて、位置情報が取れず何度も設定を見直し、時間を無駄にしてしまった。。※ 上の写真は間違えた状態です
シリアルの有効化
raspi-config
sudo raspi-config
- P5 Interfacing Options
- P6 Serial
- YES
で、Finish
> ls /dev/serial* /dev/serial0
/dev/serial0があることを確認
/boot/cmdline.txt
sudo vi /boot/cmdline.txt
もとの/boot/cmdline.txt
から、console=serial0,115200
の記述を削除する
# dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=PARTUUID=b7e00398-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
リブート
sudo reboot
動作確認
pyserialのインストール
シリアルモジュールをインストール
pip install pyserial
repl
~$ python Python 3.6.6 (default, Oct 7 2018, 12:22:23) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import serial >>> s = serial.Serial('/dev/serial0', 9600, timeout=10) >>> s.readline().decode('utf-8') '$GPGGA,154327.000,,,,,0,1,,,M,,M,,*4F\r\n'
なにか値が取得できた
NMEA0183
モジュールから得られるデータは、NMEA0183に準拠したフォーマットになっている NMEA 0183 - Wikipedia
micropyGPS
取得したデータを扱いやすくするために、NMEAパーサーのmicropyGPSを使う
repl
Python 3.6.6 (default, Oct 7 2018, 12:22:23) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import serial >>> from micropyGPS import MicropyGPS >>> my_gps = MicropyGPS(9, 'dd') >>> s = serial.Serial('/dev/serial0', 9600, timeout=10) >>> for x in s.readline().decode('utf-8'): ... my_gps.update(x) ... 'GPGGA' >>> my_gps.latitude [35.658580566666665, 'N'] >>> my_gps.longitude [139.74323896666668, 'E']
これでいい感じの位置情報が取得できるようになった