- Необходими материали:
- GSM модул:
- Комуникация с GSM модул чрез AT команди:
- Електрическа схема:
- Програмиране на вашия 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 модулът се доставя с USART адаптер, който може да бъде директно свързан към компютъра с помощта на модул MAX232 или Tx и Rx щифтовете могат да бъдат използвани за свързването му с микроконтролер. Можете също така да забележите другите щифтове като MIC +, MIC-, SP +, SP- и т.н., където може да се свърже микрофон или високоговорител. Модулът може да се захранва от 12V адаптер през обикновен жак за постоянен ток.
Поставете вашата SIM карта в слота на модула и го включете, трябва да забележите, че светодиодът за захранване свети. Сега изчакайте около минута и ще видите червен (или друг цвят) светодиод, който мига веднъж на всеки 3 секунди. Това означава, че вашият модул е в състояние да установи връзка с вашата SIM карта. Сега можете да продължите със свързването на модула с телефон или друг микроконтролер.
Комуникация с GSM модул чрез AT команди:
Както се досещате, GSM модулът може да комуникира чрез последователна комуникация и може да разбира само един език, а това е „ AT команди “. Каквото и да искате да кажете или да поискате от GSM модула, то трябва да бъде само чрез AT команди. Например, ако искате да знаете дали вашият модул е активен. Трябва да поискате (изпратите) команда като „AT“ и вашият модул ще отговори „OK“.
Тези AT команди са добре обяснени в неговия лист с данни и могат да бъдат намерени тук в официалния му лист с данни. Добре! Добре! Това е лист с данни от 271 страници и може да отнеме дни, за да го прочетете. Затова дадох няколко най-важни AT команди по-долу, за да можете да стартирате това скоро.
AT |
Отговори с ОК за потвърждение |
AT + CPIN? |
Проверете качеството на сигнала |
AT + ЧЕНГА? |
Намерете името на доставчика на услуги |
ATD96XXXXXXXX; |
Обаждане до конкретния номер, завършващ с точка и запетая |
AT + CNUM |
Намерете номера на SIM картата (може да не работи за някои SIM) |
ATA |
Отговорете на входящото обаждане |
ATH |
Изключете текущото входящо повикване |
AT + COLP |
Показване на номера на входящо повикване |
AT + VTS = (номер) |
Изпратете DTMF номер. Можете да използвате произволен номер на мобилната си клавиатура за (номер) |
AT + CMGR |
AT + CMGR = 1 чете съобщение на първа позиция |
AT + CMGD = 1 |
Изтриване на съобщението на първа позиция |
AT + CMGDA = ”DEL ALL” |
Изтриване на всички съобщения от SIM картата |
AT + CMGL = "ВСИЧКИ" |
Прочетете всички съобщения от SIM |
AT + CMGF = 1 |
Задайте SMS конфигурация. „1“ е само за текстов режим |
AT + CMGS = “+91 968837XXXX” > CircuitDigest Text
|
Изпраща SMS на определен номер тук 968837XXXX. Когато видите “>” започнете да въвеждате текста. Натиснете Ctrl + Z, за да изпратите текста. |
AT + CGATT? |
За да проверите за интернет връзка на SIM картата |
НА + CIPSHUT |
За да затворите TCP връзка, което означава да прекъснете връзката от интернет |
AT + CSTT = „APN“, „потребителско име“, „Pass“ |
Свържете се с GPRS с вашия APN и Pass ключ. Може да се получи от доставчика на мрежа. |
AT + CIICR |
Проверете дали SIM картата има пакет данни |
AT + CIFSR |
Вземете IP на SIM мрежата |
AT + CIPSTART = “TCP”, “СЪРВЪР IP”, “ПОРТ” |
Използва се за задаване на TCP IP връзка |
НА + CIPSEND |
Тази команда се използва за изпращане на данни към сървъра |
Електрическа схема:
Схемата за свързване на модула за свързване на GSM с микроконтролера PIC е показана по-долу.
Ние просто сме свързали Tx и Rx щифтовете на GSM модула с Rx и Tx щифтовете на PIC MCU PIC16F877A съответно. Това ще установи последователна връзка между двете. Също така, не забравяйте за общо мнение както GSM, така и PIC модула. Използвали сме и LCD дисплей, за да знаем състоянието на нашия GSM модул. След като свържете свързването, вашият хардуер ще изглежда като нещо по-долу.
Платката PIC Perf е направена за нашата серия уроци по PIC, в която научихме как да използваме PIC микроконтролера. Може да искате да се върнете към тези уроци за PIC Microcontroller, използващи MPLABX и XC8, ако не знаете как да запишете програма с помощта на Pickit 3, тъй като ще пропусна цялата тази основна информация.
Програмиране на вашия PIC микроконтролер:
Пълната програма за този проект може да бъде намерена в долната част на този урок. Тук ще обясня някои важни функции и парчета код. Тази програма също има LCD кодове, които са от Interfacing LCD с PIC микроконтролер, можете да посетите този урок, ако сте любопитни да знаете как LCD може да се използва с PIC микроконтролер.
Както казахме по-рано, ще комуникираме между PIC и GSM, като използваме AT команди чрез сериен режим на комуникация. И така, първо трябва да инициализираме комуникационния модул USART в нашия микроконтролер PIC, като използваме Initialize _SIM900 (); функция. Вътре в тази функция декларираме Tx и RX щифтовете и инициализираме асинхронно приемане и предаване при 9600 скорости на предаване и 8-битов режим.
// *** Инициализиране на UART за SIM900 ** // void Initialize_SIM900 (void) {// **** Настройване на I / O щифтове за UART **** // TRISC6 = 0; // TX щифт зададен като изход TRISC7 = 1; // RX ПИН е зададен като вход // ________ I / O щифтове са зададени __________ // / ** Инициализиране на SPBRG регистър за необходимата скорост на предаване и задаване на BRGH за бърза скорост на предаване ** / SPBRG = 129; // SIM900 работи при скорост от 9600 бода, така че 129 BRGH = 1; // за висока скорост на предаване // _________ Настройка на края на скоростта на предаване _________ // // **** **** Активиране на асинхронен сериен порт ******* // 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 ** // void _SIM900_putch (char bt) {while (! TXIF); // задържаме програмата, докато TX буферът е свободен TXREG = bt; // Заредете буфера на предавателя с получената стойност} // _____________ Край на функцията ________________ // // ** Функция за получаване на един байт дата от UART ** // char _SIM900_getch () {if (OERR) // проверете за грешка { CREN = 0; // Ако грешка -> Нулиране на CREN = 1; // Ако грешка -> Нулиране} докато (! RCIF); // задръжте програмата, докато RX буферът е свободен, върнете RCREG; // получаваме стойността и я изпращаме на основната функция} // _____________ Край на функцията ________________ // // ** ** Функция за преобразуване на низ в байт ** // void SIM900_send_string (char * st_pt) {while (* st_pt) // if there е char _SIM900_putch (* st_pt ++);// обработваме го като байтови данни} // ___________ Край на функцията ______________ // // ** Край на модифицираните кодове ** // void _SIM900_print (неподписан const char * ptr) {while (* ptr! = 0) {_SIM900_putch (* ptr ++); }
Горните функции са универсални и не е необходимо да се променят за каквито и да било приложения. Бяха обяснени само за грубо въведение. Можете да се потопите дълбоко в тях, ако искате чрез разбиране.
Сега в нашата основна функция ние инициализираме връзката USART и проверяваме дали сме в състояние да получим „OK“, когато изпратим „AT“, като използваме долния ред код
направете {Lcd_Set_Cursor (2,1); Lcd_Print_String ("Модулът не е намерен"); } докато (! SIM900_isStarted ()); // изчакваме до GSM, за да изпратим обратно "OK" Lcd_Set_Cursor (2,1); Lcd_Print_String ("Модул открит"); __delay_ms (1500);
Функцията SIM900_isStarted (); ще изпрати “AT” към GSM и чака отговор “OK” от него. Ако отговорът е да, ще се върне 1 else 0;
Ако модулът не бъде открит или ако има някакъв проблем с връзката, LCD дисплеят ще покаже „Модулът не е намерен“, в противен случай ще покаже Модулът е открит и преминете към следващата стъпка, където проверяваме дали SIM картата може да бъде открита по-долу ред код.
/ * Проверете дали SIM картата е открита * / do {Lcd_Set_Cursor (2,1); Lcd_Print_String („СИМ не е намерена“); } докато (! SIM900_isReady ()); // изчакваме до GSM да изпрати обратно "+ CPIN: ГОТОВ" Lcd_Set_Cursor (2,1); Lcd_Print_String („Открита SIM“); __delay_ms (1500);
Функцията SIM900_isReady () ще изпрати „AT + CPIN?“ към GSM и чака отговор „+ CPIN: ГОТОВ“ от него. Ако отговорът е да, ще се върне 1 else 0;
Ако SIM карта бъде намерена, ще открием SIM на дисплея. След това можем да опитаме да осъществим повикване, като използваме командата „ ATD mobilenumber ; ”. Тук като пример използвах номера си като ATD93643159XX;. Трябва да замените съответния си мобилен номер там.
/ * Направете телефонно обаждане * / направете {_SIM900_print ("ATD93643XXXXX; \ r \ n"); // Тук се обаждаме на номер 93643XXXXX Lcd_Set_Cursor (1,1); Lcd_Print_String ("Обаждане…"); } докато (_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 модула. Когато получи SIM900_RING, което е еквивалентно на “RING” поради waitResponce () , ние ще покажем състоянието “Incoming call”.
Можете да създадете свои собствени функции като тази, за да извършвате почти всички видове активирания с помощта на GSM модул. Ако искате да имате твърдо кодирани неща, можете просто да използвате функцията __SIM900_print (), за да изпратите всяка AT команда като тази по-долу.
_SIM900_print ("AT + CPIN? \ R \ n");
Не забравяйте, че всичко, което командвате, трябва да бъде последвано с “\ r \ n”, за да покаже, че командата се прекратява.
Симулация:
След като разберете как работи програмата, можете да опитате да симулирате и да направите промени според вашите нужди. Симулацията ще ви спести много време. Симулацията се прави с помощта на Proteus и изглежда по-долу.
Както можете да видите, ние използвахме опция за виртуален терминал в Proteus, за да проверим дали програмата реагира според очакванията. Можем да подадем стойностите през изскачащия диалогов прозорец. Например веднага щом натиснем run, ще се появи черен диалогов прозорец като горе и ще покаже AT, това означава, че е изпратил GSM модула AT, сега можем да отговорим на PIC, като напишем в полето „OK“ и натиснем enter и PIC ще отговори на него. По същия начин можем да опитаме за всички AT команди.
Осъществяване и получаване на повиквания чрез GSM и PIC:
След като разберете как работи кодът и хардуерът, просто качете програмата по-долу в PIC и включете модула. Вашият LCD трябва да показва „Модул е открит“, „СИМ е открит“ и „Обаждане е осъществено“, ако всичко работи добре. След като видите „Обаждане е осъществено“, ще получите входящо повикване на номера, посочен в програмата.
Можете също така да опитате да се обадите на номера, присъстващ в GSM модула, и вашият LCD ще покаже „Incoming call“, за да покаже, че SIM картата е извикана.
Цялостната работа на проекта е показана във видеото по-долу. Надявам се, че сте разбрали проекта и ви е било приятно да го направите. Ако имате някакъв проблем да накарате нещата да работят, публикувайте въпроса си в раздела за коментари или на нашите форуми и ще се радвам да ви помогна.