【この記事を読むのに必要な時間は約 6 分です。】
ドライブが大好きで普段はスマホをナビとして使っています。
今回、Raspberry Pi用のGPSモジュールを見つけたので、手持ちのRaspberry Pi3に組み込んでナビを自作してみたいと思い購入しました。
目次
今回購入した製品と入手先
私はAmazonで購入しました。Raspberry Pi専門店舗です。
中国系の販売業者のようですが、今のところいくつか業者に問い合わせたところ明快な回答が得られているので安心です。
製品詳細
■U-BLOX NEO-6Mモジュール/型番:GPS-NEO-6M-001搭載
■セラミックパッシブアンテナ搭載
■EEPROM/データバックアップ電池搭載
■LEDパイロットランプ搭載
■供給電圧:3V/5V
■モジュールサイズ:25.5mm*31.5mm
■取り付け穴サイズ:2mm
■デフォルトボーレート:38400
■デフォルト出力:NMEA0183
開封
密封パッケージにモジュールだけが入っています。付属品その他はありません。
表側
裏側
必要なもの
raspberry Pi本体と接続のためのジャンパワイヤが必要になります。
raspberry Pi3は手持ちのものを使用しました。購入したのはこちらです。
その他接続用にメス-メスのジャンパワイヤが必要になります。購入したのはこちらです。
もちろんRaspberry Pi3を使用するためにディスプレイ、キーボード、マウス等も必要になります。
raspberry Piのバージョンによる注意点
今回購入したGPSモジュールのようにシリアル接続を利用するモジュールの場合、raspberry Pi3では使用出来ませんとの注意書きがあるモジュールが相当数あります。
raspberry Pi2まではそのままシリアル接続するだけで問題なく使用できるのですが、raspberry Pi3ではそのままシリアル接続しただけでは使用できません。
raspberry Pi3から新しく採用されたBluetooth機能がデフォルトでシリアルポートを使用しているためです。
実際には、使用できるように設定を変更してやれば利用可能です。
raspberry pi3との接続
最初にraspberyy Pi3のGPIOピンにGPSモジュールを接続します。
接続には上述のとおりメス-メスのジャンパワイヤを利用します。
raspberry Pi側の接続
raspberry Pi側は4つのピンを使用します。
電源用 +3v3
アース用 GND ※GNDであればどれでも良いです。
シリアル送信用 TXD0/GPIO14
シリアル受信用 RXD0/GPIO15
なお、raspberry Pi3側のTXDとモジュール側のRXD、raspberry Pi3側のRXDとモジュール側のTXDを接続します。間違えないように。
GPSモジュール側の接続
GPSモジュール側は5つのピンがありますが、PPS以外の4つのピンを使用します。
VCC +3v3と接続
GND GNDと接続
TXD RXD0/GPIO15と接続
RXD TXD0/GPIO14と接続
実際に接続した状態
raspberry Pi側
GPSモジュール側
【参考】raspberry Pi3の UART(シリアル通信)について
従来使用のURAT0(ttyAMA0)について
1.RPi3では、Bluetooth機能が加わったため、その通信に従来のシリーズで利用していたURAT0(ttyAMA0)を割り当てました。
2.そのため、デフォルトのままではシリアルコンソールが利用できなくなりました。
3.また、RPi3にはソフトウェア制御によるUART1(ttyS0)が加わりましたが、CPUのコアクロックに依存してしまいます。
4.RPi3のコアクロックはデフォルトでは可変のため、CPUの負荷状況により変化し、それに依存しているUART1のボーレートも同様に変化してしまい、通信に失敗します。
解決方法
Bluetoothを無効にしてしまう方法とCPUのコアクロックを固定してしまう方法があります。
Bluetoothを利用しないなら最初の方法がよいでしょう。
両方利用したい場合は2つ目の方法になりますが、コアクロックが固定されるので、少々パフォーマンス(性能)が落ちるらしいです。
なお、 どちらのシリアル設定でも、GPIO14(TDX)とGPIO15(RDX)にシリアルポートはマッピングされます。
シリアル通信に使うデバイスファイル
Bluetoothを無効にした場合:
/dev/serial0 -> /dev/ttyAMA0
/dev/serial1 -> /dev/ttyS0
CPUコアクロックを固定した場合:
/dev/serial0 -> /dev/ttyS0
/dev/serial1 -> /dev/ttyAMA0
シリアルコンソールを有効にするには
#SDカードをPCで読み込んで、「config.txt」ファイルを修正
#シリアル通信を有効にするため以下を追加
enable_uart=1
#Bluetoothを無効にして、シリアルコンソール(ttyAMA0)を有効にするためには以下を追加
dtoverlay=pi3-miniuart-bt
#Bluetoothもシリアルコンソール(ttyS0)も有効にするためには以下を追加
core_freq = 250
シリアル通信を有効にするには
シリアルコンソールでなく、プログラム等でのシリアル通信のための設定は以下のとおりです。
#SDカードをPCで読み込んで、「config.txt」ファイルを修正
#シリアル通信を有効にするためには以下を追加
enable_uart=1
#SDカードをPCで読み込んで、「cmdline.txt」ファイルを修正
#シリアルコンソールを無効にするためには以下を削除
console=serial0,115200
#コンソールの使用を停止・無効にするコマンド(ttyS0の場合)
$ sudo systemctl stop serial-getty@ttyS0.service
$ sudo systemctl disable serial-getty@ttyS0.service
#RPi3上から設定する場合は/boot/下の「config.txt」および「cmdline.txt」を修正する事で修正可能です。
#ちなみにLinuxコンソール上から、シリアル通信する場合
#【通信速度設定】
$ stty -F /dev/serial0 115200
#【文字列送信】
$ echo "hello" > /dev/serial0
#or
$ echo "hello" > /dev/serial1
GPSを動かしてみる
raspberry Pi3の場合は、上述の方法でシリアル通信が可能な状態にしておきます。
gpsd をインストール
GPSから出てくる情報を解析する gpsd デーモンをインストールします。
$ sudo apt-get -y install gpsd gpsd-clients
gpsdの設定
以下の設定で読めます。
$ cat << EOS | sudo tee -a /etc/default/gpsd
USBAUTO="false"
DEVICES="/dev/gps0"
EOS
gpsdを起動
gpsdを起動します。
$ sudo systemctl start 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
cgpsでモニタリング
cgpsでモニタリング出来ます。
$ cgps -s
最後に
これで無事にGPSモジュールを使用してGPSデータをモニタリングすることが出来ました。
raspberry Pi3を使用する場合、コンソールの設定が必要な点だけ知っていればあとは問題なく利用できると思います。
なお、このGPSモジュールは、上述のとおり、EEPROM(不揮発性メモリ)やバックアップ用電池もついていますが、ヘタっている場合もありアタリハズレはあるようです。アンテナも内蔵ですが、屋外で使用する限り問題なく受信してくれます。
以上