この記事はサイバーエージェント 26卒内定者エンジニア アドベントカレンダーの5日目の記事です。
26卒内定者の土鍋と申します。
私はゲームクライアントエンジニアなのですが、なぜか研究関連で触ったGNSSについて書きました。
今回使用したSimpleRTKというモジュールからスマホに座標データを送りたかったのですが、そのままケーブルを繋ぐorPC経由で通信するのは外で使用するうえで不便なので、Bluetoothで通信するのが高速かつセッティングもしやすいと考えました。
そこでこの記事ではGNSSからUARTでESP32に送りBLE通信を行うための前提知識と前段階処理について書きました。
前提知識
GNSS (Global Navigation Satellite System、全球測位衛星システム)は、人工衛星を使って地球上の位置を測定するシステムの総称です。よく聞くGPSとはアメリカのGNSSのことを示すので、その他の衛星を利用する場合はGNSSと呼ぶほうが正確です。
RTK-GNSS (Real-Time Kinematic GNSS) は、GNSS 信号を用いて高精度な位置情報をリアルタイムで取得するための技術です。RTK-GNSS モジュールは、基地局と移動局の2 つのユニットで構成され、基地局が受信したGNSS 信号を元に、移動局の位置を高精度で算出します。
使用する機材
- SimpleRTK Starter Kit
- ESP32
- u-center
u-center は、u-blox 社のGNSS モジュールを設定変更・デバッグするためのツールです。RTK-GNSS モジュールの設定やデータの確認ができます。
UARTで別のマイコンに送る
配線
SimpleRTKボードでUARTを使用するには3.3V outピンとIOREFピンをケーブルで接続する必要があります。

u-centerでSimpleRTKボードからシリアル通信するプロトコルの設定
メニューからコンフィグを開き、UBX>CFG>PRTでポート設定を開き、以下のように設定する。
Target:UART1
Protocol in: RTCM
Protocol out: NMEA
Baudrate: 115200

マイコン側のコード
Blutooth通信をするESP32で座標を受け取るためのコードを書いていきます。
HardwareSerial mySerial1(1); void setup() { Serial.begin(115200); mySerial1.begin(115200,SERIAL_8N1,32,33);//RX=32, TX=33 void loop() { String tempMessage = mySerial1.readStringUntil('$'); if (tempMessage.startsWith("GNRMC")) { Serial.println(tempMessage); } }
SerialはUSBシリアル通信で予約済みなので上記のようにハードウェアシリアルか、
ESP32標準のUARTを使用する場合、Serial1.begin(115200)を使用することで送られてきたデータを読めます。
NMEAフォーマットの読み方

送られてくるデータフォーマット→ NMEAフォーマット
開始文字’$’から改行までのセンテンスで構成されるフォーマットで、
今回使用するのは"GNRMC"で始まるセンテンスです。
GNは複合GNSSデータのことで、RMCは推奨最小GNSSデータであることを示しています。
シリアル通信で送られてきたデータ
3606.47038 14006.02287
→ 36度6.47038分 140度6.02287分
→ 分を60で割って足す(度のみで表す)
→ 36.1078396 140.10038116
u-centerで表示されたデータ

36.10783680 140.10038347
ほぼ一致したので問題なく位置情報は送られてきている。
※座標は研究室の場所です。
まとめ
今回は取得したGNSS情報をBluetoothでスマホに送る前段階処理について書きました。
サイバーエージェントではゲームクライアントエンジニアなので、働いたら全くもってハードウェアを扱わないんですけどね…
次はUnityの記事書くぞ
普段の個人開発ではやっぱ物理的なものがあると展示映えするので、軽くマイコン周りの知識あるだけでも幅が広がっていいなーと思ってます。