Ардуино и GSM/GPRS Shield

Ардуино и GSM/

Приём, отправка, чтение и запись SMS-сообщений



GPRS Shield — работает в сетях сотовой связи по технологиям GSM/GPRS для приёма и передачи SMS. Для голосовой связи на плате есть стандартные 3,5 мм джеки для аудио входа-выхода. (можно подключить наушники и микрофон)

Общение с платой производится через serial-порт с помощью AT-команд:



Подключение


В принципе можно подключить стандартным «бутербродом»:



Но поскольку у читателя может оказаться иной форм-фактор ардуины…



… то будет описано подключение проводами.


В первую очередь надо обратить внимание на питание. В режиме ожидиния, gsm-shield потребляет незначительный ток (50-100мА), но в момент звонка пиковый ток может достигать 1,5 — 2А. Исходя из этого не стоит запитывать шилд от ардуины, а лучше взять источник помощнее.

Я воспользовался зарядным устройством (5V) от андройдфона HTC и самодельным проводом:




Установите джамперы RX TX и переключатель выбора питания как на фото:




Теперь подключим ардуину к шилду по следующей схеме:



Первый контакт шилда (жёлтый) соединяем с d1 (TX) ардуины.
Второй контакт шилда (зелёный) соединяем с d0 (RX) ардуины.
Соединяем «земли» (чёрный) ардуины и шилда.
Подключаем питание к шилду.
Ардуина будет питаться от USB.


Прежде чем писать скетч, нужно проверить правильно ли всё подключено и есть ли обмен данными.
Сделать это очень просто, надо ардуину превратить в USB<>UART мост, то есть сделать ардуину посредником между шилдом и компьютером.

Для этого нужно у ардуины соединить RESET и GND:



Теперь данные будут передаваться непосредственно между шилдом и компьютером.


Проверим работу:

Отключите у симки пин-код и вставьте её в шилд. (экспериментировать можно и без неё, но не интересно)
Если есть, то вставьте батарейку. (она нужна для того, чтоб время, которое Вы может быть захотите настроить, не сбрасывалось при отключении)

Включите питание шилда.

Ардуину подключите к компьютеру.

Зажмите на одну секунду кнопку включения. У себя я его замкнул чтоб шилд включался при подаче питания.



Будет светится красный светодиод и мигать зелёный.


Откройте Serial Monitor (предварительно укажите плату и порт), в настройках монитора установите Both NL & CR и скорость 19200. (у Вас может оказаться прошивка с другой скоростью, тогда действуйте методом «тыка»)

Вводим в верхнюю строку команду AT и жмём Отправить




В ответ должны получить ОК



Если всё так, то переходим дальше, если нет, то проверяем правильность подключения и/или пробуем другую скорость.



Работа с шилдом

Пообщаемся с шилдом с помощью AT-команд:

AT+IPR=9600 — меняет скорость порта. 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 (после изменения не забудте поменять скорость в серал-мониторе)

AT+GMM — идентификатор шилда.

AT+GOI — то же самое.

AT+GMR — версия прошивки.

AT+GSN — IMEI шилда.

AT+CSQ — уровень сигнала. Может быть в диапазоне 0..31. 99 — нет сигнала.

AT+CSPN? — инфа об операторе.

AT+CCLK? — текущее время.

AT+CCLK=«yy/mm/dd,hh:mm:ss+zz» — установить время. Обязательно с ведущими нулями.

ATD + +79819677881; — позвонить.

AT+CLIP=1 — Включает АОН.

ATA — ответить на входящий звонок.

ATH0 — разорвать все соединения.

ATS0=0 — установить количество звонков до авто поднятия трубки. 0 — вручную.

AT+GSMBUSY=1 — запрет всех входящих звонков. 0 — разрешены.

AT+CMGF=1 — устанавливает текстовый режим для SMS-сообщений.

ATD#100#; — проверка баланса.

Справочник по AT-командам.

Позвоните на шилд и пошлите смску, чтоб увидеть что выводится в консоль.



Теперь попробуем поуправлять ардуиной:

Вначале простой код. При звонке ардуина два раза мигнёт D13 и оборвёт соединение.

Удалите с ардуины перемычку RESET — GND, она больше не понадобится.

Заливаем вот этот скетч. Не забывайте отсоединять провода от RX-TX, когда прошиваете.


String currStr = ""; //в строке curStr будем хранить текущую строку, которую передает нам плата
int updateTime = 0;

int led = 13;

void setup()
{
    Serial.begin(19200);
    pinMode(led, OUTPUT);
    // настройка шилда
    Serial.print("ATS0=0\r"); // снятие трубки только вручную
}
 
void loop()
{
    if (!Serial.available()) return; 
 
    // Считываем очередной символ с платы
    char currSymb = Serial.read();    
 
    if('\r' == currSymb) 
      { 
        // Получен символ перевода строки, это значит, что текущее
        // сообщение от платы завершено и мы можем на него отреагировать.
        // Если в принятой строке есть  RING, то значит, нам кто-то звонит
           if(!currStr.compareTo("RING")) 
             {
               digitalWrite(led, HIGH);  // помигаем
               delay(1000);            
               digitalWrite(led, LOW);  
               delay(1000); 
               digitalWrite(led, HIGH);  
               delay(1000);            
               digitalWrite(led, LOW);  
               delay(1000);
               Serial.print("ATH0\r"); // отбой соединения
             }
        currStr = "";
      } 
    
    else if (currSymb != '\n') 
       {
          // Дополняем текущую команду новым сиволом
          // При этом игнорируем второй символ в последовательности переноса
          // строки: \r\n
          currStr += String(currSymb);
       }
}


Возвращаем провода на место и звоним на шилд…
Если что-то не так, то возвращаемся к началу и читаем с удвоенным вниманием.



Усложним задачу

Сделаем так:

При получений смс с текстом infa, в ответ будет отсылаться смс HELLO.

При получений смс с текстом vkl, ардуина будет зажигать D13 и перезванивать на Ваш номер, рапортуя тем самым о выполнении задания.
При получений смс с текстом otkl, ардуина будет гасить D13. И тоже перезванивать.

При получений смс с текстом bal, будет проверять баланс и отправлять обратно смс с ответом.

А при звонке будет снимать трубку после второго гудка.


Прошиваем скетч…


String currStr = "";
boolean isStringMessage = false; // Переменная принимает значение True, если текущая строка является сообщением
int led = 13;
     
void setup()
    {
        pinMode(led, OUTPUT);
        Serial.begin(19200);
        // настройка шилда
        Serial.print("AT+CMGF=1\r"); // устанавливает текстовый режим смс-сообщения
        delay(300);
        Serial.print("AT+IFC=1, 1\r"); // устанавливает программный контроль потоком передачи данных 
        delay(300);
        Serial.print("AT+CPBS=\"SM\"\r"); // открывает доступ к данным телефонной книги SIM-карты. У вас может отличатся!
        delay(300);
        Serial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс в консоль. У вас может отличатся!
        delay(500);
        Serial.print("ATS0=2\r"); // поднимать трубку после второго звонка
    }
     
void loop()
 { 
   if(Serial.available())
      { 
        char currSymb = Serial.read(); 
        if('\r' == currSymb) 
           {
             if(isStringMessage) 
                {
                  if (!currStr.compareTo("infa")) // блок infa
                    {
                       delay(2000);
                       Serial.println("AT + CMGS = \"+79819674444\""); // укажите свой номер!
                       delay(100);
                       Serial.println("HELLO");
                       delay(100);
                       Serial.println((char)26);
                       delay(100);
                       Serial.println();
                    } 
                    
                  else if (!currStr.compareTo("vkl")) // блок vkl
                    {
                       delay(2000);
                       digitalWrite(led, HIGH);
                       Serial.println("ATD + +79819674444;"); // укажите свой номер!
                    } 
           
                  else if (!currStr.compareTo("otkl")) // блок otkl 
                    {
                       delay(2000);
                       digitalWrite(led, LOW);
                       Serial.println("ATD + +79819674444;"); // укажите свой номер!
                    }
           
                  else if (!currStr.compareTo("bal")) // блок bal 
                    {
                       Serial.print("ATD#100#;\r"); // делаем запрос баланса (мтс), а ответ ловится в блоке ниже...
                    } 
          
                  isStringMessage = false;
               } 
               
            else 
               {
                 if(currStr.startsWith("+CMT")) 
                    {
                      //если текущая строка начинается с "+CMT",
                      //то следующая строка является сообщением
                      isStringMessage = true;
                    }
                    
                 if(currStr.startsWith("+CUSD")) // этот блок отлавливает ответ на запрос баланса и отправляет его смской
                    {
                       currStr = currStr.substring(currStr.indexOf("Balance"),currStr.indexOf("r"));
                       delay(2000);
                       Serial.println("AT + CMGS = \"+79819674444\""); // укажите свой номер!
                       delay(100);
                       Serial.println(currStr);
                       delay(100);
                       Serial.println((char)26);
                       delay(100);
                       Serial.println();
                    }   
               }
               
              currStr = "";
           }  
     
        else if('\n' != currSymb) 
          {
            currStr += String(currSymb);
          }
        
     }
        
  }

… и пробуем...



Для программного включения шилда (пин D9 Pwrkey), надо спаять два пятачка:



И добавить в код функцию:


void powerUpOrDown()
{
  pinMode(9, OUTPUT);
  digitalWrite(9,LOW);
  delay(1000);
  digitalWrite(9,HIGH);
  delay(2000);
  digitalWrite(9,LOW);
  delay(3000);
}



Ну вот, дальше всё зависит от Вашей фантазии, можно отправлять информацию, можно подключить реле и управлять чем угодно, а можно микрофон подключить и прослушивать что угодно...


А тут можно скачать библиотеку для разгона Arduino.


Задавайте вопросы на форуме...






Все права защищены © 2015 istarik.ru
При копировании указывайте активную ссылку на источник. Спасибо!
  • 0
  • 29479

Комментарии (8)

0
Здравствуйте, уважаемые.
  • avatar
  • sd80
0
При подключении шилда все светодиоды красные. Возле питания и на обратной стороне — 2 шт (один мигает. Подключил по инструкции. Нет только батарейки. Что может не так? Помогите
  • avatar
  • sd80
0
Видимо у нас разные шилды, у моего нет диодов снизу.
0
Виноват, неправильно написал расположение светодиодов. Один расположен возле кнопки включения — всегда горит красным. Два других — на той же стороне, но с другого края. Status горит, а NetLight мигает. Питание подавал от платы и от блок питания — результат не менялся. Симка активирована.
0
Нашел www.geeetech.com/wiki/index.php/Arduino_GPRS_Shield, но команда АТ отправляется на разных скоростях, а ответа нет (
  • avatar
  • sd80
0
Связь пошла — перемычки переставил, буду дальше разбираться
0
Эти скетчи на UNO должны работать?
Что то никак не компилируется. куча ошибок
0
Покажите ошибки.
  • avatar
  • stD
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.