ESP32とGPSを使って位置情報を取得してみる。電子工作はしたことがなかったので何が必要なのか、そもそもはんだが必要なのかどうかもわからなかったのでメモしておく(GPSモジュールをつなぐにははんだは必要)。
必要なもの
肝心のマイコンはAmazonでは品切れだったので、秋葉原の秋月電子で購入した。他にもブレッドボードやジャンパーワイヤーをそこで調達した。
組み立てる
GPSの4つの端子のつなぎ込み
GPSモジュールにはVCC、GND、RX、TXが書いてあり、以下のようにつなげた。と、その前にはんだを使って、ピンヘッダー(4つ分)とGPSをつなげる必要があった(はんだが必要だったのはここだけ)。
- VCCはESP32の5Vに
- GNDはESP32のGNDに
- RXはESP32のIO17に
- TXはESP32のIO16に
ESP32には3つのUARTがある
- UART0 ( デフォルト RX=GPIO3, TX=GPIO1 )
- UART1 ( デフォルト RX=GPIO9, TX=GPIO10 )
- WROOM32では、デフォルトでは使用不可
- UART2 ( デフォルト RX=GPIO16, TX=GPIO17 )
スケッチを書いていく
GPSから生データを取得する
HardwareSerial Serial1(2); void setup() { // initialize both serial ports: Serial.begin(115200); Serial1.begin(9600); } void loop() { // read from port 1, send to port 0: if (Serial1.available()) { int inByte = Serial1.read(); Serial.write(inByte); } // read from port 0, send to port 1: if (Serial.available()) { int inByte = Serial.read(); Serial1.write(inByte); } }
以下の画像のアイコンを選択して、 111520 baud
を選択すると出力が確認できる。
結果は以下のように人には読みにくい結果になる。
$GPRMC,151000.00,A,3222.22223,N,11111.1111,E,0.808,,030218,,,A*4A $GPVTG,,T,,M,0.508,N,1.191,K,A*17 $GPGGA,151000.00,3222.22223,N,11111.1111,E,1,09,2.22,102.1,M,39.1,M,,*3D ...
GPSのデータを加工する
先程のデータを加工するのに便利なライブラリがあるのでそれをインストールして利用する。以下のリンクからzipファイルを落として、画像にあるようにzipで追加すると、 TinyGPS++
という項目が増えるのでそれを選択する。
#include <TinyGPS++.h> TinyGPSPlus gps; HardwareSerial Serial1(2); void setup() { // initialize both serial ports: Serial.begin(115200); Serial1.begin(9600); } void loop() { while (Serial1.available() > 0) { char c = Serial1.read(); gps.encode(c); if (gps.location.isUpdated()) { Serial.print("LAT: "); Serial.println(gps.location.lat(), 9); Serial.print("LONG: "); Serial.println(gps.location.lng(), 9); } } }
緯度経度が正確に取れていることが確認できる。
まとめ
はじめはシリアル通信もわからなかったが、UARTの仕組みが分かるとどこを繋げば良いのかが分かってきた。GPSモジュールだけじゃなくて他のモジュールも同様にできる(はず)。