Arduino a GSM shield

V dnešnej dobe je pokrytie slovenska GSM signálom veľmi vysoké číslo, trúfnem si povedať, že nad 90% v závislosti od operátora. Prečo to spomínam? Lebo využitie Arduina a GSM Shieldu môže byť veľmi zaujímavé spojenie. V dnešnom článku nebudem uvažovať na čo všetko sa to dá využiť, ale poukážem na problém, ku ktorému som sa dostal a ako sa mi ho podarilo vyriešiť.

GSM Shield

Základným prvkom bude samozrejme Arduino a už spomínaný GSM Shield. Ja konkrétne som si objednal to čo vidíte na obrázkoch. Ide o najlacnejšie riešenie v cene cca 7.5 libry za kus. Shield používa chip SIM800L a dostupné sú modely buď s anténou z plošného spoja alebo s malou anténou, podobnou akú mate napríklad na Wi-Fi rútri. Samotný Shield ma veľmi malé rozmery. Z jednej strany je umiestnený samotný chip a konektor pre anténu a druhej sú konektory pre pripojenie a slot pre mikro sim kartu.

sim800l2

sim800l4

Pri hľadaní návodov pre tento Shield som zistil, že aj samotných čipov je na svete niekoľko. Ja konkrétne mam chip s označením SIM800L a pre všetky by mali fungovať na internete nájdené knižnice.

Zapojenie

Pred tým však než niečo budete skúšať, odporúčam si predom preštudovať ako na to, nie ako som na to išiel ja, zhurta. Lebo mojím prvým problémom bolo ako vlastne tento Shield zapojiť. Takže na doske nájdete 7 pinov:

  • 5V
  • GND
  • VDD
  • SIM_TXD
  • SIM_RXD
  • GND
  • RST

Neviem prečo je tam 2x GND ale budíš. Samozrejme základ je pripojiť napájacie napätie 5V a GND. A potom prepojiť TX a RX piny. Uno obsahuje taktiež TX a RX piny ale na nich to nešlo a už viem prečo. Tieto piny slúžia na komunikáciu s počítačom. Po dlhom hľadaní som zistil, že v súbore GSM.cpp sú zadefinované piny ale o tom trošku neskôr.

Knižnice

Ďalší problém s ktorým som sa stretol pri rozbehávaní boli samotné knižnice, teda ktoré použiť a ako ich použiť. Nechcem sa tu rozpisovať koľko a ako som ich skúšal, od toho vás chcem ochrániť. Nakoniec som sa dostal asi k takým oficiálnym, ktoré posúvam aj vám. Bohužiaľ aj tie po stiahnutí z originálneho zdroja mi nešli a musel som si ich poopraviť. Presnejesie zakomentovat alebo vymazat riadok s

const prog_char *p = (const prog_char *)ifsh;

a nahradit ho s

const char PROGMEM *p = (const char PROGMEM *)ifsh;

A teraz hore popísané moje problémy prepojím a pokúsim sa vám popísať ako som ich vyriešil. Takže vrátim sa k problému ako zapojiť jednotlivé piny. Po zdĺhavom hľadaní som došiel k riešeniu, ktoré je popísané v použitých knižniciach. Konkrétne súbor GSM.h, hneď hore:

//De-comment this two lines below if you have the
//first version of GSM GPRS Shield
//#define _GSM_TXPIN_ 4
//#define _GSM_RXPIN_ 5
//De-comment this two lines below if you have the
//second version og GSM GPRS Shield
//#define _GSM_TXPIN_ 2
//#define _GSM_RXPIN_ 3

Ako je z anglického komentára jasne, treba odkomentovať potrebné riadky a následne pripojiť GSM Shield. Alebo ak už máte pripravený svoj kód a dané piny vám nevyhovujú, zadefinujte si svoje. Po tomto by už mal GSM Shield fungovať. Stačí otvoriť jeden z priložených príkladov a skúšať.

Mega problém

Keďže som sa so svojím projektom pohol ďalej, zistil som, že Arduino Uno je mi málo (kvôli ramke), preto som si objednal Arduino Mega a chcel som pokračovať ďalej na ňom, lenže na ňom už GSM Shield nešiel, tak som začal laborovať.

Zistil som, že v GSM.h treba zakomentovať časť pre UNO a odkomentovať časť pre MEGA. Následovne:

//#define UNO
#define MEGA

A v súbore HWserial.h odkomentovať

#define MEGA

Po tomto by GSM Shield mal fungovať ale nefungoval. Tak som skúšal ďalej. Po prezeraní tých kódov som zistil, že Uno používa pre komunikáciu s GSM Shieldom knižnicu SWserial (Software Serial) ale Mega už HWserial (Hardware Serial) čo mi bolo divné, že prečo. Len tak pre skúšku som si otvoril príklady, ktoré tam sú pre SWserial a potom mi to došlo, respektíve mi to bolo vysvetlené prečo to nejde. Pôvodne som pre piny RX a TX použil piny 2 a 3 ale tie Mega nemôže použiť ako RX. Musíte použiť piny ako napríklad 10, 11, 12, 14, 15 pretože tieto umožňujú prerušenia. Preto som svoj kód upravil tak, že vždy použijem piny 10 a 11 a pôjde to aj na Arduino Uno aj Mega, ale nešlo! Prečo? Lebo pri použití HWserial sa nepoužívajú vami vybraté piny ale štandardne piny RX a TX, ktoré ma Mega oproti Uno o 3 viac. Po tomto mi už GSM Shield funguje aj na Arduino Mega.

Po viacerých skúšaniach som zistil, že na Mege môžete komunikovať s GSM shieldom rovnako ako s Uno, teda so SWserial, avšak pre Megu musíte v hore uvedených súboroch nechať zadefinovanú možnosť Uno, a použiť piny dovoľujúce prerušenia.

Pozor, pri HWserial musíte RX GSM pripojiť na TX Arduina a TX GSM na RX Arduina, ale pri SWserial si nekonfigurujete, kde ma Arduino TX a RX piny, ale kde máte pripojiť TX a RX piny GSM Shieldu. Keďže ma Mega 3 komunikačné kanály skúsil som to na všetkých, no fungovalo mi to len na RX1 a TX1.

Arduino Uno
[list icon=”icon: arrow-circle-right” icon_color=”#6d7067″]

  • GSM.h – odkomentovať UNO, zakomentovať MEGA
  • HWserial.h – zakomentovať MEGA
  • Použiť zadefinované piny alebo si ich môžete zmeniť

[/list]

Arduino Mega (Software Serial)
[list icon=”icon: arrow-circle-right” icon_color=”#6d7067″]

  • GSM.h – odkomentovať UNO, zakomentovať MEGA
  • HWserial.h – zakomentovať MEGA
  • Použiť zadefinované piny alebo si ich môžete zmeniť na 10 a vyššie

[/list]

Arduino Mega (Hardtware Serial)
[list icon=”icon: arrow-circle-right” icon_color=”#6d7067″]

  • GSM.h – odkomentovať MEGA, zakomentovať UNO
  • HWserial.h – odkomentovať MEGA
  • Použiť voľne piny RX1 a TX1

[/list]

Výstup

A ako sa správa GSM shield, keď funguje správne? Po otvorení sériovej linky by mal výstup vyzerať nasledovne.

GSM Shield testing.

status=READY

ak nefunguje správne vypíše

status=IDLE

Taktiež aj podľa diód na GSM shielde môžete zistiť či je všetko OK. D2 (RING) by mala neustále svietiť a D6 (NET) by mala v pravidelných intervaloch blikať. Pri nefunkčnosti je to podobne, len v pravidelných cykloch obe diódy spoločne zhasinajú.

Zoznam odkazov

eBay GSM Shield
GSM Knižnica

Na stiahnutie

Original knižnice
Knižnice pre Uno
Knižnice pre Mega SW
Knižnice pre Mega HW