Je jich plný eBay a AliExpress, jejich cena začíná zhruba na stokoruně a pomocí UART převodníku je můžete prozkoumávat přímo ze svého počítače. O čem dnes bude řeč? Jak už jsem napověděl v názvu článku, tentokrát se stručně podíváme na jednoduché GSM modemy se sériovým rozhraním.
Prakticky všechny tyto levné moduly používají buď populární GSM čip SIM800L, anebo velmi podobný A6. Destičky jsou zpravidla připravené pro okamžité použití. To znamená, že na spodní straně nechybí slot pro SIM kartu, čip si poradí s českými komunikačními frekvencemi a vedle hlasu a SMS i s GPRS.
Různé moduly s GSM medemem SIM800L. Zatímco první modul má širokou nabídku pinů včetně těch pro mikrofon a reproduktor, druhý je jednodušší a nabízí jen RX/TX piny pro sériovou linku. To bohatě stačí na SMS i prozvánění.
No dobrá, ale jak se vlastně takový GSM modem ovládá? Pomocí sériové linky a AT příkazů. Já dnes ale modem nepřipojím skrze piny RX a TX pro sériovou linku třeba k Arduinu, ale pomocí převodníku přímo s počítačem, kde si ukážeme základní práci v sériovém terminálu.
Tento modul A6_Mini s GSM/GPRS modemem A6 od Ai Thinker použijeme v dnešním článku
Hayesovy příkazy
Každý podobný modem lze ovládat pomocí jednoduchých textových instrukcí. Dnes je známe jako tzv. AT příkazy (podle slovíčka ATtention – pozor, zpozornit), jejich historie ale sahá hluboko do 80. let minulého století. Stojí za nimi Dennis Hayes, který potřeboval nějaký jednoduchý příkazový jazyk pro svůj Hayes Smartmodem 300.
Řada Hayes Smartmodem byla první, která používala AT příkazy (Foto: Michael Pereckas)
Postupem času jednoduché instrukce převzali i další výrobci a vytvořili si vlastní dialekty. Některé AT příkazy pro základní operace tak zůstávají dodnes stejné, každý typ zařízení ale používá i hromadu vlastních specifických. Ostatně podrobná dokumentace Hayesových příkazů k GSM modemu A6 od čínského Ai Thinkeru, který použiji i já, čítá bezmála 200 stran v PDF.
Pojďme to připojit k počítači
Dost ale bylo omáčky, pojďme si to vyzkoušet v praxi. GSM modem si může během kritických okamžiků (příjem a vysílání) říci o relativně vyšší proud, jeho napájecí piny (VIN + a GND -) tedy připojím k samostatnému 5V zdroji.
Dále musím destičku připojit k počítači. GSM modem pochopitelně nemá USB konektor, budu tedy potřebovat zmíněný UART převodník, který má na jedné straně USB konektor a na druhé komunikační a napájecí piny. Jak už jsem ale napsal výše, proud z USB by nemusel stačit, a tak použiji externí zdroj.
UART převodník, který má na jedné straně USB konektor a na druhé piny pro sériovou komunikaci, a konečně celý obvod připojený vlevo k 5V zdroji a vpravo skrze převodník do počítače
GSM modemy zpravidla pracují s 3V logikou, tu tedy musí nabízet i převodník. Vyplatí se proto takový, který pracuje s oběma nejčastějšími napětími 3,3V a 5V a lze mezi nimi přepínat třeba pomoci jumperu.
Pak už stačí jen křížově propojit samotné komunikační piny sériové linky (RX na TX a TX na RX) a ještě propojit oba zdroje napětí pomocí GND (GND na převodníku s GND na externím zdroji).Tento modem zároveň potřebuje alespoň během startu připojit k napájení (VIN +) i pin PWR (Power – tím jej vlastně zapnu).
Převodník se ohlásil jako COM16 a po otevření linky v sériovém terminálu a spuštění modemu se zobrazily jeho startovací informace
Po připojení k PC se doinstalují ovladače a převodník se v systému ohlásí jako některý z portů COM. Pak už stačí spustit některý z terminálů sériové linky (třeba RealTerm), zvolit patřičný COM a ideálně komunikační rychlost 115 200.
Když teď zapojím zdroj modemu do elektrické sítě, nastartuje a v sériové lince se vypíše několik základních popisných informací. A pokud jsem už tuto sekvenci propásl, mohu správné zapojení a funkčnost modemu ověřit prvním základním AT příkazem ukončeným zalomením řádku:
AT
Pokud bude destička rozumět, měla by mi odeslat odpověď:
OK
Hurá! Můj GSM modem komunikuje.
Kdo jsi?
Dobrá, ale od GSM modemu chceme víc než jen prosté OK. Teď mu tedy v několika instrukcích přikážu, aby o sobě něco prozradil.
Základní představovací odpovědi GSM modemu
Začnu jakýmsi aboutem:
ATI
V terminálu se rázem zobrazí výrobce, model čipu, verze firmwaru a vše opět uzavře OK:
Ai Thinker Co.LTD
A6
V03.03.20160830011H03
OK
Před spuštěním modemu jsem do něj vložil SIM kartu, a tak se ho teď zeptám, jestli je v pořádku:
AT+CCID
Pokud ano, odpovědí mi bude sériové číslo karty SIM:
+SCID: SIM Card ID: 8942031016442791061F
OK
Karta může být chráněná pinem. Mohl bych jej zadat tímto příkazem:
AT+CPIN=1234
A pokud bych se chtěl stejným příkazem zeptat, jestli je PIN v pořádku:
AT+CPIN?
Tak a to je celá základní logika AT příkazů v kostce. Známe, jak zadávat základní parametry a jak se na něco ptát. Teď už pouze zbývá nastudovat desítky a stovky jednotlivých příkazů.
Ale nebojte se, my se jen podíváme na telefonní hovor a SMS.
Co se stane, když někdo zavolá?
Mám stále připojený sériový terminál a teď si z druhého telefonu na testovací SIM zavolám.
Vytáčím číslo GSM modemu, který začne do sériové linky posílat informaci o vyzvánění
Modem v tom případě začne posílat do sériové linky všeříkající sdělení:
RING
RING
RING
Pokud bych hovor potvrdil a měl bych na pinech pro hlasový vstup a výstup připojenou patřičnou audiotechniku, mohl bych hovor bez problému přijmout. Já však namísto toho virtuální sluchátko položím příkazem:
ATH
Bezplatný rádiový spouštěč
V jednom z předchozích dílů jsem si postavil Wi-Fi spínač běžné domácí elektrické sítě a mohl jsem z webového prohlížeče zapnout pokojovou lampu. Předchozího příkladu s příchozím hovorem bych mohl tedy využít ke spuštění lampy i pomocí mobilního signálu.
Wi-Fi spínač magnetického 230V relé bych mohl rozšířit i o GSM. Relé by se sepnulo/odpojilo, pokud by modem vyzváněl.
Mikropočítač by jednoduše čekal, dokud od modemu nedorazí klíčové slovo RING, načež vyzvánění ukončí a zapne, nebo naopak vypne lampu. Kouzlo spočívá v tom, že nemusím posílat v tomto případě relativně drahou SMS zprávu. Hovor, který nikdo nepřijme, mě totiž vůbec nic nestojí, ale už samo volání lze využít jako informaci.
A teď si zavolám
AT příkazem mohu podobným způsobem hovor také vyvolat:
ATD724669123
Jakmile tato instrukce dorazí do modemu, vytočí číslo. Hypotetický mikropočítač by mi tímto způsobem mohl sdělit, že se něco děje, aniž by mě to opět cokoliv stálo. Prostě mě jen prozvoní a vyzvánění třeba po třech sekundách sám ukončí. Do délky vyzvánění přitom mohu opět zakódovat nějakou jednoduchou informaci. Třeba: Prozvání mě telefonní modem déle než pět sekund? Mám doma lupiče!
V terminálu jsem vyslal příkaz k vytočení čísla svého telefonu. Modem oznámil, že telefon na druhé straně vyzvání (SOUNDER) Jelikož jsem ale hovor odmítl, modem nakonec ohlásil, že je obsazeno (BUSY).
Co se stane, když dorazí SMS
Jelikož GSM modem stále poslouchá a stav hlásí do sériové linky, podobně jako v případě hovoru sám ohlásí, že dorazila SMS. Jenže namísto hezky čitelného textu dorazí třeba takový guláš:
+CMT: ,30
07912470335489600040C91247042660920000071102112441140CCD41F45B0D6ABFC9E5763904
Modem totiž ve výchozím stavu používá pro textové zprávy surový formát PDU (Protocol Description Unit) a já mu musím přikázat, ať používá ASCII. Nejprve si tedy ověřím, jaký formát je aktuálně nastavený:
AT+CMGF?
A odpovědí mi bude:
+CMGF: 0
- 0 představuje formát PDU
- 1 představuje formát TEXT/ASCII
A jelikož už víte, jak se nastavují základní parametry, tak následující příkaz nemusím vysvětlovat:
AT+CMGF=1
Když mi teď dorazí SMS, v terminálu se zobrazí krásně čitelná zpráva s informací o odesílateli, časem a textem:
+CIEV: "MESSAGE",1
+CMT: "+420724669123",,"2017/01/12,22:41:33+01"
Ahoj modeme, jak se mas?
Hurá, na GSM modem dorazila první SMS zpráva
Odesíláme SMS
Na závěr si vyzkoušíme odeslání vlastní SMS. Už jsme nastavili režim SMS na text, takže ji můžeme vytvořit ve srozumitelném zadání.
Nejprve vyberu telefonní číslo příjemce:
AT+CMGS=“724669123“
Na dalším řádku už bez dalších parametrů napíšu svoji zprávu:
Jsem Skynet a ovladl jsem svet. Utec, dokud muzes!
A vše uzavřu CTRL+Z, čímž dám modemu najevo, že už jsem dopsal a má sdělení doručit nebohému člověku na druhé straně.
Zapsání CTRL+Z může být samozřejmě oříšek, ale stačí odeslat numerický ASCII kód této klávesové zkratky, který je roven 26. Kdyby tedy byl modem připojený třeba k Arduinu, poslal bych do sériové linky příkaz:
Serial.println(char(26));
V případě mého sériového terminálu RealTerm stačí napsat do textového vstupu jednoduše 26 a namísto tlačítka Send ASCII klepnout na Send Numbers.
Odeslání SMS zprávy z GSM modemu, který připojím k jakémukoliv počítači/mikrokontroleru s rozhraním UART/sériové linky, je naprosto jednoduché
Pokud se zadaří, modem opět odpoví potvrzovacím OK a je hotovo.
Pomocí několika příkazů vytvoříte GSM telefon
Dnes jsme si tedy ukázali základní práci s GSM modemem pomocí AT příkazů, přičemž jsme jej díky sériové lince mohli ovládat pomocí převodníku přímo z počítače. Stejným způsobem bychom ale postupovali, kdyby byl modem připojený k našemu mikropočítači.
Na internetu je hromada návodů, jak pomocí (třeba) Arduina a GSM modemu vyrobit plnohodnotný telefon pro geeky. Stačí do Googlu zadat třeba „arduino gsm.“
Vzhledem k tomu, že jsou základní operace opravdu jednoduché, nepotřebujeme k ovládnutí modemu ani žádné knihovny, přestože na webu najdete jak ty pro modemy SIM800L, tak pro A6. Pak je použití modemu ještě snazší.
Ať už tedy máte doma nějaké to Arduino, nebo na něj teprve čekáte, určitě investujte i do GSM modulu. Stojí pár kaček a nejjednodušší stavovou informaci díky detekci prozvonění přenesete prakticky na tisíce kilometrů daleko, aniž by vás to něco stálo.