自分を攻略していく記録

自分がやりたいことを達成するには何をすればいいのか、その攻略していく過程をつらつらと

ESP32とGPSで位置情報を取得する

f:id:ngo275:20180505005341j:plain

ESP32とGPSを使って位置情報を取得してみる。電子工作はしたことがなかったので何が必要なのか、そもそもはんだが必要なのかどうかもわからなかったのでメモしておく(GPSモジュールをつなぐにははんだは必要)。

必要なもの

肝心のマイコンAmazonでは品切れだったので、秋葉原秋月電子で購入した。他にもブレッドボードやジャンパーワイヤーをそこで調達した。

akizukidenshi.com

組み立てる

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のTXをESP32のRX(IO16)に、GPSのRXをEPS32のTX(IO17)につなぐ

f:id:ngo275:20180505001828p:plain

スケッチを書いていく

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 を選択すると出力が確認できる。

f:id:ngo275:20180505004543p:plain

結果は以下のように人には読みにくい結果になる。

$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++ という項目が増えるのでそれを選択する。

github.com

f:id:ngo275:20180505003235p:plain

#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モジュールだけじゃなくて他のモジュールも同様にできる(はず)。

参考

taltalp.hatenablog.jp