요즘 유용한 IOT 툴인 Blynk를 공부하는 중이다.
그 중 MAP 기능이 꽤나 쓸모있어 보인다. GPS 좌표값을 받아 지도에 표시해줄 수 있으므로 영화등에 자주 등장하는 GPS 추적기를 만드는데 제격일 것이다. 그래서 GPS모듈, esp8266, Blynk를 이용해 GPS 추적기를 만들어 보았다.
1. GPS 모듈
GPS 모듈의 가격은 천차만별인데, 이 프로젝트를 진행하기 위해 굳이 수만원의 비싼 (메X솔루션에 판매되는 것처럼) 비싼 모듈이 필요없다. 찾아보니 GY-GPS6MV2 (흔히 NEO-6M칩을 탑재한) 모듈이 자주 사용되는 듯 하다. 알리에서도 가격은 8천원 이하로 저렴한 편이다.
2. 회로
Wemos D1 mini와 위와 같이 연결하면 된다. RX와 TX의 핀 위치에 주의하자.
3. 소스코드
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
static const int RXPin = 4, TXPin = 5; // GPIO 4=D2(conneect Tx of GPS) and GPIO 5=D1(Connect Rx of GPS)
static const uint32_t GPSBaud = 9600; //if Baud rate 9600 didn't work in your case then use 4800
TinyGPSPlus gps; // The TinyGPS++ object
WidgetMap myMap(V0); // V0 for virtual pin of Map Widget
SoftwareSerial ss(RXPin, TXPin); // The serial connection to the GPS device
BlynkTimer timer;
float spd; //Variable to store the speed
float sats; //Variable to store no. of satellites response
String bearing; //Variable to store orientation or direction of GPS
char auth[] = "*****"; //Your Project authentication key
char ssid[] = "*****"; // Name of your network (HotSpot or Router name)
char pass[] = "*****"; // Corresponding Password
//unsigned int move_index; // moving index, to be used later
unsigned int move_index = 1; // fixed location for now
void setup()
{
Serial.begin(115200);
Serial.println();
ss.begin(GPSBaud);
Blynk.begin(auth, ssid, pass);
timer.setInterval(5000L, checkGPS); // every 5s check if GPS is connected, only really needs to be done once
}
void checkGPS(){
if (gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
Blynk.virtualWrite(V4, "GPS ERROR"); // Value Display widget on V4 if GPS not detected
}
}
void loop()
{
while (ss.available() > 0)
{
// sketch displays information every time a new sentence is correctly encoded.
if (gps.encode(ss.read()))
displayInfo();
}
Blynk.run();
timer.run();
}
void displayInfo()
{
if (gps.location.isValid() )
{
float latitude = (gps.location.lat()); //Storing the Lat. and Lon.
float longitude = (gps.location.lng());
Serial.print("LAT: ");
Serial.println(latitude, 6); // float to x decimal places
Serial.print("LONG: ");
Serial.println(longitude, 6);
Blynk.virtualWrite(V1, String(latitude, 6));
Blynk.virtualWrite(V2, String(longitude, 6));
myMap.location(move_index, latitude, longitude, "GPS_Location");
spd = gps.speed.kmph(); //get speed
Blynk.virtualWrite(V3, spd);
sats = gps.satellites.value(); //get number of satellites
Blynk.virtualWrite(V4, sats);
bearing = TinyGPSPlus::cardinal(gps.course.value()); // get the direction
Blynk.virtualWrite(V5, bearing);
}
Serial.println();
}
소스코드는 www.youtube.com/roboshala 의 프로젝트를 참고했다. Blynk를 사용해보았다면 알수있듯 본인의 Blynk 토큰을 입력해야 한다.
아래 라이브러리를 추가하고 코드를 보드에 업로드한다.
4. Blynk
Blynk 설정은 아래를 참고하자.
집밖에서 테스트 해보니 생각보다 위치가 정확히 측정된다. GPS신호를 잡기 위해서는 반드시 실외이어야 하며, WIFI에 연결하기 위해 핫스팟이나 포켓 WIFI등을 준비하면 좋다. GPS신호를 잡기까지 1~2분정도 소요되기도 한다. 일단 GPS 신호가 잡히면 GPS 모듈에 내장된 LED가 점멸한다. 이 글이 GPS 추적기를 만들려는 사람들에게 도움이 되길 바란다.
[수정]
혹시 작동되지 않는다면 본문의 회로에서 RX선과 TX선을 서로 바꾸어 연결해 보길 바란다.
'아두이노' 카테고리의 다른 글
NodeMCU 핀배치 (0) | 2018.07.10 |
---|---|
Wemos D1 mini 핀배치 (0) | 2018.07.09 |
아두이노 열전사 프린터 사용기 (14) | 2018.04.08 |
아두이노 크롬 공룡게임 자동 플레이 (5) | 2018.03.02 |
미디파일을 tone()으로 변환하기 [아두이노] (2) | 2018.02.15 |