- 필요한 재료 :
- GSM 모듈 :
- AT 명령을 사용하여 GSM 모듈과 통신 :
- 회로도 :
- PIC 마이크로 컨트롤러 프로그래밍 :
- 시뮬레이션:
- GSM 및 PIC를 사용하여 전화 걸기 및 받기 :
GSM 모듈 은 특히 프로젝트에 원격 액세스가 필요할 때 사용하는 것이 매력적입니다. 이 모듈은 전화 걸기 / 받기, SMS 보내기 / 받기, GPRS를 사용하여 인터넷 연결 등과 같이 일반 휴대폰이 할 수있는 모든 작업을 수행 할 수 있습니다. 일반 마이크와 스피커를이 모듈에 연결하고 대화 할 수도 있습니다. 모바일 통화. 이것은 마이크로 컨트롤러와 인터페이스 할 수 있다면 많은 창의적인 프로젝트의 문을 열 것입니다. 따라서이 튜토리얼 에서는 GSM 모듈 (SIM900A)을 PIC 마이크로 컨트롤러 와 인터페이스하는 방법을 배우고 GSM 모듈을 사용하여 전화를 걸고받는 방법을 시연합니다. 이전에 전화 및 메시징을 위해 Arduino 및 Raspberry Pi와 인터페이스했습니다.
- Arduino 및 GSM 모듈을 사용한 통화 및 메시지
- Raspberry Pi 및 GSM 모듈을 사용한 통화 및 문자
필요한 재료:
- PIC 마이크로 컨트롤러 (PIC16F877A)
- GSM 모듈 (SIM900 또는 기타)
- 전선 연결
- 12V 어댑터
- PicKit 3
GSM 모듈:
GSM 모듈은 AT 명령 모드를 사용하여 마이크로 컨트롤러 없이도 사용할 수 있습니다. 위에 표시된대로 GSM 모듈에는 MAX232 모듈을 사용하여 컴퓨터에 직접 인터페이스 할 수있는 USART 어댑터가 함께 제공되거나 Tx 및 Rx 핀을 사용하여 마이크로 컨트롤러에 연결할 수 있습니다. 마이크 또는 스피커를 연결할 수있는 MIC +, MIC-, SP +, SP- 등과 같은 다른 핀도 확인할 수 있습니다. 모듈은 일반 DC 배럴 잭을 통해 12V 어댑터로 전원을 공급할 수 있습니다.
모듈의 슬롯에 SIM 카드를 삽입하고 전원을 켜면 전원 LED가 켜집니다. 이제 1 분 정도 기다리면 빨간색 (또는 다른 색상) LED가 3 초마다 한 번씩 깜박이는 것을 볼 수 있습니다. 이는 모듈이 SIM 카드와의 연결을 설정할 수 있음을 의미합니다. 이제 모듈을 전화 또는 마이크로 컨트롤러와 연결하는 과정을 진행할 수 있습니다.
AT 명령을 사용하여 GSM 모듈과 통신:
짐작할 수 있듯이 GSM 모듈은 직렬 통신을 통해 통신 할 수 있으며 하나의 언어 만 이해할 수 있습니다. 바로 " AT 명령 "입니다. GSM 모듈에 말하거나 요청하고 싶은 것은 AT 명령을 통해서만 가능합니다. 예를 들어 모듈이 활성 상태인지 알고 싶다면. "AT"와 같은 명령을 요청 (전송)하면 모듈이 "OK"라고 응답합니다.
이러한 AT 명령은 데이터 시트에 잘 설명되어 있으며 공식 데이터 시트에서 찾을 수 있습니다. 괜찮아! 괜찮아! 271 페이지의 데이터 시트이며 읽는 데 며칠이 걸릴 수 있습니다. 그래서 나는 당신이 이것을 빨리 시작하고 실행할 수 있도록 아래에 가장 중요한 몇 가지 AT 명령을 제공했습니다.
에서 |
확인을 위해 OK로 답장 |
AT + CPIN? |
신호 품질 확인 |
AT + COPS? |
서비스 제공 업체 이름 찾기 |
ATD96XXXXXXXX; |
세미콜론으로 끝나는 특정 번호로 전화 |
AT + CNUM |
SIM 카드 번호 찾기 (일부 SIM에서는 작동하지 않을 수 있음) |
ATA |
수신 전화에 응답 |
ATH |
현재 수신 전화 끊기 |
AT + COLP |
수신 전화 번호 표시 |
AT + VTS = (숫자) |
DTMF 번호를 보냅니다. (숫자)에 대해 모바일 키패드의 모든 번호를 사용할 수 있습니다. |
AT + CMGR |
AT + CMGR = 1은 첫 번째 위치에서 메시지를 읽습니다. |
AT + CMGD = 1 |
첫 번째 위치에서 메시지 삭제 |
AT + CMGDA =”모두 삭제” |
SIM에서 모든 메시지 삭제 |
AT + CMGL =”모두” |
SIM에서 보낸 모든 메시지 읽기 |
AT + CMGF = 1 |
SMS 구성을 설정합니다. "1"은 텍스트 전용 모드입니다. |
AT + CMGS =“+91 968837XXXX” > CircuitDigest 텍스트
|
여기에서 특정 번호로 SMS를 보냅니다. 968837XXXX. ">"가 표시되면 텍스트 입력을 시작합니다. Ctrl + Z를 눌러 텍스트를 보냅니다. |
AT + CGATT? |
SIM 카드에서 인터넷 연결을 확인하려면 |
AT + CIPSHUT |
TCP 연결을 종료하려면 인터넷 연결을 끊는 것을 의미합니다. |
AT + CSTT = "APN", "사용자 이름", "통과" |
APN 및 패스 키로 GPRS에 연결합니다. 네트워크 공급자로부터 얻을 수 있습니다. |
AT + CIICR |
SIM 카드에 데이터 팩이 있는지 확인 |
AT + CIFSR |
SIM 네트워크의 IP 가져 오기 |
AT + CIPSTART =“TCP”,”서버 IP”,”포트” |
TCP IP 연결을 설정하는 데 사용됩니다. |
AT + CIPSEND |
이 명령은 데이터를 서버로 보내는 데 사용됩니다. |
회로도:
GSM 모듈과 PIC 마이크로 컨트롤러 를 연결하는 연결 다이어그램 은 다음과 같습니다.
GSM 모듈의 Tx 및 Rx 핀을 각각 PIC MCU PIC16F877A의 Rx 및 Tx 핀과 인터페이스했습니다. 이것은 둘 사이에 직렬 연결을 설정합니다. 또한 GSM 및 PIC 모듈을 모두 공통 접지하는 것을 잊지 마십시오. 우리는 또한 GSM 모듈의 상태를 알기 위해 LCD 디스플레이를 사용했습니다. 연결이 완료되면 하드웨어가 아래와 같이 보일 것입니다.
PIC 성능 보드는 PIC 마이크로 컨트롤러를 사용하는 방법을 배운 PIC 튜토리얼 시리즈 용으로 제작되었습니다. Pickit 3을 사용하여 프로그램을 굽는 방법을 모르는 경우 MPLABX 및 XC8을 사용하는 PIC 마이크로 컨트롤러 자습서로 돌아가고 싶을 수 있습니다. 모든 기본 정보를 건너 뛸 것입니다.
PIC 마이크로 컨트롤러 프로그래밍:
이 프로젝트의 전체 프로그램은이 튜토리얼의 맨 아래에서 찾을 수 있습니다. 여기서는 몇 가지 중요한 기능과 코드를 설명합니다. 이 프로그램에는 또한 LCD와 PIC 마이크로 컨트롤러의 인터페이스에서 가져온 LCD 코드가 있습니다. LCD를 PIC 마이크로 컨트롤러와 함께 사용하는 방법을 알고 싶다면 해당 튜토리얼을 방문 할 수 있습니다.
앞서 말했듯이 직렬 통신 모드를 통해 AT 명령을 사용하여 PIC와 GSM간에 통신 할 것입니다. 따라서 먼저 Initialize _SIM900 () 을 사용하여 PIC 마이크로 컨트롤러에서 USART 통신 모듈을 초기화 해야 합니다 . 함수. 이 함수 내에서 Tx 및 RX 핀을 선언하고 9600 보오율 및 8 비트 모드에서 비동기 수신 및 전송을 초기화합니다.
// *** SIM900 용 UART 초기화 ** // void Initialize_SIM900 (void) {// **** UART 용 I / O 핀 설정 **** // TRISC6 = 0; // TX 핀이 출력으로 설정 됨 TRISC7 = 1; // RX 핀이 입력으로 설정 됨 // ________ I / O 핀이 설정 됨 __________ // / ** 필요한 전송 속도를 위해 SPBRG 레지스터를 초기화하고 빠른 전송 속도를 위해 BRGH를 설정 ** / SPBRG = 129; // SIM900은 9600 Baud rate로 작동하므로 129 BRGH = 1; // 높은 baud_rate의 경우 // _________ baud_rate 설정의 끝 _________ // // **** 비동기 직렬 포트 활성화 ******* // SYNC = 0; // 비동기 SPEN = 1; // 직렬 포트 핀 활성화 // _____ 비동기 직렬 포트 활성화 _______ // // ** 송수신 준비 ** // TXEN = 1; // 전송 활성화 CREN = 1; // 수신 활성화 // __ UART 모듈 가동 및 전송 및 수신 준비 __ // // ** 8 비트 모드 선택 ** // TX9 = 0; // 8 비트 수신 선택 RX9 = 0;// 8 비트 수신 모드 선택 // __ 8 비트 모드 선택 __ //} // ________ UART 모듈 초기화 __________ //
이제 GSM 모듈에서 정보를 읽고 쓸 필요가 있습니다. 이를 위해 _SIM900_putch (), _SIM900_getch (), _SIM900_send_string (), _SIM900_print () 함수를 사용합니다 . 이러한 함수는 TXREG 및 RCREG와 같은 전송 및 수신 버퍼 레지스터를 사용하여 데이터를 직렬로 읽거나 씁니다.
// ** UART에 1 바이트의 날짜를 보내는 기능 ** // void _SIM900_putch (char bt) {while (! TXIF); // TX 버퍼가 해제 될 때까지 프로그램 유지 TXREG = bt; // 수신 된 값으로 트랜스미터 버퍼로드} // _____________ 함수 끝 ________________ // // ** UART에서 1 바이트 날짜를 가져 오는 함수 ** // char _SIM900_getch () {if (OERR) // 오류 확인 { CREN = 0; // 오류 인 경우-> 재설정 CREN = 1; // 오류 발생-> 재설정} while (! RCIF); // RX 버퍼가 해제 될 때까지 프로그램 유지 return RCREG; // 값을 받아 주 함수로 전송} // _____________ 함수 끝 ________________ // // ** 문자열을 바이트로 변환하는 함수 ** // void SIM900_send_string (char * st_pt) {while (* st_pt) // if there 문자 _SIM900_putch (* st_pt ++);// 바이트 데이터로 처리} // ___________ 함수 끝 ______________ // // ** 수정 된 코드 끝 ** // void _SIM900_print (unsigned const char * ptr) {while (* ptr! = 0) {_SIM900_putch (* ptr ++); }
위의 기능은 보편적이며 어떤 응용 프로그램에서도 변경할 필요가 없습니다. 대략적인 소개를하기 위해서만 설명되었습니다. 이해를 통해 원하면 깊이 파고들 수 있습니다.
이제 메인 함수에서 USART 연결을 초기화하고 아래 코드 줄을 사용하여 "AT"를 보낼 때 "OK"를받을 수 있는지 확인합니다.
do {Lcd_Set_Cursor (2,1); Lcd_Print_String ("모듈을 찾을 수 없음"); } while (! SIM900_isStarted ()); // GSM이 "OK"를 다시 보낼 때까지 기다립니다. Lcd_Set_Cursor (2,1); Lcd_Print_String ("모듈 감지 됨"); __delay_ms (1500);
SIM900_isStarted (); 함수 GSM에 "AT"를 보내고 그로부터 "OK"응답을 기다립니다. 그렇다면 1을 반환하고 0을 반환합니다.
모듈이 감지되지 않거나 연결 문제가있는 경우 LCD에 "Module not found"가 표시되고, 그렇지 않으면 Module이 감지되었음을 표시하고 다음 단계로 진행하여 아래에서 SIM 카드를 감지 할 수 있는지 확인합니다. 코드 줄.
/ * SIM 카드가 감지되는지 확인 * / do {Lcd_Set_Cursor (2,1); Lcd_Print_String ("SIM을 찾을 수 없음"); } while (! SIM900_isReady ()); // GSM이 "+ CPIN: READY"를 다시 보낼 때까지 기다립니다. Lcd_Set_Cursor (2,1); Lcd_Print_String ("SIM 감지 됨"); __delay_ms (1500);
SIM900_isReady () 함수 는 "AT + CPIN?"을 전송합니다. GSM에 전송하고 "+ CPIN: READY"응답을 기다립니다. 그렇다면 1을 반환하고 0을 반환합니다.
SIM 카드가 발견되면 LCD에 SIM 감지가 표시됩니다. 그런 다음“ ATD mobilenumber ; 명령을 사용하여 전화를 걸 수 있습니다 . ”. 여기에서는 내 번호를 ATD93643159XX로 사용했습니다. 거기에서 각각의 휴대폰 번호를 바꿔야합니다.
/ * 전화 걸기 * / do {_SIM900_print ("ATD93643XXXXX; \ r \ n"); // 여기에서 93643XXXXX 번으로 전화를 겁니다. Lcd_Set_Cursor (1,1); Lcd_Print_String ("전화 걸기…."); } while (_SIM900_waitResponse ()! = SIM900_OK); // ESP가 "OK"를 다시 보낼 때까지 기다립니다. Lcd_Set_Cursor (1,1); Lcd_Print_String ("발신 전화…."); __delay_ms (1500);
전화가 걸리면 LCD에 Call Placed가 표시되고 지정된 번호로 걸려 오는 전화를 받아야합니다.
GSM 모듈에 연결된 휴대폰 번호로 전화를 걸고 아래 코드를 사용하여 LCD 화면 y에서 알림을받을 수도 있습니다.
while (1) {if (_SIM900_waitResponse () == SIM900_RING) // 수신 전화가 있는지 확인 {Lcd_Set_Cursor (2,1); Lcd_Print_String ("수신 전화 !!."); }}
GSM 모듈이 수신 전화를 감지하면 LCD 모듈의 두 번째 라인에 수신 전화가 표시됩니다. _SIM900_waitResponse () 함수 는 GSM 모듈에서 들어오는 데이터를 확인합니다. waitResponce () 로 인해 "RING"에 해당하는 SIM900_RING을 수신하면 "Incoming call"상태를 표시합니다.
GSM 모듈을 사용하여 거의 모든 유형의 활성화를 수행하기 위해 이와 같은 자신의 기능을 만들 수 있습니다. 하드 코딩을 원할 경우 __SIM900_print () 함수를 사용하여 아래와 같은 AT 명령을 보낼 수 있습니다.
_SIM900_print ("AT + CPIN? \ r \ n");
모든 명령 뒤에는 "\ r \ n"이 붙어 명령이 종료됨을 표시해야합니다.
시뮬레이션:
프로그램의 작동 방식을 이해 한 후에는 시뮬레이션을 시도하고 필요에 맞게 변경할 수 있습니다. 시뮬레이션을 통해 많은 시간을 절약 할 수 있습니다. 시뮬레이션은 Proteus를 사용하여 수행되며 다음과 같습니다.
보시다시피 Proteus에서 가상 터미널 옵션을 사용하여 프로그램이 예상대로 응답하는지 확인했습니다. 팝업 대화 상자를 통해 값을 입력 할 수 있습니다. 예를 들어 실행을 누르 자마자 위와 같은 검은 색 대화 상자가 나타나고 AT를 표시합니다. 이는 GSM 모듈 AT를 전송했음을 의미합니다. 이제 상자에 "OK"를 입력하고 Enter 키를 눌러 PIC에 응답 할 수 있습니다. PIC가 이에 응답합니다. 마찬가지로 모든 AT 명령을 시도 할 수 있습니다.
GSM 및 PIC를 사용하여 전화 걸기 및 받기:
코드와 하드웨어가 어떻게 작동하는지 이해했으면 아래 프로그램을 PIC에 업로드하고 모듈의 전원을 켭니다. 모든 것이 제대로 작동하면 LCD에 "모듈 감지 됨", "SIM 감지 됨"및 "호출 됨"이 표시되어야합니다. "발신 됨"이 표시되면 프로그램에 지정된 번호로 걸려 오는 전화를 받게됩니다.
GSM 모듈에있는 번호로 전화를 걸 수도 있습니다. 그러면 LCD에 "수신 전화"가 표시되어 SIM이 호출되고 있음을 나타냅니다.
프로젝트의 전체 작업은 아래 비디오에 나와 있습니다. 프로젝트를 이해하고 즐겼기를 바랍니다. 작업에 문제가있는 경우 댓글 섹션이나 포럼에 질문을 게시하면 기꺼이 도와 드리겠습니다.