Raspberry Pi oraz sieć GSM/2G – wysyłamy SMS, łączymy się z internetem (IoT)

Raspberry Pi oraz sieć GSM/2G – wysyłamy SMS, łączymy się z internetem (IoT)

Tym razem podłączymy do naszego Raspberry Pi moduł GSM. Dlaczego? Internet of Things, w skrócie IoT jak zauważył na krakowskim PLNOG17 Marcin Aronowski polega i zależy od sieci, które powinny być łatwo dostępne, a sama istota działania IoT musi odznaczać się małym kosztem energetycznym. Być może, stwierdził, 3G odejdzie ale 2G z tego powodu pozostanie. Nie potrzebujemy ogromnego pasma – wystarczą nam kilobity na sekundę. Podłączenie 2G jest dziś najtańsze w realizacji (również ze względu na koszt modułu i karty SIM z planem od operatora).

Dlatego postaram się pokazać Wam jak łatwo podłączyć bardzo tani moduł GSM Neoway M590. To proste urządzenie, które jest modemem GSM (2G).

Nauczymy się wysyłać SMS oraz będziemy się za jego pomocą łączyć z Internetem.

Czego będziemy potrzebować?

Software:

  • programy: picocom, gammu, ppp (znajdują się w repozytorium Raspbiana)
  • wyłączenie konsoli na porcie szeregowym Raspberry Pi

Hardware:

  • Raspberry Pi – 1B, 1A, 2B, 3B, Zero – właściwe dowolne z zainstalowanym Raspbianem (wystarcza wersja mini)
  • Moduł Neoway M590 – bez innych liter na końcu, polecam gotową wersję na płytce
  • Multimetr do weryfikacji napięcia zasilania modułu GSM
  • Opcjonalnie: konwerter zasilania – DC-DC step down minimalnie o wydajności 2A, pozwalający z wejścia 5-24V stabilnie na wyjściu utrzymać 3,9V – do zasilania modułu GSM

20161008-PA080038-768x477

Do dzieła!

Wybrałem moduł Neoway M590, ponieważ jest trochę niedoceniany – jedną z najważniejszych kwestii jest jego stabilne zasilanie. Być może przez to nie jest tak popularny jak serie SIM800/SIM900, ale – jego cena jest bardzo atrakcyjna, tak więc postanowiłem mu się przyjrzeć. Po kilkumiesięcznych testach dwóch modułów mogę stwierdzić, że jest to stabilne rozwiązanie.

Należy jednak pamiętać – w większości przypadków, zasilanie optymalne to stabilne 3,7-3,9V a zasilacz powinien mieć wydajność 2A.

Podłączenie do Raspberry Pi

Moduł Neoway GSM posiada port szeregowy – to za jego pomocą będziemy się z nim komunikować przez złącza TX,RX. Jednak domyślne port szeregowy Raspberry Pi jest jest okupowany przez konsolę systemową – a więc jeśli podłączymy nasz moduł to zalejemy go danymi, oczywiście nic też nie odczytamy. Należy więc na Raspberry Pi w pliku /boot/cmdline.txt usunąć część: console=/dev/ttyAMA0,115000. Po ponownym uruchomieniu możemy ją wreszcie wykorzystać.
Podłączamy konwerter zasilania – można też wykorzystać baterię z nieużywanego smartfona albo bateria typu 18650 – pod warunkiem, że ma rating 3,7V – Li Poly lub Li Ion. Jeśli używacie takiego konwertera jak mój – z potencjometrem ustawianym wkrętakiem – podłączcie bez obciążenia multimetr i kręćcie tak długo aż nagle napięcie zacznie spadać – ustawcie 3,9V. Następnie podłączcie moduł i zweryfikujcie zasilanie – czasami tanie moduły wcale nie pozwalają na stabilne zasilanie pod obciążeniem – w efekcie mamy spadek napięcia, który trzeba skorygować. Robimy to BARDZO ostrożnie, aby nie uszkodzić układu GSM. Oto schemat zasilania i podłączenia do Raspberry Pi. Na schemacie widzimy złącze 2×7 PIN płytki Neoway M590 od strony mocowania karty SIM:

RPI-M590_bb

Połączenia od strony gniazda na kartę SIM:

20161008-PA0800455

Jak widać nie jest to ani trudne ani skompilowane, proszę pamiętajcie o wspólnej masie. Neoway M590 aby uruchomić się potrzebuje stanu niskiego na pinie BOOT, stąd „extra” połączenie do masy układu.
Po zainstalowaniu karty GSM, uruchomieniu modułu pierwszy LED na module powinien się zapalić, natomiast drugi powinien cyklicznie mrugać sygnalizując połączenie z siecią GSM. Oto końcowy efekt:

20161008-PA080033-768x576

Wysyłamy SMS

Aby lepiej poznać moduł – należy uruchomić konsolę i połączyć się z nim:

sudo apt-get install picocom

a następnie

pi@rpi ~ $ picocom --baud 115200 /dev/ttyAMA0
picocom v1.7

port is        : /dev/ttyAMA0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        :
omap is        :
emap is        : crcrlf,delbs,

Terminal ready
AT
OK

Z picocom wychodzimy przez kombinację 'CTR+a' następnie 'q'.
Na samym końcu, w linii 21, wpisałem komendę AT na co M590 odpowiedział mi OK. To oznacza, że mamy prawidłowo (nie pomyliliśmy TX z RX) podłączoną konsolę. Komendy AT wraz z parametrami to naturalny język modem ów. Jeśli zamiast tego mamy mnóstwo „krzaczków” to mamy złą prędkość, a jeśli widzimy co piszemy – to oznacza, że nie wyłączyliśmy przekierowania konsoli systemowej na port szeregowy (spójrz wyżej). Z modułem rozmawiamy przez komendy AT, które służą praktycznie do wszystkiego – jest to stara dobra szkoła komunikacji z modemami. Przypomnijmy więc sobie jakie to komendy w załączonym linku.

Zatem – wyślijmy SMS, najpierw przez picocom, konsolę, a za chwilę – „automatycznie” za pomocą gammu:

picocom --baud 115200 /dev/ttyAMA0
picocom v1.7

port is        : /dev/ttyAMA0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        :
omap is        :
emap is        : crcrlf,delbs,

Terminal ready
AT+CMGF=1
OK
AT+CSMS=1
+CSMS: 1,1,1

OK
AT+CSCS="GSM"
OK
AT+CMGS="601xxx555"
> "To jest TEST SMS"
>
+CMGS: 46

OK

Krótkie wyjaśnienie – od AT zaczynają się komendy jakie wpisujemy w konsoli. Zamiast „601xxx555” podstaw numer na jaki wysyłasz SMS. Następnie po tej komendzie pojawi się znak zachęty – należy wpisać treść SMS oraz zlecić wysłanie przez CTRL+Z. Przez 3-4 sekundy nic się nie stanie, a potem przyjdzie odpowiedź: „+CMGS: 46” oraz „OK’. Sprawdź czy SMS doszedł!

Oczywiście jeśli chcemy wykorzystać to do czegoś bardziej użytecznego – należałoby użyć gammu, które pozwala na dość prostą wysyłkę SMS z linii komend:

sudo apt-get install gammu

Następnie edytujemy konfigurację gammu:

sudo pico /etc/gammurc

i umieszczamy w nim tylko:

[gammu]
device = /dev/ttyAMA0
connection = at115200

Teraz możemy wysłać naszego SMS w taki sposób:

gammu sendsms TEXT 601xxx555 -text "To jest TEST SMS"

Proste, prawda ?

Łączymy się z Internetem

Nasz moduł pozwala na transmisję danych w trybie GPRS. Połączenie jakie z nim mamy to 115k, a więc wystarczające z nawiązką do takiego trybu jaki daje nam GSM. Pamiętamy – to raczej zadania IoT, a nie używanie przeglądarki w trybie graficznym (lynx, links czy elinks działają bez problemu)!
Instalujemy program do połączenia się z Internetem. Wynegocjuje połączenie używając modemu GSM, ustawi interfejs ppp0 oraz dopisze DNSy i domyślną trasę – po odpowiedniej konfiguracji:

sudo apt-get install ppp

W tym celu tworzymy plik:

sudo pico /etc/ppp/peers/m590-gsm-internet

o zawartości:

# Skrypt do podłączenia się przez GPRS
connect "/usr/sbin/chat -v -f /etc/chatscripts/gprs -T internet"
# Port szeregowy do podłączenia
/dev/ttyAMA0
# Szybkośc portu
115200
# IP dostajemy od ISP
noipdefault
# Także DNSy
usepeerdns
# To spowoduje ustawienie tego łącza jako DOMYŚLNE do internetu
defaultroute
# Nakazuje pppd "dzwonić" a więc łączyć się, jak połączenie z jakiego powodu stracimy
persist
# Bez autoryzacji
noauth
# Bez sprzętowej kontroli 
nocrtscts
# Oraz bez kontroli linii
local

Sprawdźmy jeszcze co kryje się w pliku gprs z katalogu chatscripts – upewnijmy się, że ma następujące wpisy:

# You can use this script unmodified to connect to cellular networks.
# The APN is specified in the peers file as the argument of the -T command
# line option of chat(8).

# For details about the AT commands involved please consult the relevant
# standard: 3GPP TS 27.007 - AT command set for User Equipment (UE).
# (http://www.3gpp.org/ftp/Specs/html-info/27007.htm)

ABORT           BUSY
ABORT           VOICE
ABORT           "NO CARRIER"
ABORT           "NO DIALTONE"
ABORT           "NO DIAL TONE"
ABORT           "NO ANSWER"
ABORT           "DELAYED"
ABORT           "ERROR"

# cease if the modem is not attached to the network yet
ABORT           "+CGATT: 0"

""              AT
TIMEOUT         12
OK              ATH
OK              ATE1

# +CPIN provides the SIM card PIN
#OK             "AT+CPIN=1234"

# +CFUN may allow to configure the handset to limit operations to
# GPRS/EDGE/UMTS/etc to save power, but the arguments are not standard
# except for 1 which means "full functionality".
#OK             AT+CFUN=1

OK              AT+CGDCONT=1,"IP","\T","",0,0
OK              ATD*99#
TIMEOUT         22
CONNECT         ""

Jesteśmy gotowi! uruchamiamy połączenie z Internetem za pomocą:

sudo pon m590-gsm-internet

Sprawdzamy logi na osobnej konsoli (np: tail -f /var/log/syslog)

Oct  8 23:23:13 rpi pppd[17390]: Connect: ppp0  /dev/ttyAMA0
Oct  8 23:23:13 rpi ifplugd(ppp0)[17403]: ifplugd 0.28 initializing.
Oct  8 23:23:13 rpi ifplugd(ppp0)[17403]: Using interface ppp0/00:00:00:00:00:00
Oct  8 23:23:13 rpi ifplugd(ppp0)[17403]: Using detection mode: IFF_RUNNING
Oct  8 23:23:13 rpi ifplugd(ppp0)[17403]: Initialization complete, link beat detected.
Oct  8 23:23:14 rpi ifplugd(ppp0)[17403]: Executing '/etc/ifplugd/ifplugd.action ppp0 up'.
Oct  8 23:23:14 rpi ifplugd(ppp0)[17403]: client: Ignoring unknown interface ppp0=ppp0.
Oct  8 23:23:14 rpi ifplugd(ppp0)[17403]: Program executed successfully.
Oct  8 23:23:14 rpi kernel: [701282.272157] PPP BSD Compression module registered
Oct  8 23:23:14 rpi kernel: [701282.284205] PPP Deflate Compression module registered
Oct  8 23:23:16 rpi pppd[17390]: local  IP address 10.75.12.27
Oct  8 23:23:16 rpi pppd[17390]: remote IP address 10.75.12.27
Oct  8 23:23:16 rpi pppd[17390]: primary   DNS address 89.108.202.21
Oct  8 23:23:16 rpi pppd[17390]: secondary DNS address 89.108.195.21
Oct  8 23:23:17 rpi ntpd[779]: Listen normally on 11 ppp0 10.75.52.17 UDP 123
Oct  8 23:23:17 rpi ntpd[779]: peers refreshed
Oct  8 23:23:18 rpi dnsmasq[6117]: czytanie /var/run/dnsmasq/resolv.conf
Oct  8 23:23:18 rpi dnsmasq[6117]: używam adresów lokalnych tylko dla domeny dom
Oct  8 23:23:18 rpi dnsmasq[6117]: używam serwera nazw 8.8.4.4#53
Oct  8 23:23:18 rpi dnsmasq[6117]: używam serwera nazw 8.8.8.8#53
Oct  8 23:23:18 rpi dnsmasq[6117]: używam serwera nazw 89.108.202.21#53
Oct  8 23:23:18 rpi dnsmasq[6117]: używam serwera nazw 89.108.195.21#53

Udało się! Zobacz jak wygląda wyjście z komendy ifconfig:

ppp0      Link encap:Point-to-Point Protocol
          inet addr:10.75.12.27  P-t-P:10.75.12.27  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:116 (116.0 B)  TX bytes:191 (191.0 B)

Jeśli chcesz wyłączyć – wystarczy wydać:

sudo poff m590-gsm-internet

Logi pokażą:

Oct  8 23:26:40 rpi avahi-daemon[539]: Withdrawing workstation service for ppp0.
Oct  8 23:26:41 rpi ntpd[779]: Deleting interface #11 ppp0, 10.75.12.37#123, interface stats: received=0, sent=0, dropped=0, active_time=204  secs
Oct  8 23:26:41 rpi ntpd[779]: peers refreshed

To wszystko! Pamiętaj, że transmisja danych może być nadal bolesna jeśli nie masz odpowiedniego pakietu u operatora.

Previous Post Next Post