SantyagoSantyago
YouTube RSS Google+ Facebook GitHub

Newsletter Arduino

Zapisz się do Newslettera, aby otrzymać informację o nowych wpsiach w dziale Arduino!

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Sprzęt dostarczają

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Popularne wpisy

Facebook

Google+

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Moduły GSM SIM800/SIM900/SIM908

SIMCom Wireless Solutions posiada w swojej ofercie bardzo szeroką gamę układów GSM/GPRS z którymi można komunikować się za pomocą interfejsu UART i poleceń AT. W Polsce możemy znaleźć wiele ciekawych modułów z tymi układami, które z powodzeniem wykorzystamy w naszych projektach. Nie sposób się domyślić, że wysyłanie, czy odbieranie chociażby wiadomości SMS otwiera nam zupełnie nowe możliwości w realizacji naszych celów.

Firma oferuje swoje układy w różnych wersjach, znacznie różniącymi się cenami, ale i również możliwościami.

Przyjrzyjmy zatem się trzem wartych uwagi układom SIM800H, SIM900 oraz SIM908.

   

Wszystkie wymienione układy działają z sieciami komórkowymi GSM w czterech częstotliwościach 850/900/1800/1900MHz oraz obsługują pakietowego przesyłania danych GPRS z prędkością do 85.6 kbps. Moduły oprócz wysyłania i odbierania wiadomości SMS, pozwalają również na wykonywanie i odbieranie połączeń głosowych z obsługą kodeków Tricodec i AMR. W zależności od modelu, udostępniają dodatkowe interfejsy takie jak GPIO/PWM/ADC/I2C/SPI/RTC, a nawet USB.

Czym zatem różnią się moduły od siebie?

Podstawowa wersja SIM900 posiada programową obsługę protokołów TCP/UDP oraz FTP/HTTP, natomiast wersja SIM800H rozszerza je o dodatkowe kwestie takie jak wiadomości MMS, wysyłanie wiadomości e-mail, DTMF, nagrywania audio oraz TTS.

Jeśli chodzi zaś o układ SIM908, to w stosunku do modelu SIM900 dostajemy dodatkową możliwość odbierania sygnału GPS, którego z kolei SIM800H  nie posiada, ale rekompensuje to innymi dodatkami jak: Bluetooth w standardzie 3.0+EDR oraz obsługą  radia FM 76~109MHz.

Jeśli interesuje nas tylko wysyłanie i odbieranie wiadomości SMS, wystarczy nam standardowa wersja SIM900.

  SIM800H SIM900 SIM908
Obsługiwane częstotliwości 850/900/1800/1900MHz
Moc transmisyjna Klasa 4 (2W) @ 850/900MHz
Klasa 1 (1W) @ 1800/1900MHz
GPRS 85.6kbps download
85.6kbps upload
85.6kbps download
42.8kbps upload
TCP/IP Tak
SMS MT. MO, CB, Text, PDU
Przechowywanie SMS na karcie SIM Tak
Audio Half Rate (ETS 06.20)
Full Rate (ETS 06.10)
Extended Full Rate (ETS 06.50-80)
AMR
Echo Cancellation
Noise Suppression
Port szeregowy 1200bps - 115200bps
RTC Tak
GPS Nie Nie Tak
Bluetooth Tak Nie Nie
Interfejs USB Tak Nie Nie
Radio FM Tak Nie Nie

Przykładowe moduły, które wystarczy tylko podłączyć

Zanim zaczniemy naszą przygodę z sieciami komórkowymi, radiem FM, czy odbiornikiem GPS, chciałbym przedstawić Wam tylko przykładowe moduły wykorzystujące wspomniane układy. Różnią się one nie tylko funkcjami jakie oferują, ale również sposobem podłączenia do Arduino, a także ogólnym przeznaczeniem.

Wszystkie poniższe moduły znajdziecie w sklepie elty.pl, dzięki któremu mam okazję podzielić się z Wami dzisiejszym wpisem.

ICOMSAT 1.1

ICOMSAT 1.1 to moduł produkcji ITEADSTUDIO, który został wyposażony w podstawowy uklad SIM900 pełniący rolę shielda dla naszego Arduino. Na dodatkowym wyposażeniu znajdziemy antenę oraz konektor RP-SMA, dzięki któremu możemy wyprowadzić antenę poza obudowę urządzenia.

Na PCB znajdują się również dodatkowe linie układu SIM900, do których w razie potrzeby możemy przylutować goldpiny. Jak na shieldy przystało, dostępne są również gniazda będące przedłużeniem pinów Arduino oraz belka konfiguracyjna, gdzie za pomocą dwóch zworek wygodnie dobierzemy na jakich pinach Arduino ma odbywać się komunikacja UART (RX / TX).  Jest to bardzo przydatna cecha w przypadku korzystania z Arduino UNO, ponieważ podpinając sygnały RX/TX pod analogiczne piny Arduino, zablokujemy sobie nie tylko możliwość podglądu w Serial Monitorze, ale również utrudnimy sobie wgrywanie nowych szkiców. Co prawda, będziemy musieli pomóc sobie wtedy biblioteką SoftwareSerial, ale o tym za chwilę.

W samym rogu znajdują się trzy przyciski: włączenia zasilania, resetowania układu SIM900 oraz resetu Arduino.  Mamy również przełącznik, za pomocą którego możemy zdecydować, czy komunikacja będzie odbywała się za pomocą UART, czy będziemy korzystać do tego celu z gniazda Debug. Oczywiście nie mogło zabraknąć wejścia mikrofonu i wyjścia głośników.


Seeeduino GPRS

Seeeduino GPRS to kolejny ciekawy moduł, który tak naprawdę ciężko nazwać modułem, ponieważ do działania nie jest wymagane w ogóle ArduinoSeeeduino GPRS jest bowiem kolejnym "klonem" Arduino :) tada! Ale za to jakim?!

Na płytce oprócz układu SIM800H znalazła się atmelowska ATmega32U4 z bootloaderem Leonardo (a więc nie spotkamy tu niedogodności z pinami RX/TX jak w Uno). Natomiast za pomocą specjalnego przełącznika możemy decydować, czy chcemy pracować w logice 5V, czy w logice 3.3V.

Jak wspomniałem wcześniej, układ SIM800H to również obsługa radia FM oraz Bluetooth 3.0,  dlatego na płytce znajdue się antena BT Rainsun oraz złącze anety GSM/FM

Jeśli chodzi o gniazda, to mamy do dyspozycji 3.5mm gniazdko słuchawek telefonicznych z mikrofonem oraz  trzy diody sygnalizacyjne, które będą nas informować o zasilaniu, statusie operacji modułu i aktywnego połączenia internetowego.


Phone Shield SIM908

Ostatnim, lecz wcale nie najgorszym, jest Phone Shield SIM908 - prawdziwy shield edukacyjny wyposażony w układ SIM908, a dający możliwość odczytywania pozycji GPS. Dzięki Arduino oraz tego modułu, bez żadnych dodatkowych elementów możemy zrobić sobie telefon. Na płytce znajduje się więc mikrofon, głośnik oraz wszystkie wyprowadzenia SIM908. Oczywiście tutaj również możemy skorzystać z zestawu słuchawkowego. Na wysposażeniu tego modułu znajdziemy więc antenę GPS oraz dodatkową płytkę PCB, do której możemy ją wygodnie przymocować.

Komendy AT - kluczem do sukcesu!

Kiedy już wybierzemy odpowiedni moduł spełniający nasze wymogi, koniecznie musimy się zapoznać z komendami AT, za pomocą których dogadamy się naszymi układami. Musicie mi uwierzyć na słowo, że nie sposób wszystkich dokładnie opisać w jednym artykule, dlatego zajmemy się tylko kilkoma przykładowymi.

Dla ciekawskich i dociekliwych, na tacy stosowne PDF-y:

SIM800 - Polecenia AT: http://www.jarzebski.pl/datasheets/SIM800_at-130723-1.01.pdf
SIM800 - Polecenia AT (BT): http://www.jarzebski.pl/datasheets/SIM800_bt-131107-1.00.pdf
SIM800 - Polecenia AT (FM): http://www.jarzebski.pl/datasheets/SIM800_fm-131008-1.00.pdf

SIM900 - Polecenia AT: http://www.jarzebski.pl/datasheets/SIM900_at-131212-1.09.pdf
SIM900 - Polecenia AT (HTTPS): http://www.jarzebski.pl/datasheets/SIM900_https-121018-1.00.pdf
SIM900 - Polecenia AT (MMS): http://www.jarzebski.pl/datasheets/SIM900_mms-121012-1.02.pdf

SIM908 - Polecenia AT: http://www.jarzebski.pl/datasheets/SIM908_at-111024-1.02.pdf

Pogadajmy z SIM900

Na początek zajmiemy się modułem z układem SIM900 pracującym Arduino UNO. Ponieważ Arduino UNO posiada tylko jeden port UART, możemy mieć później problemy z ponownym wgraniem szkicu. Najlepszym rozwiązaniem jest wybranie innych pinów TX / RX do komunikacji z naszym modułem SIM z wykorzystaniem biblioteki SoftwareSerial.

Pierwsze co musimy zrobić, to ustawić konfigurację zworek w module do komunikacji z Arduino. Jako RX wybierzemy pozycję 2, natomiast TX pozycję 3. Skoro Arduino musi odbierać to co wysyła moduł, a moduł odbierać to co wysyła Arduino, bibliotekę SoftwareSerial ustawiamy odwrotnie.

Istnieje kilka sposobów do porozmawiania z naszym modułem za pomocą różnych programów (np. minicom), ale my wykorzystamy do tego konsolę szeregową Arduino IDE. Niestety ma ona zasadniczy problem, mianowicie wysłanie czegoś na konsolę szeregową i zakończenie enterem nie spełni naszych oczekiwań. Dzieje się tak dlatego, ponieważ nie zostanie wysłany znak powrotu <CR>, który jest wymagany do zakończenia wysyłania polecenia do modułu i uzyskania od niego odpowiedzi. Na szczęście możemy tak napisać nasz program, aby wysyłał dodatkowo znak powrotu <CR>, gdy uzna, że na konsoli szeregowej nie pojawił się kolejny znak. Ta metoda będzie nam potrzebna jedynie do podglądania odpowiedzi przez konsolę, w normalnych warunkach będziemy wysyłali polecenia AT bez większych problemów.

Moduł IComSat posiada przycisk SIM900-POWER, którego przytrzymanie włącza/wyłącza moduł. Przycisk jest podłączony do 9 pinu Arduino, a więc możemy zrobić to programowo, podając stan wysoki na ten port o czasie trwania >400ms.

Dioda Status sygnalizuje nam zasilanie modułu SIM, natomiast dioda NET informuje nas o stanie połączenia z siecią.

  • Nie świeci - moduł nie jest uruchomiony
  • Świeci 64ms w odstępach 800ms - moduł nie zarejestrował się do sieci
  • Świeci 64ms w odstępach 3000ms - moduł zarejestrował się do sieci
  • Świeci 64ms w odstępach 300ms - aktywne połączenie GPRS

Ok - wgrajmy sobie nasz szkic do "gadnia" z modułem, a następnie włączmy konsole szeregową z prędkością 9600 bodów. W ten sposób wypróbujemy kilka podstawowych poleceń.

  1. #include <SoftwareSerial.h>
  2.  
  3. SoftwareSerial gsm(2, 3); // Piny 2 i 3 do komunikacji z SIMxxx
  4.  
  5. String atCommand;
  6.  
  7. void setup()  
  8. {
  9.   pinMode(9, OUTPUT);
  10.   digitalWrite(9, HIGH);
  11.   delay(500);
  12.   digitalWrite(9, LOW);
  13.  
  14.   // Ustawiamy transmisje na 9600 bodow Arduino--PC
  15.   Serial.begin(9600);
  16.  
  17.   // Czekamy na inicjalizacje
  18.   while (!Serial) {
  19.   }
  20.  
  21.   // Ustawiamy transmisje na 9600 bodow SIMxxx-Arduino
  22.   gsm.begin(9600);
  23. }
  24.  
  25. void loop()
  26. {
  27.   // Jesli SIMxxx wysyla nam dane, odbieramy i wysylamy na port szeregowy
  28.   if (gsm.available())
  29.   {
  30.     Serial.write(gsm.read());
  31.   }
  32.  
  33.   // Odczytujemy nasze polecenie
  34.   while (Serial.available())
  35.   {
  36.     delay(10);
  37.     if (Serial.available() > 0)
  38.     {
  39.       char c = Serial.read();
  40.       atCommand += c;
  41.     }
  42.   }
  43.  
  44.   // Jesli jest polecenie, wyslij do moduly GSM
  45.   if (atCommand.length() > 0)
  46.   {
  47.     gsm.println(atCommand);
  48.     atCommand = "";
  49.   }  
  50. }

Kilka podstawowych poleceń:

  • AT+CPIN? - sprawdzenie gotowości karty SIM
  • AT+CPIN - podanie kodu PIN jeśli jest wymagany
  • AT*PSPRAS? - pobranie ilości pozostałych prób wpisania kodu PIN
  • AT+CGMI - pobranie nazwy producenta
  • AT+CGMM- pobranie modelu modułu SIM
  • AT+CGSN - pobranie numeru IMEI
  • AT+COPN - pobranie listy operatorów
  • AT+COPS? - pobranie aktualnie wybranego operatora
  • AT+CSQ - pobranie jakości sygnału (0-31)
  • AT+CCALR? - czy moduł jest gotowy do połączeń (0-nie, 1-tak)

Wysłanie komendy AT do modułu SIM spowoduje jej wykonanie i wysłanie nam odpowiedzi (jeśli jest przewidziana dla polecenia) oraz statusu wykonania komendy OK lub ERROR.

 

Odblokowanie karty kodem PIN / PUK

Jeśli polecenie AT+CPIN? zamiast komunikatu READY, zwróci nam SIM PIN, oznacza to tyle, że musimy odblokować kartę. Polecenie AT*PSPRASS? powie nam z kolei, ile pozostało nam prób. Sprawdzimy najpierw reakcję na błędny PIN 0000, a następnie poprawny 1825. Po podaniu prawidłowego kodu PIN, ponowne wykonanie polecenia AT+CPIN? zwróci nam już komunikat READY.

Jeśli chcemy wyłączyć żądanie kodu PIN, musimy wysłać polecenie AT+CLCK="SC",0,"1825",1. Jeśli natomiast chcemy, aby kod PIN był wymagany, wysyłamy polecenie AT+CLCK="SC",1,"1825",1

Kod PIN możemy również zmienić na inny, wydając polecenie AT+CPWD="SC","1825","1234", gdzie podajemy obecny i nowy PIN. Po restarcie będziemy musieli już podać nowy PIN 1234.

No dobrze, a co w przypadku, gdy podamy 3 błędne kody PIN? Będziemy wtedy musieli posłużyć się kodem PUK, a trzecia nieudana próba wpisania PIN dodatkowo poinformuje nas o zablokowaniu karty SIM PUK. Wtedy musimy dodać co komendy CPIN jako pierszy kod PUK, natomiast jako drugi PIN: AT+CPIN="PUK","PIN"

Wysyłanie wiadomości SMS

Kiedy wiemy już jak wygląda komunikacja z modułem SIM, pominiemy fragment wysyłania komend z konsoli szeregowej i będziemy wysyłać je bezpośrednio z programu, dla ułatwienia w konsoli szeregowej będziemy mogli jedynie podać numer telefonu oraz treść wiadomości.

Tutaj musimy opanować kolejne polecenia:

  • AT+CMGF=1 - format wiadomości SMS (0 - PDU, 1 - Text)
  • AT+CSCS=? - lista obsługiwanych kodowań wiadomości SMS
  • AT+CSCS="GSM" - wybór podstawowego alfabetu wg. 3GPP TS 23.038 (bez znaków specjalnych)
  • AT+CSCS="UCS2" - wybór rozszerzonego alfabetu wg. ISO/IEC106 (ze znakami specjalnymi, np. polskimi ogonkami)
  • AT+CSCS? - aktualnie wybrane kodowanie
  • AT+CMGS - wysłanie wiadomości SMS
  • AT+CMGW - zapisanie wiadomości SMS
  • AT+CMSS - wysłanie zapisanej wiadomości SMS z pamięci (wcześniej zapisanej)

Polecenia AT+CMGS oraz AT+CMGW posiadają specjalny format, który musimy spełnić, składający się z kilku elementów:

  • AT+CMGS="+48numertelefonu"
  • <CR>
  • Wiadomość tekstowa do wysłania
  • <CTRL+Z>

Znak <CR> to oczywiście znak powrotu (Carrier Return), natomiast CTRL+Z wyślemy kodem 0x1A.

Ważna uwaga, przy poleceniu AT+CMGS podajemy numer odbiorcy, natomiast przy AT+CMGW numer nadawczy (czyli nasz) - wtedy wiadomość zostanie zapisana w pamięci jako niewysłana, a moduł zwróci nam jej indeks, który z kolei możemy podać do polecenia AT+CMSS=indeks,"numerodbiorcy".

  1. #include <SoftwareSerial.h>
  2.  
  3. SoftwareSerial gsm(2, 3); // Piny 2 i 3 do komunikacji z SIMxxx
  4.  
  5. String atCommand;
  6. String numerTelefonu;
  7. String trescSMS;
  8.  
  9. void setup()  
  10. {
  11.   pinMode(9, OUTPUT);
  12.   digitalWrite(9, HIGH);
  13.   delay(500);
  14.   digitalWrite(9, LOW);
  15.  
  16.   // Ustawiamy transmisje na 9600 bodow Arduino--PC
  17.   Serial.begin(9600);
  18.  
  19.   // Czekamy na inicjalizacje
  20.   while (!Serial) {}
  21.  
  22.   // Ustawiamy transmisje na 9600 bodow SIMxxx-Arduino
  23.   gsm.begin(9600);
  24. }
  25.  
  26. String odczytajNumerTelefonu()
  27. {
  28.   String numer = "";
  29.  
  30.   Serial.println("Wpisz numer telefonu.");
  31.  
  32.   // Czekamy az wpiszemy cos w konsole
  33.   while (!Serial.available()) {}
  34.  
  35.   // Odczytujemy z konsoli do zmiennej
  36.   while (Serial.available())
  37.   {
  38.     delay(5);
  39.     if (Serial.available() > 0)
  40.     {
  41.       char c = Serial.read();
  42.       numer += c;
  43.     }
  44.   }
  45.  
  46.   return numer;
  47. }
  48.  
  49. String odczytajTrescSMS()
  50. {
  51.   String tresc = "";
  52.  
  53.   Serial.println("Wpisz tresc SMS.");
  54.  
  55.   // Czekamy az wpiszemy cos w konsole
  56.   while (!Serial.available()) {}
  57.  
  58.   // Odczytujemy z konsoli do zmiennej
  59.   while (Serial.available())
  60.   {
  61.     delay(5);
  62.     if (Serial.available() > 0)
  63.     {
  64.       char c = Serial.read();
  65.       tresc += c;
  66.     }
  67.   }
  68.  
  69.   return tresc;
  70. }
  71.  
  72. void gsmAnswer(void)
  73. {
  74.   // Czekamy az modul odpowie
  75.   while (!gsm.available()) {}
  76.  
  77.   // Wyswietlamy odpowiedz
  78.   while (gsm.available())
  79.   {
  80.     delay(5);
  81.     if (gsm.available() > 0)
  82.     {
  83.       Serial.write(gsm.read());
  84.     }
  85.   }
  86. }
  87.  
  88. // Wysylanie komendy AT
  89. void gsmCommand(String cmd)
  90. {
  91.   gsm.print(cmd);
  92.   gsm.print("r");
  93.   gsmAnswer();
  94. }
  95.  
  96. // Wysylanie SMS
  97. void gsmSMS(String phone, String message)
  98. {
  99.   gsmCommand("AT+CMGF=1");
  100.   gsmCommand("AT+CSCS=\"GSM\"");  
  101.   gsmCommand("AT+CMGS=\""+phone+"\"");
  102.  
  103.   gsm.print(message);
  104.   gsm.print((char)26);
  105.  
  106.   gsmAnswer();
  107. }
  108.  
  109. void loop()
  110. {
  111.   gsmCommand("AT");
  112.  
  113.   numerTelefonu = odczytajNumerTelefonu();
  114.   trescSMS = odczytajTrescSMS();
  115.  
  116.   Serial.println();
  117.   Serial.print("numerTelefonu=");
  118.   Serial.println(numerTelefonu);
  119.   Serial.print("trescSMS=");
  120.   Serial.println(trescSMS);
  121.   Serial.println();  
  122.  
  123.   gsmSMS(numerTelefonu, trescSMS);
  124.  
  125.   Serial.println();    
  126. }

Zobaczmy zatem jak działa powyższy program:

Odbieranie i zarządzanie SMS

Kiedy będziemy nasłuchiwać komunikaty pochodzące z modułu SIM (w czym pomoże nam pierwszy program), a w międzyczasie nadejdzie nowa wiadomość tekstowa SMS, otrzymamy informację o tym zdarzeniu +CMTI: "SM",1  (gdzie SM oznacza pamięć karty SIM, natomiast 1 określa indeks wiadomości w pamięci)

Aby odczytać wiadomość, musimy wysłać polecenie AT+CMGR=x, gdzie x stanowi ów indeks.

Przy pierwszym odczytaniu wiadomości SMS, jest oflagowana jako nieprzeczytana REC_UNREAD. Ponowne odczytanie tej wiadomości będzie już miało flagę REC_READ, ponieważ odczytaliśmy już wiadomość za pierwszym razem. Gdybyśmy jednak chcieli, aby odczytanie wiadomości SMS nie zmieniało jej flagi, oprócz indeksu komendy AT+CMGR dodajemy parametr 1: AT+CMGR=1,1


Gdy będziemy chcieli wyświetlić wszystkie wiadomości na karcie SIM, musimy wysłać polecenie AT+CMGL. Niepodanie dodatkowego parametru wyświetli tylko nieprzeczytane wiadomości. Dozwolone parametry to:

  • "REC UNREAD" - nieprzeczytane, odebrane wiadomości
  • "REC READ" - przeczytane, odebrane wiadomości
  • "STO UNSENT" - przechowane, niewysłane wiadomości
  • "STO SENT" - przechowane, wysłane wiadomości
  • "ALL" - wszystkie wiadomości

Wywołanie AT+CMGL="ALL" spowoduje zatem pobranie wszystkich wiadomości, ale również sprawi, że nieprzeczytane wiadomości zmienią się na przeczytane. Ponownie - gdybyśmy chcieli, aby polecenie nie zmieniło obecnego statusu, dodajemy parametr 1: AT+CMGL="ALL",1

Aby usunąć wiadomość, wydajemy polecenie AT+CMGD=x, gdzie "x" stanowi indeks wiadomości.

Wiadomości zawierające polskie znaki diakrytyczne, automatycznie kodowane są UCS-2 przez nadawcę i też w takiej formie również je odczytamy. Zmiana kodowania na UCS2 sprawi, że numer nadawcy również będzie zakodowany w UCS2. Tablicę znaków UCS2 znajdziecie tutaj.

Aby usunąć wszystkie wiadomości lub konkretną grupę skorzystamy z polecenia AT+CMGDA, gdzie jako parametr podajemy grupę wiadomości:

  • "DEL READ" - usunięcie przeczytanych wiadomości
  • "DEL UNREAD" - usunięcie nieprzeczytanych wiadomości
  • "DEL SENT" - usunięcie zapisanych, wysłanych wiadomości
  • "DEL UNSENT" - usunięcie zapisanych,niewysłanych wiadomości
  • "DEL INBOX" - opróżnienie skrzynki odbiorczej
  • "DEL ALL" - usunięcie wszystkich wiadomości.

Aby móc podać grupę wiadomości, musimy operować na wiadomościach tekstowych (AT+CMGF=1)

Wykonwyanie połączenia głosowego

Po ówczesnym podłączeniu słuchawek i mikrofonu (lub zestawu słuchawkowego) możemy spróbować wykonać pierwsze połączenie głosowe. Do wykonania połączenia posłużą nam dwie komendy:

  • ATD+48xxxxxxx; - wykonanie połączenia z podanym numerem (zakończone średnikiem)
  • ATH - rozłączenie połączenia

Korzystając tylko z powyższych poleceń, nie będziemy wiedzieć o fakcie odebrania połączenia przez wybrany przez nas numer, otrzymując od razu po wybraniu numeru  komunikat OK. Kiedy nasz rozmówca odbierze i sam zakończy połączenie, my otrzymamy kolejny komunikat NO CARRIER. Oczywiście w każdym momencie, możemy sami rozłączyć połączenie poleceniem ATH.

Aby uzyskać te dodatkowe informacje, musimy wysłać wcześniej jeszcze jedno polecenie:

  • AT+COLP=1 - informacje o wybranym numerze (1-tak, 0-nie)

W ten sposób uzyskamy dodatkową informację w formacie +COLP: "+48xxxxxx",145,"","" i dopiero po odebraniu połączenia status OK. Po zakończeniu rozmowy przez odbiorcę, otrzymamy kolejny komunikat NO CARRIER. My możemy przerwać  połączenie w dowolnym momencie poleceniem ATH.

Dodatkowymi komunikatami kończącymi połączenie, oprócz NO CARRIER mogą być:

  • NO DIALTONE - brak sygnały wybierania
  • BUSY - numer zajęty
  • NO ANSWER - brak odpowiedzi

Odbieranie połączenia głosowego

Kiedy będziemy wykonywali połączenie z telefonu do naszego modułu, w konsoli powinniśmy zobaczyć komunikat RING. Do odebrania połączenia głosowego posłużą komendy:

  • ATA - odebranie połączenia
  • ATH - rozłączenie trwającego / odrzuczenie przychodzącego połączenia

Należy jednak zwrócić uwagę, że moduł SIM informuje nas tylko o zdarzeniu przychodzącego połączenia, ale nie wiemy kto do nas dzwoni.

Aby uzyskać taką informację, musimy wydać wcześniej następujące polecenie:

  • AT+CLIP=1 - informowanie o numerze telefonu rozmowy przychodzącej (1-tak, 0-nie)

Jak widzimy, zakończenie połączenia nie zwróciło komunikatu NO CARRIER, ponieważ sami zakończyliśmy połączenie poleceniem ATH.

Czasami może się zdarzyć, że nie chcemy w ogóle odbierać połączeń przychodzących (ponieważ będzie to maszyna do SMS-ów). Możemy automatycznie odrzucać przychodzące połączenia wydając polecenie AT+GSMBUSY=1. Pamiętajmy jednak, że do takiego wariantu najlepiej wyłączyć u operatora pocztę głosową :) Pozwolenie na odbieranie połączeń przychodzących przywracamy poleceniem AT+GSMBUSY=0.

Radio FM

 

Jak wspomniałem wcześniej, moduł SIM800H posiada dodatkowo wbudowane radio FM 87.5 MHZ - 108.0MHZ. Do obsługi wystarczy nam kilka poleceń AT:

  • AT+FMOPEN=1 - włączenie zasilania radia (1-tak, 0-nie)
  • AT+FMCLOSE - wyłączenie zasilania radia
  • AT+FMFREQ=930 - wybranie częstotliwości 93.0MHz (zakres 875 - 1080)
  • AT+FMVOLUME=6 - ustawienie głośności (0-6)
  • AT+FMSCAN - automatyczne przeszukiwanie częstotliwości radiowych
  • AT+FMSIGNAL=930 - pobranie siły sygnału dla częstotliwości 93.0MHz (zakres 875 - 1080)

Aby usłyszeć cokolwiek w słuchawkach, musimy jeszcze zamienić kanały audio polecenie:

  • AT+CHFA=0 - zmiana kanałów audio (0 - normal audio, 1 - AUX)

Do wydania powyższych poleceń możemy posłużyć się naszym pierwszym programem, ale należy zmienić linię:

SoftwareSerial gsm(2, 3);

na:

SoftwareSerial gsm(8, 7);

Po ponownym wgraniu programu do Seeeduino GPRS (pamiętajcie o zmianę typu programowanej płytki na Leonardo) możemy cieszyć się radiem FM.

Jeśli nie znamy częstotliwości, możemy posiłkować się automatycznym skanowaniem:


Udpstępnij dalej!

http://www.jarzebski.pl/arduino/komponenty/moduly-gsm-sim800-sim900-sim908.html

Reklama

Komentarze Komentarze
Avatar 1
SIM900A a SIM900 Windows XP / Safari 537.36
20 kwiecień 2015 - 17:07 Lublin

A czy układ dwuzakresowy (900,1800 MHz) SIM900A będzie w pełni kompatybilny z wszystkimi sieciami w Polsce czy czterozakresowy SIM900 będzie niezbędny?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
22 kwiecień 2015 - 00:43 Bytom

SIM900A jest na rynek azjatycki i nie będzie działał w PL. Ale idzie na to podziałać, podmieniając firmware.

Avatar 1
MacKuz Windows XP / Mozilla Firefox 37.0
10 maj 2015 - 21:35 Warszawa
Avatar 1
javi Windows 7 / Mozilla Firefox 40.0
19 wrzesień 2015 - 23:15 Poznań

Wielkie dzięki za tą informację.

Avatar 1
adam Windows 7 / Mozilla Firefox 39.0
04 sierpień 2015 - 23:57 Białystok

Podczas weryfikacji skecza w linijce mySerial.println("AT+cscs="gsm"");
pojawia się błąd:
sketch_aug04a.ino: In function \'void setup()\':
sketch_aug04a:12: error: expected \')\' before \'gsm\'
sketch_aug04a:14: error: expected \')\' before string constant
expected \')\' before \'gsm\'

Nie wiem jak rozwiązać problem podwójnych nawiasów :(

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 39.0
05 sierpień 2015 - 21:15 Bytom

Nijak :) błąd w listingu - poprawione, powinno działać

Avatar 1
adam Windows 7 / Mozilla Firefox 39.0
06 sierpień 2015 - 17:46 Białystok

Problem rozwiązany. W moim arduino działa taki zapis:
mySerial.println("AT+cmgf=1");
delay(2000);
mySerial.println("AT+cscs="gsm"");
delay(2000);
mySerial.println("AT+cmgs="+48xxxxxxxxx"");
delay(2000);
mySerial.write("test sms");
delay(2000);
mySerial.write(0x1A);

Avatar 1
monk Windows 7 / Mozilla Firefox 47.0
24 kwiecień 2017 - 08:48 Gdańsk

nie przyjął linii:
mySerial.println("AT+cmgs="+48xxxxxxxxx"");

dopiero gdy usunąłem podwójny cudzysłów i zostawiłem tak:
mySerial.println("AT+cmgs=+48xxxxxxxxx");
wtedy kompilator przyjął
(Arduino Uno3)

Pozdrawiam
TT

Avatar 1
adam Windows 7 / Mozilla Firefox 39.0
06 sierpień 2015 - 17:49 Białystok

Nie potrafię w tym miejscu wkleić poprawnego kodu ponieważ są wycinane ukośniki lewe. W każdm razie zapis jest taki:
mySerial.println("AT+cscs= ukośnik lewy "gsm ukośnik lewy "");
Analigicznie w linijce AT+smgs

Avatar 1
Krzysztof Szeremeta (kszere) Windows 7 / Safari 537.36
10 wrzesień 2015 - 21:42 Brak informacji

SIM800L dodasz do wpisu lub napiszesz więcej o nim? :)

Avatar 1
Krzysztof Szeremeta (kszere) Windows 7 / Safari 537.36
10 wrzesień 2015 - 22:48 Brak informacji

Poprawka. Czym wgl różni się SIM800L od SIM800?

Avatar 1
mr_x Linux Ubuntu / Mozilla Firefox 41.0
04 październik 2015 - 03:24 Brak informacji

A co sądzisz o module G510-Q50-00 (oraz wersja OpenCPU) lub innych firmy Fibocom? Ostatnio zacząłem przyglądać się modułom GSM z obsługą stosu TCP/IP (może być tylko GPRS, ważny jest ten stos, bo to do współpracy z AT89S8253), czytałem sporo o modułach SIM w EP, ale przeglądając TME, znalazłem o wiele tańsze moduły G510, również z TCP/IP. A skoro tańsze, to nie wiem, czy nadal patrzeć na moduły SIM, ale z kolei z G510 mało można znaleźć w sieci informacji.

Avatar 1
Mariusz Windows 7 / Mozilla Firefox 41.0
31 październik 2015 - 09:41 Kęty

Ma ktoś sprawdzony firmware do SIM900A, tak żeby działał u nas? Na niektórych wsadach po kilkunastu minutach nie ma możliwości wysyłania sms, tak jakby moduł zawieszał się. Może ktoś miał podobną przypadłość. Jeszcze jedno, nie wiem dlaczego nie można praogramować go z prędkością większą niż 38400 na rsie.

Avatar 1
Kamis_ Windows / Mozilla Firefox 41.0
08 listopad 2015 - 11:07 Warszawa

Cześć mam problem z tym modułem i Arduino Leonardo. Po wgraniu programu i wpięciu mogułu gsm do Arduino to poprostu nic sie nie dzieje, wpisuje komendy AT w konsoli i też nic... kontrolki PWM i Status ciągle świecą a net miga co 3s (to akurat dobrze) macie jakieś pomysł?

Avatar 1
Tomek Linux / Safari 537.36
26 listopad 2015 - 14:30 Brak informacji

Mam moduł SIM800L - komunikacja z nim przebiega poprawnie - ale nie potrafi się połączyć do sieci. W internecie ludzie piszą, że on obsługuje tylko karty SIM kompatybilne z 2G - a większość kart sim to 3G i nie jest kompatybilna wstecz. Wie ktoś coś na ten temat? Albo czy jak zmienię moduł z SIM800L na jakiś z opisywanych tutaj to problem zniknie?

Avatar 1
Mati Windows 7 / Safari 537.36
07 grudzień 2015 - 19:18 Lublin

Też mam problem z SIM800L :/ Jakieś pomysły?

Avatar 1
marcinozog Windows / Safari 537.36
11 grudzień 2015 - 22:39 Brak informacji

Mam dwa moduły z chin z 800L, działają bez problemu, ale czasem potrzebuje minutę a może i dłużej zanim się zaloguje do sieci. Ale to można sprawdzić odpowiednimi komendami AT. Dziś uruchomiłem go razem z modułem gps do logowania.

Avatar 1
Adam Piersa Windows 7 / Safari 537.36
22 styczeń 2016 - 22:42 Warszawa

To komentarz dla tych którym modem łączy się 2-3 minuty do sieci. Aby to rozwiązać należy zapewnić modemowi odpowiednie zasilanie około 4V i minimum 1.5A wydajności podczas połączenia z siecią występują skoki poboru prądu i jeśli źródło jest niewydajne modem się resetuje i próbuje łączyć się ponownie co wygląda jakby wcale niezgasła tylko cały czas próbował się łączyć. Dodatkowo zastosowałem kondensator 2000uF na zasilaniu (powinien wystarczyć 1000uF ale takiego nie posiadałem pod ręką).

Fajnie jak byś opisał w ramach artykułu jak się łączyć przez GPRS i wysłać dane TCP/UDP na serwer PHP ? to jest ciekawsze od wysyłania smsów :)
Wczoraj w nocy zrobiłem wysyłanie temperatury z czujnika DS na serwer http://temp.cr2.pl/

Avatar 1
Kody USSD Windows / Safari 537.36
07 luty 2016 - 21:49 Brak informacji

Czy te moduły bez problemu obsługują kody USSD (np *101#)?

Avatar 1
Kody USSD Windows / Safari 537.36
07 luty 2016 - 22:43 Brak informacji

Czy te moduły obsługują kody USSD (np *101#)?

Avatar 1
fxrider Windows XP / Mozilla Firefox 43.0
08 luty 2016 - 22:10 Lublin

odnośnie USSD: na SIM800L działają
AT+CUSD=1
ATD*101#

lub

ATD+CUSD=1,"*101#"

po kilku sekundach przychodzi odpowiedź, n.p.:

+CUSD: 0, "Pozostalo Ci 5,00zl do wykorzystania do 2016-02-18 23:59:59. Dodatkowo w ramach srodkow promocyjnych masz 0,00 zl do wykorzystania do 2016-02-09 23:59:59.", 15

Avatar 1
fxrider Windows XP / Mozilla Firefox 43.0
08 luty 2016 - 22:30 Lublin

Odnośnie różnic pomiędzy SIM800/SIM800H a SIM800L to w.g. danych producenta ten ostatni nie ma modułu bluetooth i ma mniej pamięci flash.

Avatar 1
Kamil Windows / Safari 537.36
24 luty 2016 - 19:08 Warszawa

Witam
proszę o pomoc nie mogę wysyłać wiadomości z arduina(+sim900) na telefon
Mógłby ktoś wrzucić najprostszy kod do wysyłania sms na dany nr.
BARDZO DZIĘKUJĘ ZA POMOC .

Avatar 1
Hubert Windows 7 / Safari 537.36
06 marzec 2017 - 03:07 Warszawa

Nie siedzę w Arduino ale podpowiem Ci jak to zrobić :)
Jeżeli wiesz jak odpytywać moduł komendami AT z poziomu aplikacji to wysyłasz do niego po kolei wierszami co następuje:

1. "AT+CMGF=1r" // ustalenie trybu TEXT +
2. "AT+CSCS="GSM"r" // ustalenie kodowania znaków +
3. "AT+CMGS="XXXXXXXXX"r" // zamiast XXXXXXXXX numer komórki +
4. "Tresc SMS testowego" // treść smsa tym razem BEZ
5. "32r" // +

Pamiętaj o odstępach czasowych pomiędzy wiadomościami (ja mam 100ms)
i o czasie zwłoki na samym początku tak żeby karta po restarcie zalogowała się w sieci. Sposób sprawdzony i działa u mnie :)

Avatar 1
Hubert Windows 7 / Safari 537.36
06 marzec 2017 - 03:12 Warszawa

chyba powaliło się wyświetlanie na forum....
zamiast r powinno być backslashr
zamiast "GSM" powinno być backslash"GSMbackslash"
zamiast 32 powinno byc backslash032

Avatar 1
rs Windows / Safari 537.36
27 luty 2016 - 10:05 Warszawa

czy ktoś próbował bezpośrednio połączyć (namówić do współpracy poprzez GPIO) moduł GSM z ESP8266. Aż prosi się o takie rozwiązania.
Moduł ESP... w wersji 12 ma sporo wolnych GPIO które z powodzeniem można byłoby wykorzystać w module powiadomień GSM.
Rozwiązania z pośrednikami typu Arduino Atmega nie w chodzą w rachubę.

Avatar 1
total Windows 7 / Mozilla Firefox 44.0
14 marzec 2016 - 21:55 Lubartów

Witam
W Plusie odp na kod USSD *101# jest następująca:

atd*101#

+CUSD: 0,"Twoje zlecenie jest przetwarzane. Poczekaj na SMS potwierdzajacy. ",15

Jak to dalej ugryść?

Avatar 1
total Windows 7 / Mozilla Firefox 44.0
14 marzec 2016 - 23:22 Lubartów

Problem się rozwiązał.To dla posiadaczy Neoway M590E , zapominam o braku pamięci , a więc dodatkowo CSCS i CMGF przy każdym starcie!.
I reszta OK.

Avatar 1
ociepa222 Windows 8 / Safari 537.36
21 marzec 2016 - 16:51 Brak informacji

"AT+CMGS="+48numertelefonu"

Wiadomość tekstowa do wysłania

Znak to oczywiście znak powrotu (Carrier Return), natomiast CTRL+Z wyślemy kodem 0x1A."

O co chodzi Z tym CR ? Jak to wpisac ? i to samo z CTRL+Z

Avatar 1
#R2D2# Linux Ubuntu / Mozilla Firefox 45.0
24 marzec 2016 - 18:36 Bydgoszcz

Amerykanie tworząc tablicę ASCII dodali do niej litery, cyfry i kilka znaków specjalnych, takich jak kropka, przecinek, nawiasy. Oprócz tego dodali tam też znak nowej linii (którego zastosowanie jest chyba oczywiste) oraz znak powrotu karetki. Ten ostatni jest pozostałością po maszynach do pisania, w komputerach praktycznie nie miał zastosowania. Jednak sam ASCII przetrwał do dziś, a co za tym idzie te dziwne znaki również.
Znak "Substitute" (który w tym artykule został trochę myląco nazwany "Ctrl + Z") to znak sterujący (znajdował się w części sterującej tablicy ASCII).

Niestety, tych znaków sterujących, ani znaku powrotu karetki nie da się wpisać z klawiatury. Trzeba stosować inne metody. Znak powrotu karetki można w wielu przypadkach wpisać sekwencją "r". Znaku "Substitute" niestety nie wpiszesz w żaden sposób. Pozostaje rzutowanie typów, tak jak w przykładowym kodzie w artykule: "gsm.print((char)26)". Znak "Substitute" ma numer 26 w tablicy ASCII, więc zamieniasz liczbę 26 na znak i wysyłasz do modułu.

Rozpisałem się, ale mam nadzieję, że pomogłem. ;-)

Avatar 1
Arkadiusz Wernicki Windows / Safari 537.36
09 marzec 2017 - 21:46 Brak informacji

Znaki specjalne da się "wpisać" z klawiatury. Lewy ALT + kod znaku wpisany na numerycznej.
Poza tym, wiele tych "znaków" używacie. Tabulator (9), Esc(27), Enter(13). Znaki te służą do dzisiaj cicho i bez rozgłosu w wielu miejscach. Wszystkie Wasze pliki tekstowe tworzone w standardzie Microsoftu mają znak końca linii 0x0A, 0x0D (13,10). W systemach Unix\'owych i Linux\'owych używany jest tylko 0x0A(10). W plikach CSV można stosować jako separator znak (9) czyli TAB.

Avatar 1
#R2D2# Linux Ubuntu / Mozilla Firefox 45.0
24 marzec 2016 - 18:39 Bydgoszcz

Ucięło mi sekwencję (strona usuwa niebezpieczne znaki). Powinno być tak: [lewy ukośnik]r

Avatar 1
Grzegorz Windows 7 / Mozilla Firefox 47.0
18 lipiec 2016 - 09:30 Brak informacji

Witam, Super poradnik, podobnie jak zresztą cały serwis!
OK, jak już się podlizałem ;) to mam takie pytanie: operujesz tu bezpośrednio na komendach AT, a jak się to ma do zastosowania biblioteki GSM Arduino ? (https://www.arduino.cc/en/Reference/GSM)
Czy są jakieś przeciwskazania do użycia tej biblioteki? Limitacje?

Avatar 1
j4c0b Windows 7 / Mozilla Firefox 49.0
15 listopad 2016 - 16:08 Warszawa

a jak się do tego mają dostepne na aliexpress moduły a6 i a7?

Avatar 1
Hubert Bieganowski Windows 7 / Safari 537.36
22 styczeń 2017 - 21:41 Warszawa

Świetny tekst - naprawdę pomocny :)
Mam moduł SIM808(B) od Waveshare i jeszcze kilka spraw, na które nie znalazłem odpowiedzi:

1. AT+CCLK?

Zwraca informację o czasie od startu układu GSM, a nie info z sieci...

AT+CCLK?
+CCLK: "04/01/01,02:38:59+00"
OK

Wyczytałem gdzieś na forach, że jest to czas z RTC (który nie ma podtrzymania u mnie bateryjnego). W innych układach niż simcom da się to obrejść wyrejestrowując komórkę z sieci GSM (AT+COPS=2), ustawiając automatyczną strefę czasową (AT+CTZU=1) i ponownie rejestrując koma w sieci (AT+COPS=0). Po tym zabiegu AT+CCLK zwraca czas i datę z GSM... Niestety mnie nie udało się uzyskać info odnośnie +CTZU tak jakby SIM808 nie obsługiwał takiej funkcji... Czy jest jakiś inny sposób na synchronizację czasu RTC z sieci GSM?

2. AT+COPS? / AT+COPN

No właśnie/// U mnie po wydaniu polecenia +COPS? wyświetla numer operatora, a nie jak u Ciebie @Korneliusz nazwę PLAY:

AT+COPS?
+COPS: 0,0,"26006"
OK

Sprawdziłem i po prostu nie mam takiego operatora na liście :)
Wynik +COPN dla polskich operatorów to:

+COPN: "26001","Plus GSM"
+COPN: "26002","Era"
+COPN: "26003","IDEA Centertel"

coś stara ta lista...?? Jakiś upgrade firmware do najnowszej wrsji to zmienia?? Skąd wziąć taki plik i jak go wrzucić do modułu??

Dzięki z góry za info :)

Avatar 1
Hubert Bieganowski Windows 7 / Safari 537.36
22 styczeń 2017 - 22:24 Warszawa

Chyba sdam sobie poradziłem z opisanym powyżej problrmrm czasu lokalnego ale może komuś się to jeszcze przyda :)

W manualu AT_Commands wyczytałem co następuje odnośnie polecenia +CLTS (Get local Time Stamp):
"Support for this Command will be network dependent.
Set AT+CLTS=1, it means user can receive network time updating
and use AT+CCLK to show current time."

Aby poprawnie wyświetlić czas GSM przy pomocu polecenia +CCLK należy:
1. wyrejestrować komórkę z sieci
AT+COPS=2
OK

2. Ustawić wartość 1 jako parametr dla +CLTS
AT+CLTS=1
OK

3. Ponownie zarejestrować telefon w sieci (teraz w odpowiedzi widać będzie info o aktualizacji danych o czasie i strefie czasowej z sieci GSM)
AT+COPS=0

+CTZV: +4,0
*PSUTTZ: 2017,1,22,21,7,29,"+4",0
DST: 0
OK

4. Moduł sam zaktualizuje datę i czas lokalną :)
AT+CCLK?

+CCLK: "17/01/22,22:07:47+04"
OK

Pozdrawiam
Hubert

Avatar 1
Krzysztof Windows / Mozilla Firefox 51.0
20 luty 2017 - 20:25 Brak informacji

Jak sobie poradziłes z autoamtycznym uruchomieniem modułu? Mam taki sam i za każdym razem muszę wciskać przycik PWR.

Avatar 1
Hubert Windows 7 / Safari 537.36
06 marzec 2017 - 01:45 Warszawa

Ja swój moduł mam podłączony do STM32F746G-Discovery i jak próbuję sterować z poziomu pinu A5 to tylko mi migał ekran, bo Disco się restartowało... (po resecie podawać chciałem stan wysoki na ok. 2s ale od razu się resetował i tak w kółko....). Jak podałem +3,3V na A5 z CN6 to również Disco się restartowało ale jednak moduł uruchamiał się poprawnie. Nie o to jednak chodzi... Trzecie podejście przestestowałem gdy uruchamiam moduł (lub podaję na niego napięcie) z wciśniętym przyciskiem PWRKEY - działa i nie resetuje się tylko normalnie staruje z wciśniętym...Może na sztywno trzeba go zewrzeć? - Tyle, że nie będzie już wtedy można sterować z A5....

Avatar 1
revoltec112 Windows 7 / Safari 537.36
23 styczeń 2017 - 01:46 Warszawa

Witam, Mam pytanie czy do takiego modułu sim900 można podłączyć czujnik temperatury i zdalnie otrzymywać powiadomienia o zmianie temperatury ? czy masz może pomysł jak coś takiego prosto napisać ? prosze o pomoc jestem początkującym, Pozdrawiam Rafał

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 51.0
23 luty 2017 - 22:15 Bytom

samym modułem gsm raczej tego nie ogarniesz, chyba że będzie zintegrowany na płytce z mikrokontrolerem pod który podepniesz czujnik.

Avatar 1
Hubert Windows 7 / Safari 537.36
06 marzec 2017 - 02:02 Warszawa

A mnie się wydaje, że dałoby radę... Są wersje firmware tzw. Embedded AT (EAT) i one zachowują się trochę jak Arduino - można sterować pinami modułu z poziomu programu w samym module i mieć dostęp do różnych API...

W manualu do EAT Sim800 Series jak byk stoi:

"Embedded AT is mainly used for customer to do the secondary development with SIM800 series modules . SIMCOM provides the relative API functions , resource and operating environment. Customer’s APP code runs inner SIM800 series module, so we don’t need external MCU and save the cost."

... a do dyspozycji w samym tylko Peripheral API są funkcje dotyczące GPIO, SPI, PWM, EXTI, ADC...

Skomentuj wpis