이전 튜토리얼에서는 GPS 모듈을 컴퓨터와 인터페이스하는 방법과 GSM 및 GPS를 사용하여 차량을 추적하는 방법에 대해 배웠습니다. 또한 Arduino와 가속도계를 사용하여 차량 사고 경보 시스템을 구축했습니다. 여기에서 다시 동일한 프로젝트를 구축하고 있지만 이번에는 MSP430 런치 패드와 진동 센서를 사용하여 차량 사고를 감지합니다. 따라서이 프로젝트는 진동 센서와 MSP430 런치 패드의 인터페이스에 대해서도 설명합니다. 여기에서 더 많은 MSP430 프로젝트를 찾을 수 있습니다.
여기에서 진동 센서 모듈은 차량의 진동을 감지하여 MSP430 Launchpad에 신호를 보냅니다. 그런 다음 MSP430은 GPS 모듈에서 데이터를 가져와 GSM 모듈을 사용하여 SMS를 통해 사용자 휴대폰으로 보냅니다. LED는 사고 경보 신호로도 빛납니다.이 LED는 일부 경보로 교체 할 수 있습니다. 사고 위치는 GPS 모듈의 위도와 경도에서 파생 된 Google지도 링크 형식으로 전송됩니다. 끝에 있는 데모 비디오 를 참조하십시오.
GPS 모듈 은 추적 위치와 관련된 데이터를 실시간으로 전송하며 NMEA 형식으로 많은 데이터를 전송합니다 (아래 스크린 샷 참조). NMEA 형식은 여러 문장으로 구성되며 한 문장 만 필요합니다. 이 문장은 $ GPGGA 에서 시작 하며 좌표, 시간 및 기타 유용한 정보를 포함합니다. 이 GPGGA 는 Global Positioning System Fix Data 라고합니다. 여기에서 NMEA 문장과 GPS 데이터 읽기에 대해 자세히 알아보세요.
문자열의 쉼표를 세어 $ GPGGA 문자열에서 좌표를 추출 할 수 있습니다. $ GPGGA 문자열을 찾아서 배열에 저장한다고 가정하면 Latitude는 두 개의 쉼표 뒤에 있고 Longitude는 네 개의 쉼표 뒤에 있습니다. 이제이 위도와 경도를 다른 배열에 넣을 수 있습니다.
다음은 설명과 함께 $ GPGGA 문자열입니다.
$ GPGGA, 104534.000,7791.0381, N, 06727.4434, E, 1,08,0.9,510.4, M, 43.9, M`` * 47 $ GPGGA, HHMMSS.SSS, 위도, N, 경도, E, FQ, NOS, HDP, altitude, M, height, M,, 체크섬 데이터
식별자 |
기술 |
$ GPGGA |
글로벌 포지셔닝 시스템 수정 데이터 |
HHMMSS.SSS |
시간 (시간 분 초 및 밀리 초 형식) |
위도 |
위도 (좌표) |
엔 |
방향 N = 북, S = 남 |
경도 |
경도 (좌표) |
이자형 |
방향 E = 동쪽, W = 서 |
FQ |
품질 데이터 수정 |
NOS |
사용중인 위성 수 |
HDP |
정밀도의 수평 희석 |
고도 |
고도 (해발 미터) |
미디엄 |
미터 |
신장 |
신장 |
체크섬 |
체크섬 데이터 |
GSM 모듈
SIM900은 고객이나 애호가가 쉽게 사용할 수있는 완전한 쿼드 밴드 GSM / GPRS 모듈입니다. SIM900 GSM 모듈은 산업 표준 인터페이스를 제공합니다. SIM900은 낮은 전력 소비로 음성, SMS, 데이터에 GSM / GPRS 850 / 900 / 1800 / 1900MHz 성능을 제공합니다. 시장에서 쉽게 구할 수 있습니다.
- AMR926EJ-S 코어를 통합 한 단일 칩 프로세서를 사용하여 설계된 SIM900
- 작은 크기의 쿼드 밴드 GSM / GPRS 모듈.
- GPRS 사용
AT 명령
AT는주의를 의미합니다. 이 명령은 GSM 모듈을 제어하는 데 사용됩니다. 이전에 Arduino를 사용하는 많은 GSM 프로젝트에서 사용한 통화 및 메시징 명령이 있습니다. GSM 모듈을 테스트하기 위해 AT 명령을 사용했습니다. AT Command GSM Module 수신 후 OK로 응답합니다. GSM 모듈이 잘 작동하고 있음을 의미합니다. 다음은 이 프로젝트에서 사용한 AT 명령입니다.
ATE0 에코 오프 용
AT + CNMI = 2,2,0,0,0
ATD
AT + CMGF = 1
AT + CMGS =”휴대폰 번호”
>> 이제 메시지를 작성할 수 있습니다.
>> 메시지 작성 후
Ctrl + Z는 메시지 명령 (10 진수 26)을 보냅니다.
HEX에서 ENTER = 0x0d
(GSM 모듈에 대한 자세한 내용은 여기에서 다양한 마이크로 컨트롤러로 다양한 GSM 프로젝트를 확인하십시오.)
진동 센서 모듈
이 MSP430 사고 경보 시스템 프로젝트에서는 진동 또는 갑작스런 변조를 감지하는 진동 센서 모듈을 사용했습니다. 진동 센서 모듈은 모듈에 따라 디지털 출력 HIGH / LOW 로직을 제공합니다. 우리의 경우 활성 HIGH 로직 진동 센서 모듈을 사용했습니다. 이는 진동 센서가 진동을 감지 할 때마다 마이크로 컨트롤러에 HIGH 로직을 제공한다는 것을 의미합니다.
회로 설명
이 차량 사고 경보 시스템 프로젝트 의 회로 연결 은 간단합니다. 여기에서 GPS 모듈 의 Tx 핀은 MSP430 Launchpad (하드웨어 시리얼)의 디지털 핀 번호 P1_1에 직접 연결되며 5v는 GPS 모듈에 전원을 공급하는 데 사용됩니다. 여기에서 소프트웨어 직렬 라이브러리를 사용하여 핀 P_6 및 P1_7에서 직렬 통신을 허용하고 각각 Rx 및 Tx로 만들고 GSM 모듈에 연결했습니다. 12V 공급은 GSM 모듈에 전원을 공급하는 데 사용됩니다. 진동 센서 P1_3에 접속된다. LED는 사고 감지를 표시하는데도 사용됩니다. 나머지 연결은 회로도에 나와 있습니다.
프로그래밍 설명
이 프로젝트를위한 프로그래밍은 GPS 부분을 제외하고는 쉽습니다. 프로젝트가 끝나면 완전한 코드 가 제공됩니다. MSP430에서 코드를 작성하거나 컴파일하기 위해 Arduino와 호환되는 Energia IDE를 사용했습니다. 대부분의 Arduino IDE 기능은이 Energia IDE에서 직접 사용할 수 있습니다.
따라서 먼저 필요한 라이브러리와 선언 된 핀 및 변수를 포함했습니다.
#포함
주어진 기능은 진동 센서 신호 를 읽는 데 사용됩니다. 이 기능은 작거나 잘못된 진동도 필터링합니다.
#define count_max 25 char SensorRead (int pin) // 디 바운스로 sw 읽기 { char count_low = 0, count_high = 0; do { delay (1); if (digitalRead (핀) == HIGH) { count_high ++; count_low = 0; } else { count_high = 0; count_low ++; } } while (count_low <count_max && count_high <count_max); if (count_low> = count_max) return LOW; 그렇지 않으면 HIGH를 반환합니다. }
아래 함수 는 진동을 감지 하고 gpsEvent () 함수를 호출하여 GPS 좌표를 얻고 마지막으로 Send () 함수를 호출하여 SMS를 보냅니다.
void loop () { if (SensorRead (vibrationSensor) == HIGH) { digitalWrite (led, HIGH); gpsEvent (); 보내다(); digitalWrite (led, LOW); 지연 (2000); } }
주어진 함수는 GPS 모듈에서 GPS 문자열 을 가져 와서 좌표를 추출하고 십진법 형식으로 변환합니다.
void gpsEvent () { char gpsString; char test = "RMC"; i = 0; while (1) { while (Serial.available ()) // GPS에서 수신되는 직렬 데이터 { char inChar = (char) Serial.read (); gpsString = inChar; // GPS에서 들어오는 데이터를 임시 문자열에 저장 str i ++; if (i <4) { if (gpsString! = test) // 오른쪽 문자열 확인 i = 0; }
int degree = 0; 정도 = gpsString-48; 정도 * = 10; degree + = gpsString-48; int minut_int = 0; minut_int = gpsString-48; minut_int * = 10; minut_int + = gpsString-48; int minut_dec = 0; minut_dec + = (gpsString-48) * 10000; minut_dec + = (gpsString-48) * 1000; minut_dec + = (gpsString-48) * 100; minut_dec + = (gpsString-48) * 10; minut_dec + = (gpsString-48); float minut = ((float) minut_int + ((float) minut_dec / 100000.0)) / 60.0; 위도 = ((float) degree + minut);
마지막으로 Send () 함수를 사용하여이 코드 부분에 삽입 된 사용자 번호로 SMS를 보냅니다.
void Send () { GSM.print ("AT + CMGS ="); GSM.print (' "'); GSM.print ("961 **** 059 "); // 휴대폰 번호 입력 GSM.println ('"'); 지연 (500); // GSM.print ("위도:"); // GSM.println (latitude); GSM.println ("사고 발생"); 지연 (500); // GSM.print ("경도:"); // GSM.println (logitude); GSM.println ("위치를 보려면 링크를 클릭하십시오"); GSM.print ("http://maps.google.com/maps?&z=15&mrt=yp&t=k&q="); GSM.print (latitude, 6); GSM.print ("+"); GSM.print (logitude, 6); GSM.write (26); 지연 (4000); }
완성 된 코드와 데모 영상 은 아래와 같습니다. 코드의 모든 기능을 확인할 수 있습니다.