아두이노 MKR GSM 1400 즉석 GPS 추적: SMS로 위치 요청 및 수신
부품 및 소모품
프로젝트 소개
참고: 이 튜토리얼은 구버전일 수 있습니다. 최신 버전은 여기를 참조하세요.
아두이노 MKR GSM 1400의 셀룰러 기반 위치 파악 기능을 시연합니다. 보안 문자('L')가 포함된 SMS 수신 시 위도/경도를 구글 맵 링크로 회신하는 간단한 애플리케이션을 구현했습니다.
필요 물품
- 아두이노 MKR GSM 1400 (스케치 실행, GSM 연결, 위치 기능 지원)
- 안테나, 리포 배터리 팩 (셀룰러 연결용, 전원 백업용)
- 스마트폰 (SMS 발송용)
- 데이터 SIM 카드 (데이터 네트워크 접속용)
- PIN, APN, 접속 인증 정보 (데이터 네트워크 연결용)
하드웨어 설정
특별한 조립 불필요. 보드에 안테나 연결, SIM 카드 삽입, 리포 배터리를 JST 커넥터에 연결하세요. 리포 배터리는 선택 사항이나, 커버리지가 나쁜 지역에서 GSM 모듈의 순간 전류 피크를 감당하는 데 도움이 됩니다.
작동 원리
MKRGSM 라이브러리로 SMS 관리와 셀 기반 지오레퍼런싱을 수행합니다.
- SMS 수신 시 내용에 문자 'L'(ASCII 76)이 있는지 확인. 일치할 때만 위치 측정 및 회신. (`if (c != 76)` 조건으로 구현, 값 변경 시 다른 문자로 변경 가능)
- GSM 모듈에 GPS 수신기는 없지만, 제조사가 GSM 셀 타워 위치 데이터베이스를 보유해 셀 ID 기반 좌표 제공. 도심(셀 반경 작음)에서 정확도 높음, 농촌(셀 반경 큼)은 근사치.
- 구글 맵 URL 형식: `https://www.google.com/maps/place/,` 형태로 생성. 표시 위치는 셀 타워 물리적 위치이며, 보드는 해당 셀 커버리지 반경 내에 존재.
스케치 상세
라이브러리 및 초기화
// GSM 라이브러리 포함
#include <MKRGSM.h>
#include "ArduinoLowPower.h"
char PINNUMBER [] = SECRET_PINNUMBER;
char GPRS_APN[] = SECRET_GPRS_APN;
char GPRS_LOGIN [] = SECRET_GPRS_LOGIN;
char GPRS_PASSWORD[] = SECRET_GPRS_PASSWORD;
// 라이브러리 인스턴스 초기화
GPRS gprs;
GSM gsmAccess;
GSM_SMS sms;
GSMLocation location;
웹 에디터 사용 시 `arduino_secrets.h` 파일에 PIN, APN, 사용자, 비밀번호 입력 (Secrets 탭에서 설정).
위치 측정 함수 `measureLocation()`
// 전역 변수
String GSMlatitude = "0.000000";
String GSMlongitude = "0.000000";
// 셀룰러 네트워크로 좌표 조회, 정확도 300m 미만이고 0이 아닐 때 갱신, 45초 타임아웃
void measureLocation() {
unsigned long timeout = millis();
while (millis() - timeout < 45000) {
if (location.available() && location.accuracy() < 300 && location.accuracy() != 0) {
GSMlatitude = String(location.latitude(), 6);
GSMlongitude = String(location.longitude(), 6);
break;
}
}
}
네트워크 연결 함수 `connectNetwork()`
void connectNetwork() {
bool status = false;
gprs.setTimeout(100000);
gsmAccess.setTimeout(100000); // AT 명령 타임아웃 설정 (UART 통신 동결 복구용)
while (status == false) {
if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &
(gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
status = true;
} else {
delay(1000);
}
}
}
Setup
void setup() {
connectNetwork(); // 데이터 연결 수립
location.begin(); // 위치 서비스 시작
}
메인 루프
void loop() {
int c;
String response;
String messager = "";
measureLocation(); // 위치 측정
unsigned long timeout = millis();
while (millis() - timeout < 5000) { // 5초간 SMS 대기
if (sms.available()) {
char senderNumber[20] = {"0"};
sms.remoteNumber(senderNumber, 20); // 발신자 번호 획득
int c = sms.read();
if (c != 76) { // 'L'이 아니면 무시
sms.flush();
break;
}
// 구글 맵 링크 생성 및 회신
String txtMsg = "https://www.google.com/maps/place/" + GSMlatitude + "," + GSMlongitude;
sms.beginSMS(senderNumber);
sms.print(txtMsg);
sms.endSMS();
break;
}
}
// 저전력 모드: GSM 모듈 종료 후 60초 딥슬립
gsmAccess.shutdown();
LowPower.sleep(60000);
connectNetwork(); // 재연결
}
사용 방법
- 하드웨어 연결 (위 참조)
- 스케치에 접속 인증 정보 입력 후 업로드
- GSM 네트워크 연결 대기 (약 30초)
- MKR GSM 1400의 SIM 번호로 문자 'L' 전송 → 위치 링크 수신