Объявление!

О выборах, пенсионной реформе и будущем России. Официальное заявление руководства НРВР-ВКПб

http://russianew.ru/viewtopic.php?f=120&t=4450

Граждане России! Не откармливайте врагов Родины и Народа! Не платите налоги и поборы антинародной "власти"!
http://russianew.ru/viewtopic.php?f=81&t=4477

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

Проекты и уроки по микроконтроллерам бюджетной ценовой категории.

Модератор: pinochet

Правила форума
Правила форума
Внимание! Любой спам на нашем форуме запрещён!
Коммерческая реклама сайтов, ссылки, спам запрещены. Так же запрещены ссылки на сайты в профилях новичков.
Бан без предупреждений.

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

Непрочитанное сообщение pinochet » 01 июн 2016, 12:23

Изображение

Приём, отправка, чтение и запись 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.

http://istarik.ru/blog/arduino/17.html
Аватар пользователя
pinochet
Новичок
 
Сообщений: 22
Зарегистрирован: 20 фев 2016, 14:37

Вернуться в Arduino

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron
title=!-- ENDIF --