В этом проекте мы узнаем о модуле GSM/GPRS+GPS малой мощности A9/A9G и как его программировать с помощью Arduino IDE. Мы рассмотрим основные особенности данного модуля и узнаем о его характеристиках. Затем мы подключим этот модуль к плате Arduino Zero на основе 32-битного микроконтроллера SAMD21 от Atmel. Также мы рассмотрим несколько AT-команд для взаимодействия с данным модулем, получим его местоположение по GPS, получим SMS, подключимся к Интернету и т. д.
A9G GPS-трекер — это продукт на основе решений IoT (Интернет вещей), который объединяет микроконтроллер ATSAMD21G18, модуль GRRS/GSM+GPS A9G с системой управления питанием. Модуль A9G лучше всего подходит для реальных проектов IoT, таких как умный дом, наружный мониторинг, мониторинг на большом расстоянии, GPS-трекер и т. д. Модуль может работать от литий-ионной батареи 3,7 В, поскольку для него требуется питание 3,5–4,2 В при типичном напряжении 4,0 В. Потребляемая мощность этого модуля составляет от 1,03 мА до 1,14 мА в зависимости от области применения.
Необходимые компоненты
- Модуль A9/A9G (купить на AliExpress).
- Плата Maduino Zero A9G GPRS/GPS (купить на AliExpress).
- 2G SIM-карта.
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- Батарея 3,7 В.
- Кабель передачи данных.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Модуль GPRS/GSM+GPS A9G
A9 /A9G — это полноценный четырехдиапазонный GSM/GPRS-модуль , который объединяет технологии GPRS и GPS и интегрирует их в компактный корпус SMD, экономя время и деньги клиентов при разработке приложений GNSS. A9G может использоваться в широком спектре приложений IoT и идеально подходит для приложений IoT для домашней автоматизации, промышленного беспроводного управления, носимой электроники, беспроводных устройств определения местоположения, сигналов беспроводной системы определения местоположения и других приложений IoT.
Функции
– Полный четырехдиапазонный модуль GSM/GPRS, 800/900/1800 /1900 МГц.
– Корпус SMD для простоты MP и тестирования.
– Режим низкого энергопотребления, средний ток 2 мА или меньше.
– Поддержка GPS, BD.
– Поддержка цифрового и аналогового звука, поддержка кодирования голоса HR, FR, EFR, AMR.
– Поддержка голосовых вызовов и SMS-сообщений.
– Встроенный стек протоколов сетевых служб.
– Поддержка стандартных команд GSM07.07,07.05AT и расширяемого набора команд Anxin.
– Поддержка PBCCH.
– Поддержка обновления прошивки через последовательный порт.
Если вы хотите узнать больше об этом модуле, вы можете изучить спецификацию A9G.
Плата Maduino Zero A9G GPRS/GPS
Для работы модуля A9G необходим интерфейс микроконтроллера. Поэтому с ним можно использовать любой микроконтроллер, включая и платы Arduino.
Одна из лучших плат, работающая с модулем A9G — это плата Maduino Zero. Maduino Zero A9G — это решение IoT (Интернет вещей), основанное на 32-битном микроконтроллере Atmel SAMD21 и модуле GPS GPRS/GSM A9G. Оно объединяет микроконтроллер ATSAMD21G18 и модуль GPS GRRS/GSM A9G. ATSAMD21G18 — это маломощный, высокопроизводительный флэш-микроконтроллер на базе ARM® Cortex®-M0+ от Microchip, идеально подходящий для широкого спектра приложений домашней автоматизации, потребительских, измерительных и промышленных приложений.
Плата Maduino Zero A9G основана на платформе Arduino, поэтому пользователи могут ее программировать с помощью Arduino IDE, что очень весьма просто и удобно, и подходит даже для людей с гуманитарным образованием. С этой платой легко добавлять текст, SMS и данные в ваш проект. Она подойдет для вашего проекта умного дома или GPS-трекера и т. д.
Питание платы
Самое лучшее в этой плате то, что вы можете программировать устройство напрямую через кабель передачи данных Micro-USB Вы можете использовать литий-ионную батарею 3,7 В для питания, если вам нужно портативное решение. При подключении MicroUSB плата будет сначала питаться от MicroUSB, при отключении micro USB она автоматически переключится на батарею. Потребляемый ток составляет менее 2 мА, поэтому батарея устройства может работать очень долго, и, следовательно, это идеальное решение по сравнению с GSM модулями SIM800, SIM900.
На задней стороне этой платы есть держатель карты Micro SIM и держатель карты Micro SD. Вы можете использовать любую 2G SIM для проекта IoT на основе данной платы.
Функции платы
– Входное напряжение батареи: 3,4–4,2 В.
– ATSAMD21G18, 32-битный ARM Cortex M0+.
– Разъем Micro SIM.
– Интегрированная система управления питанием.
– Поддержка команд AT.
– Поддержка четырех диапазонов: 850/900/1800/1900 МГц.
– Поддержка GPS.
– Поддержка трафика данных GPRS, максимальная скорость передачи данных, загрузка 85,6 Кбит/с, выгрузка 42,8 Кбит/с.
– Поддержка текстовых сообщений SMS.
– Поддержка зарядки через USB.
– Поддержка карт Micro SD.
– Интерфейс: I2C/SPI/UART/18*GPIO.
– Совместимость с Arduino.
– Рабочая температура: от -40 до 85 ℃.
– Скорость передачи данных по умолчанию: 115200.
– Размеры: 40 мм * 55 мм.
Установка платы в Arduino IDE
Плата Maduino Zero A9G GPRS/GSM+GPS не является предустановленной платой в Arduino IDE. Поэтому нам нужно установить «Arduino Zero Board» из Board Manager (менеджера плат) .
Откройте Boards Manager. В верхнем меню Arduino IDE выберите Tools-> Board-> Boards Manager …, чтобы открыть диалоговое окно Boards Manager. Затем установите платы Arduino SAMD (32-бит ARM Cortex-M0+).
После завершения установки вы можете выбрать плату Arduino Zero, как показано на рисунке ниже. Для программирования этой платы вам необходимо подключить кабель передачи данных MicroUSB.
Подготовка оборудования
Теперь пришло время подготовить плату перед началом любого проекта. Припаяйте все штыревые и гнездовые разъемы к плате.
– Вставьте антенну GPS в разъем, на котором указано GPS.
– Вставьте антенну GSM в разъем, на котором указано GSM.
– Вставьте кабель Micro USB в Maduino Zero A9/A9G.
– (Необязательно в версии 3.3) Вставьте литиевую батарею 3,7 В.
Программирование Maduino A9G GSM/GPRS+GPS с помощью Arduino IDE
Теперь давайте запрограммируем нашу плату. Сначала мы сделаем базовый уровень программирования и с помощью AT-команд получим некоторую информацию.
Скопируйте следующий код и загрузите его на плату Maduino A9G.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <stdio.h> #include <string.h> #define DEBUG true int PWR_KEY = 9; int RST_KEY = 6; int LOW_PWR_KEY = 5; bool ModuleState=false; void setup() { pinMode(PWR_KEY, OUTPUT); pinMode(RST_KEY, OUTPUT); pinMode(LOW_PWR_KEY, OUTPUT); digitalWrite(RST_KEY, LOW); digitalWrite(LOW_PWR_KEY, HIGH); digitalWrite(PWR_KEY, HIGH); Serial1.begin(115200); digitalWrite(PWR_KEY, LOW); delay(3000); digitalWrite(PWR_KEY, HIGH); delay(10000); SerialUSB.begin(115200); //while (!SerialUSB) { ; // wait for serial port to connect } ModuleState=moduleStateCheck(); if(ModuleState==false)//if it's off, turn on it. { digitalWrite(PWR_KEY, LOW); delay(3000); digitalWrite(PWR_KEY, HIGH); delay(10000); SerialUSB.println("Now turnning the A9/A9G on."); } //sendData("AT+CCID", 3000, DEBUG); //sendData("AT+CREG?", 3000, DEBUG); //sendData("AT+CGATT=1", 1000, DEBUG); //sendData("AT+CGACT=1,1", 1000, DEBUG); //sendData("AT+CGDCONT=1,\"IP\",\"CMNET\"", 1000, DEBUG); //sendData("AT+CIPSTART=\"TCP\",\"www.mirocast.com\",80", 2000, DEBUG); SerialUSB.println("Maduino A9/A9G Test Begin!"); } void loop() { while (Serial1.available() > 0) { SerialUSB.write(Serial1.read()); yield(); } while (SerialUSB.available() > 0) { Serial1.write(SerialUSB.read()); yield(); } } bool moduleStateCheck() { int i = 0; bool moduleState=false; for (i = 0; i < 5; i++) { String msg = String(""); msg = sendData("AT", 1000, DEBUG); if (msg.indexOf("OK") >= 0) { SerialUSB.println("A9/A9G Module had turned on."); moduleState=true; return moduleState; } delay(1000); } return moduleState; } String sendData(String command, const int timeout, boolean debug) { String response = ""; Serial1.println(command); long int time = millis(); while ((time + timeout) > millis()) { while (Serial1.available()) { char c = Serial1.read(); response += c; } } if (debug) { SerialUSB.print(response); } return response; } |
AT-команды модуля A9G GSM/GPRS+GPS
После загрузки кода откройте Serial Monitor. Выберите «Both NL & CR» и скорость передачи данных 115200, это покажет, что плата начала работать.
Вы можете ввести AT и отправить эту команду. В ответ вы получите OK.
Если вы хотите получить информацию о номере CCID, вы можете отправить следующую команду.
1 |
AT+CCID |
Если вы хотите сообщить о качестве сигнала GSM/GPRS, вы можете отправить следующую команду.
1 |
AT+CSQ |
Чтобы включить/выключить GPS, вы можете отправить следующую команду.
1 2 3 |
AT+GPS=1 //Turn ON GPS AT+GPS=0 //Turn OFF GPS |
Следующая AT-команда используется для считывания информации NEMA каждые 10 секунд.
1 |
AT+GPSRD=10 |
Примечание: чтобы эта команда заработала, сначала включите GPS с помощью команды «AT+GPS=1».
Чтобы прекратить получение информации NEMA каждые 10 секунд, вы можете использовать следующую команду.
1 |
AT+GPSRD=0 |
Чтобы получить информацию GPS о широте и долготе, вы можете использовать следующую команду.
1 |
AT+LOCATION=2 |
Функция SMS A9G
Теперь давайте протестируем функцию SMS для модуля A9G GSM/GPRS+GPS. Для этого мы возьмем один пример проекта.
Мы отправим SMS с нашего смартфона и включим/выключим светодиод. Для этого нам понадобится светодиод RGB - мы подключим его к плате Maduino A9G, как показано ниже.
Подключите контакты R, G, B к контактам D2, D3, D4 платы Maduino A9G. Подключите контакт VCC светодиода RGB к 3,3 В.
Теперь скопируйте следующий код и загрузите его на плату Maduino Zero A9G.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
#include<stdio.h> #include<string.h> #define DEBUG true int PWR_KEY=9; int RST_KEY=6; int LOW_PWR_KEY=5; int LED_R = 2; //D2 RED int LED_G = 3; //D3 GREEN int LED_B = 4; //D4 BLUE String msg = String(""); int SmsContentFlag = 0; void setup() { pinMode(PWR_KEY, OUTPUT); pinMode(RST_KEY, OUTPUT); pinMode(LOW_PWR_KEY, OUTPUT); digitalWrite(RST_KEY, LOW); digitalWrite(LOW_PWR_KEY, HIGH); digitalWrite(PWR_KEY, HIGH); pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); digitalWrite(LED_R, HIGH); digitalWrite(LED_G, HIGH); digitalWrite(LED_B, HIGH); // String msg = String(""); // int SmsContentFlag = 0; SerialUSB.begin(115200); while (!SerialUSB) { ; // wait for Arduino serial port to connect } Serial1.begin(115200); modulePowerOn(); GprsTextModeSMS(); } void loop() { char SerialInByte; if(SerialUSB.available()) { Serial1.print((unsigned char) SerialUSB.read()); } else if(Serial1.available()) { //char SerialInByte; SerialInByte = (unsigned char)Serial1.read(); if( SerialInByte == 13 )//0x0D { ProcessGprsMsg(); } if( SerialInByte == 10 ) { } else { //EN: store the current character in the message string buffer msg += String(SerialInByte); } } } void modulePowerOn() { int i=0; boolean result = false; digitalWrite(PWR_KEY, LOW); delay(3000); digitalWrite(PWR_KEY, HIGH); delay(15000); result = Serial1.find("OK"); if(result) SerialUSB.println( "Please send sms to control your device!" ); else { for(i=0;i<10;i++) { Serial1.println("AT"); delay(500); result = Serial1.find("OK"); if(result) { SerialUSB.println( "Please send sms to control your device!" ); return; } } } } void ProcessSms( String sms ) { SerialUSB.print( "ProcessSms for [" ); SerialUSB.print( sms ); SerialUSB.println( "]" ); if( sms.indexOf("onr") >= 0) { digitalWrite(LED_R, LOW); SerialUSB.println( "LED Red ON" ); //return; } if( sms.indexOf("ong") >= 0) { digitalWrite( LED_G, LOW); SerialUSB.println( "LED Green ON"); //return; } if( sms.indexOf("onb") >= 0 ) { digitalWrite(LED_B, LOW); SerialUSB.println( "LED Blue ON" ); //return; } if( sms.indexOf("offr") >= 0 ) { digitalWrite(LED_R,HIGH); SerialUSB.println( "LED Red OFF" ); //return; } if(sms.indexOf("offg") >= 0 ) { digitalWrite(LED_G, HIGH ); SerialUSB.println( "LED Green OFF" ); //return; } if( sms.indexOf("offb") >= 0 ) { digitalWrite(LED_B, HIGH ); SerialUSB.println( "LED Blue OFF" ); //return; } } // EN: Request Text Mode for SMS messaging void GprsTextModeSMS() { Serial1.println( "AT+CMGF=1" ); } void GprsReadSmsStore( String SmsStorePos ) { // Serial.print( "GprsReadSmsStore for storePos " ); // Serial.println( SmsStorePos ); Serial1.print( "AT+CMGR=" ); Serial1.println( SmsStorePos ); } // EN: Clear the GPRS shield message buffer void ClearGprsMsg() { msg = ""; } // EN: interpret the GPRS shield message and act appropiately void ProcessGprsMsg() { SerialUSB.println(""); // Serial.print( "GPRS Message: [" ); SerialUSB.print( msg ); // Serial.println( "]" ); if( msg.indexOf( "Call Ready" ) >= 0 ) { SerialUSB.println( "*** GPRS Shield registered on Mobile Network ***" ); GprsTextModeSMS(); } //EN: unsolicited message received when getting a SMS message if( msg.indexOf( "+CIEV" ) >= 0 ) { SerialUSB.println( "*** SMS Received ***" ); } //EN: SMS store readed through UART (result of GprsReadSmsStore request) if( msg.indexOf( "+CMT:" ) >= 0 ) { // EN: Next message will contains the BODY of SMS SmsContentFlag = 1; // EN: Following lines are essentiel to not clear the flag! ClearGprsMsg(); return; } // EN: +CMGR message just before indicate that the following GRPS Shield message // (this message) will contains the SMS body if( SmsContentFlag == 1 ) { SerialUSB.println( "*** SMS MESSAGE CONTENT ***" ); SerialUSB.println( msg ); SerialUSB.println( "*** END OF SMS MESSAGE ***" ); ProcessSms( msg ); } ClearGprsMsg(); //EN: Always clear the flag SmsContentFlag = 0; } |
Теперь код загружен, и вы можете отправить SMS для включения/выключения светодиода. Формат сообщения в соответствии с кодом приведен в следующей таблице.
Теперь, используя любой смартфон, вы можете отправить 'onr', чтобы включить красный светодиод, 'offr', чтобы выключить красный светодиод. Аналогично, вы можете отправить 'ong', чтобы включить зеленый светодиод, 'offg', чтобы выключить зеленый светодиод. То же самое применимо и к синему светодиоду.
Вы также можете открыть свой Serial Monitor в Arduino IDE. Вы можете контролировать все происходящее на экране.