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 Arduino. Seeeduino 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: https://www.jarzebski.pl/datasheets/SIM800_at-130723-1.01.pdf
SIM800 - Polecenia AT (BT): https://www.jarzebski.pl/datasheets/SIM800_bt-131107-1.00.pdf
SIM800 - Polecenia AT (FM): https://www.jarzebski.pl/datasheets/SIM800_fm-131008-1.00.pdf
SIM900 - Polecenia AT: https://www.jarzebski.pl/datasheets/SIM900_at-131212-1.09.pdf
SIM900 - Polecenia AT (HTTPS): https://www.jarzebski.pl/datasheets/SIM900_https-121018-1.00.pdf
SIM900 - Polecenia AT (MMS): https://www.jarzebski.pl/datasheets/SIM900_mms-121012-1.02.pdf
SIM908 - Polecenia AT: https://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ń.
- #include <SoftwareSerial.h>
- SoftwareSerial gsm(2, 3); // Piny 2 i 3 do komunikacji z SIMxxx
- String atCommand;
- void setup()
- {
- pinMode(9, OUTPUT);
- digitalWrite(9, HIGH);
- delay(500);
- digitalWrite(9, LOW);
- // Ustawiamy transmisje na 9600 bodow Arduino--PC
- Serial.begin(9600);
- // Czekamy na inicjalizacje
- while (!Serial) {
- }
- // Ustawiamy transmisje na 9600 bodow SIMxxx-Arduino
- gsm.begin(9600);
- }
- void loop()
- {
- // Jesli SIMxxx wysyla nam dane, odbieramy i wysylamy na port szeregowy
- if (gsm.available())
- {
- Serial.write(gsm.read());
- }
- // Odczytujemy nasze polecenie
- while (Serial.available())
- {
- delay(10);
- if (Serial.available() > 0)
- {
- char c = Serial.read();
- atCommand += c;
- }
- }
- // Jesli jest polecenie, wyslij do moduly GSM
- if (atCommand.length() > 0)
- {
- gsm.println(atCommand);
- atCommand = "";
- }
- }
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".
- #include <SoftwareSerial.h>
- SoftwareSerial gsm(2, 3); // Piny 2 i 3 do komunikacji z SIMxxx
- String atCommand;
- String numerTelefonu;
- String trescSMS;
- void setup()
- {
- pinMode(9, OUTPUT);
- digitalWrite(9, HIGH);
- delay(500);
- digitalWrite(9, LOW);
- // Ustawiamy transmisje na 9600 bodow Arduino--PC
- Serial.begin(9600);
- // Czekamy na inicjalizacje
- while (!Serial) {}
- // Ustawiamy transmisje na 9600 bodow SIMxxx-Arduino
- gsm.begin(9600);
- }
- String odczytajNumerTelefonu()
- {
- String numer = "";
- Serial.println("Wpisz numer telefonu.");
- // Czekamy az wpiszemy cos w konsole
- while (!Serial.available()) {}
- // Odczytujemy z konsoli do zmiennej
- while (Serial.available())
- {
- delay(5);
- if (Serial.available() > 0)
- {
- char c = Serial.read();
- numer += c;
- }
- }
- return numer;
- }
- String odczytajTrescSMS()
- {
- String tresc = "";
- Serial.println("Wpisz tresc SMS.");
- // Czekamy az wpiszemy cos w konsole
- while (!Serial.available()) {}
- // Odczytujemy z konsoli do zmiennej
- while (Serial.available())
- {
- delay(5);
- if (Serial.available() > 0)
- {
- char c = Serial.read();
- tresc += c;
- }
- }
- return tresc;
- }
- void gsmAnswer(void)
- {
- // Czekamy az modul odpowie
- while (!gsm.available()) {}
- // Wyswietlamy odpowiedz
- while (gsm.available())
- {
- delay(5);
- if (gsm.available() > 0)
- {
- Serial.write(gsm.read());
- }
- }
- }
- // Wysylanie komendy AT
- void gsmCommand(String cmd)
- {
- gsm.print(cmd);
- gsm.print("r");
- gsmAnswer();
- }
- // Wysylanie SMS
- void gsmSMS(String phone, String message)
- {
- gsmCommand("AT+CMGF=1");
- gsmCommand("AT+CSCS=\"GSM\"");
- gsmCommand("AT+CMGS=\""+phone+"\"");
- gsm.print(message);
- gsm.print((char)26);
- gsmAnswer();
- }
- void loop()
- {
- gsmCommand("AT");
- numerTelefonu = odczytajNumerTelefonu();
- trescSMS = odczytajTrescSMS();
- Serial.println();
- Serial.print("numerTelefonu=");
- Serial.println(numerTelefonu);
- Serial.print("trescSMS=");
- Serial.println(trescSMS);
- Serial.println();
- gsmSMS(numerTelefonu, trescSMS);
- Serial.println();
- }
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:
Reklama
Komentarze

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?

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

Przewalczyłem to a opisałem to tutaj:
http://maciej.kuzmiak.net/2015/04/28/sim900a-a-europejskie-karty-gsm/

Wielkie dzięki za tą informację.

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 :(

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

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);

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

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

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

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

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.

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.

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ł?

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?

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

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.

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/

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

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

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

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.

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 .

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 :)

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

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ę.

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ść?

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.

"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

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. ;-)

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.

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

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?

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

Ś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 :)

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

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

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....

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ł

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

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...

Witam. Czy ktoś mógłby mi podpowiedzieć co mogłem przestawić w module że nie loguje się do sieci? W ogóle jakby nie miał zasięgu. Wcześniej wszystko działało ale bawiąc się komendami AT coś przestawiłem. A wpisywałem różne próbując rozkminić do czego są. Człowiek w końcu uczy się na błędach nie?:)

Dzień dobry, dziękuję za dobry wpis, jednak mam problem: mam nakładkę SIM900, ale przy wgraniu sketchu pojawiają się błędy:
Podczas ładowania szkicu wystąpił błąd
avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x00
initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
stk500_disable(): protocol error, expect=0x14, resp=0x00
Czy ktoś wie, czemu tak się robi i jak można temu zapobiec?

Cześć
Zastanawia mnie czy ten moduł ma możliwość obsługi/rozpoznania wciśniętego klawisza podczas rozmowy. Studiuję manuala z kodami AT ale nie mogę znaleźć komendy, która by to rozwiązywała.
Dla wyjaśnienia przykładowo moduł dzwoni odtwarza przez złącze mikrofonowe nagranie i oczekuje na rozmówcę aż wciśnie na klawiaturze jedną z cyfr.
Pozdrawiam :)

Czy jeśli ustawię automatyczne odrzucenie połączeń głosowych (AT+GSMBUSY=1) to mogę w programie wykryć próbę połączenia i ją obsłużyć?

Witam. Od niedawna zaczęłam swoją przygodę z arduino. Obecnie chciałabym poznać zasady działania modułu sim. Posiadam płytkę leonardo z wbudowanym modułem SIM800C. Próbowałam uruchomić pierwszy kod lecz nie dostaję informacji zwrotnych na konsoli. Dioda miga co 3s i zasilanie jest również odpowiednie. Czy ktoś orientuje się jak ustawić prawidłowo piny RX i TX?
Z góry dziękuję za wszelkie wskazówki
Pozdrawiam