Raspberry pi 4のGPIOを使用してGPS(GNSS)から受信したデータを確認できたので、手順を紹介します。
使用したGPS:NEO-6M
記事を書こうと思った動機
Raspberry pi 3でGPSを使用する手順はそれなりに見つかったのですが、Raspberry pi 4とGPSモジュールのGPIO経由での接続手順は全く見つからなかったので、今後Raspberry pi 4+GPSを検討にしている人には参考になるかと。
また、Raspberry piの経験がある方でもGPSについては「なんのこっちゃ」って人も多いと思うので、ステップバイステップで紹介する記事があったほうが有用だと感じたからです。
参考にしたサイト
とは言っても、私もGPSに超詳しいわけではなく、以下のサイトを非常に参考にしました。
Use Neo 6M GPS Module with Raspberry Pi and Python
この記事が最も参考になりました。Raspberry piのOS設定は殆ど同じ方法で実施しました。
GPS電波をRaspberry Piで読み取り、時間と位置把握する
gpsmonの設定方法がわかりやすく紹介されています。
GPSから取得するNMEAフォーマットについてわかりやすく解説されています。
NMEAフォーマットのデータ構造をわかりやすく解説されています。

上記の情報がなかったら、色々ギブアップしてたかもしれん。
ホンマに感謝です。
購入した機材の紹介
- Raspberry pi 4(4GB)と備品(ACアダプタとか)
- GPS
- ケーブル
Raspberry pi 4は最新のRaspberry pi OS(32bit 2020-05-27)を使用していますが、Raspberry pi OS(Raspbian)であればマイナーバージョンの差異は影響しないと思います。
メモリも4Gじゃなくても大丈夫だと思います。
とりあえずRaspberry pi OSの初期セットアップは完了しておいてください。初期設定(microsdにOSを入れる方法とかネットワークの設定とか)は先に済ませておいてください。今年になってから簡単にMicroSDカードにOSを入れることもできるようになったっぽいし。
「圧倒的に速い」──ラズパイにOSをインストールする新ツール「Raspberry Pi Imager」
次に、私が購入したGPSを紹介します。
ケーブル含めて3,500円程度で揃います!

こんなに安価で試せるとは・・・便利な世の中になったもんや!
OSOYOO GPSモジュール U-BLOX NEO-6Mモジュール付き
これです。
ネットで販売されてる殆どのRaspberry pi動作確認済のGPSモジュールが「Raspberry pi 2と3」での動作確認を謳っています。恐らくRaspberry pi 4の動作検証が追いついていないだけでしょう。
それでも、Raspberry piやGPIOの仕様を理解していない人にとっては未知の世界なので、そのGPSがRaspberry pi 4で使用できるか不安でしょう。
とりあえず結論から言うと、上記のGPSは私のRaspberry pi 4で動作しています。
また、このデバイスは値段もそこそこ安いのでおすすめです。
ブレッドボード・ジャンパーワイヤー 40ピン
GPSモジュールとRaspberry pi 4を接続する物理ケーブル(ジャンパーワイヤー)です。
今回使用するケーブルはメス-メス4本(3本でも大丈夫)ですが、ケーブル不良の場合を考えて沢山持っていたほうが安心感がある。
この製品は値段も安くて、メス-メス以外も大量に入ってるので、購入することをおすすめします。
GPSとケーブルの外観紹介
Amazonのフラストフリーパッケージで到着しました。

左がGPS、右がケーブルです。
まずはGPSを紹介します。(正しくはGNSSだけど、一般的にGPSと総称されてると思うので、この記事でもGPSを呼び続けます)

しっかり静電気防止パックに入っていました。

中を開けてみると、更に静電気防止パックに入っていました。安物なのに厳重です。

出してみました。こちらが裏面。

表面。梱包材が刺さっています。ピンが折れるのを防ぐためでしょう。非常に丁寧で高感度が高い。

出してみました。右のジャンパーピンを使用してRaspberry pi 4に接続します。
では、次はケーブルです。

ぎっしり入っています。

意外と軽視されるのがケーブルやね。本体ゲットしてもケーブルがないとどうにもならん。
これだけあったら安心感あるね!
袋から出してみました。

メス-メスケーブルです。色もバリエーション豊富で識別しやすい。

メス-メス以外も沢山あります。

こんな感じでテロテロとはがせて1本ずつ使用することができます。GPSのジャンパーピンは隣り合っているので、1本ずつ使用できないとRaspberry pi 4本体に接続できない。
だから、この製品を購入して正解でした。
では、実装開始!
早速やってみます!
事前準備
上記にも記載しましたが、Raspberry pi 4の初期設定は完了しておいてください。
CLIコンソール(できればSSH)で接続できる状態にしておいてください。
OS側設定
piユーザで入って以下の設定を行います。
/boot/config.txtの設定
/boot/config.txtの最後に以下を追記します。
dtparam=spi=on
dtoverlay=pi3-disable-bt
core_freq=250
enable_uart=1
force_turbo=1
ちなみに/boot/config.txtはrootユーザ保有なので「sudo vi /boot/config.txt」とかで編集します。
/boot/cmdline.txtの修正
まずは/boot/cmdline.txtのバックアップを取得します。
sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
次に/boot/cmdline.txtを完全に以下の通り置き換えます。
pi@raspberrypi:~/script $ sudo cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
この1行だけにします。
Raspberry pi 4を一旦停止
普通にshutdownします。
sudo shutdown -h now
電源ケーブルも一旦抜いて完全に電力を絶ちます。
GPSの接続
いよいよGPSをRaspberry pi 4本体に接続します。
恐らくここからが読者が一番気になるところでしょう。実装時、私も「どの状態が正しいか」とか非常に不安でした。

成功した今だから余裕やけど、やってるときはランプの意味とか正しい挙動がわからんかったから不安やった。
なので、ステップバイステップで紹介します。
接続の簡単な解説
まず、当GPSはRaspberry pi 4の「GPIO」にジャンパーケーブルを接続して使用します。

こんな感じです。1本づつ解説します。
GPIOのインターフェース番号は以下のサイトを参照してください。
Simple Guide to the Raspberry Pi GPIO Header
GPSの左のピンから順番に解説します。
[GPS]電源(VCC)を[Raspberry]5V(2)に接続
私の環境では「ブラウン」のケーブルです。
GPSのVCCと記載されているピンで電源を確保します。これをRaspberry pi 4の(上の写真から見た)左上に接続します。
つまり、上記リンクの「2」に接続します。
これが5V電源の確保するピンです。多分3V3(1)でも動くと思う。
[GPS]アース(GND)を[Raspberry]GND(6)に接続
私の環境では「ブラック」のケーブルです。
GPSのGNDと記載されているピン(VCCの隣)でアースに接続します。
つまり、上記リンクの「6」に接続します。さっき接続したVCCの隣の隣。
これを接続しないとGPS側の電源がつきません。VCCを接続していてもダメです。
[GPS]データ転送(TXD)を[Raspberry]RXD(10)に接続
私の環境では「イエロー」のケーブルです。
GPSのTXDと記載されているピンで実際に受信したGPSデータをRaspberry pi4に転送します。Raspberry pi 4側は「受信側」なので、RXDに接続します。

Raspberry pi 4側はTXDじゃなくてRXDに接続するのがポイントやね!
GPSモジュール側はTXD!
Raspberry pi 4側はRXD!
つまり、上記リンクの「10」に接続します。さっき接続したGNDの隣の隣。
[GPS]データ受信(RXD)は接続する必要なし
GPSのRXDは接続する必要がありません。そもそもRXDは受信用ピンなので、なぜGPS側でRXDがあるのか謎です。
(色々試してみて動かなくて「実はRXDも接続する必要があるのでは?」と不安に思う人もいるかも知れないと思い、明記しました。)
(オプション)[GPS]PPS転送を[Raspberry]GPIO18(12)に接続
私の環境では「オレンジ」のケーブルです。
GPSのPPSピンも接続が必須ではありません。これはPPSという定期的なパルスを使用したい時に使うものなので、GPSの位置データとは関係ありません。

つまり、最小構成はVCCとGNDとTXDの接続やね!
これも使いたい場合は接続してください。
電源を接続して動作確認
ここまでで物理的な配線は完了です。
私の購入したケーブルは、2本くらい「メスなのに刺さらなかった」ものもあったりして、そういうケーブルは捨ててしまいましょう。
では、いよいよRaspberry Pi 4の電源を(いつもどおり)接続します。すると、VCCピン経由でGPSモジュールに給電されて、GPSモジュールの赤ランプが「点灯」するはずです。

こんな感じです。
Raspberry pi 4を起動したら必ずGPSの赤ランプが点灯するはずです。これはGPS信号を受信してるかは関係ありません。(地下でも点灯するはず)
この段階で赤ランプが点灯しなければ、ケーブル配線が間違えているか初期不良の可能性があると思います。VCCのピンとGNDのピンがしっかり刺さってるかを確認しましょう。
ケーブル不良の可能性もあるので、ケーブルを変えてみるとかも有効かと。
(この時点でGPSの赤ランプが点滅してたらベストですが、まずは点灯を確認すること)
OKですかね?
では、Raspberry pi 4にログインし、以下のコマンドを叩いてください。
sudo cat /dev/ttyAMA0
これで「何か」メッセージが表示されたら、とりあえず以下が確認できたことになります。
- GPSモジュールが起動している(正常に動作してるとは言ってない)
- GPSモジュールとRaspberry pi 4の間のTXD-RXDケーブルが繋がっている
TXD-RXDが繋がっていなければ、何も表示されないはずです。
次に、出力されてるデータの「$XXRMC」という行に着目してみてください。XXは人によって違うかもしれません。私の家の周りでは「$GNRMC」です。
$GNRMC,021223.00,V,,,,,,,240720,,,N,V*1A
もし上記みたいに,,の間になにもないデータが多ければ、それはGPSモジュールが衛生から位置データを受信できていない可能性が高いです。
屋内だとほぼ間違いなくデータを受信できないです。私の家だと窓ギリギリでも受信できませんでした。

窓ギリギリでも上記のメッセージが変わらなかったから、GPSの初期不良か設定ミスを疑ってしまったわ。
そんな時は、ベランダの更に屋根がない場所に置いてみてください。
正常にGPSが信号を受信できたら、さっきの電源ランプが赤く「点滅(点灯ではない)」するはずです。

このGPSモジュールのランプが赤に「点滅(チカチカ)」するはずです。
これが成功したらここの「Now you will see a lots of data like shown」の画像みたいなデータがどんどん出力されるはず。(私の端末の画面キャプチャを紹介したら、私の位置がわかってしまうので、控えます)
ここまで成功したら、こっちのもんですね。あとはデータを煮るなり焼くなり好きにすればよいかと。
まとめ
今回紹介したGPSモジュールとケーブル。
NEO-6MのGPSモジュールは色んな種類があるので、ランプの色が違ったりPPSピンがなかったりと、ネットに落ちてる手順で不安になることもあるかと。また、Raspberry pi4の接続が解説されてる手順が見当たらなく「本当にRaspberry pi4で接続できるのかしら?」と不安に思ってる人も多いかと。
とりあえず正常にRaspberry pi4と接続が確認できましたので、参考にしていただければ幸いです。
コメント