GSM-Modul am Raspberry Pi 2
Freitag, Juli 28th, 2017In meinem Haushalt werkeln zwei Raspberry Pi 2 Model B vor sich hin und erledigen Aufgaben zur Heimautomatisierung. Dabei halten mich die beiden Helfer im Normalfall per E-Mail über ihre Befindlichkeiten auf dem Laufenden. Es wäre praktisch, dachte ich mir, wenn es einen alternativen Kommunikationsweg als Fallback-Lösung gäbe, falls das heimische Netzwerk einmal aus irgendeinem Grund nicht erreichbar ist.
Eine Kommunikation per SMS ist vergleichsweise günstig zu realisieren und praxistauglich für unterwegs. Stand-alone zu betreibende GSM-Modems in der Art von Falcom Twist oder Siemens TC35i/M35i sind schick und zuverlässig, aber für meinen Einsatzzweck zu sperrig. Es sollen schlanke Module (Platinen) sein, die huckepack zu montieren sind und sich an der vorhandenen Stromversorgung des Raspberry nähren können.
Bei www.roboter-bausatz.de ist unter der Artikelnummer RBS10504 ein „GSM Modul Kit für Arduino“ zum Preis von 9,90 Euro erhältlich. Es basiert auf dem GSM-Modul Neoway M590E und kommt als Bausatz mit nur wenigen zusätzlichen SMD-Bauteilen zum Selberlöten daher. Begibt man sich auf eine Suche im Netz, stellt man fest, dass dieses Kit sehr populär zu sein scheint und allerorten angeboten wird — bei chinesischen Anbietern zuweilen für unter 2 Euro das Stück. Da stellt sich die Frage: Saugt das oder taugt das?
Das Kit
Geliefert wird das Kit in einem verschweißten Antistatik-Beutel. Darin enthalten: Platine, Antenne, GSM-Modul, SIM-Kartenhalter sowie eine handvoll Kleinkram und SMD-Krabbeltierchen. Die Platine macht einen guten Eindruck, einige andere Bauteile sehen irgendwie gebraucht aus: Das Etikett abgewetzt, die Kontakte verzinnt, der SIM-Kartenhalter teilweise mit Zinnresten überzogen. Man muss annehmen, dass es sich hier um gebrauchte Komponenten handelt oder um solche, die zur Wiederverwendung von anderen Baugruppen „geerntet“ wurden.
Ein Beutel enthält zwei LEDs in unterschiedlichen Bauformen, obwohl nur eine benötigt wird. Im anderen Beutel fehlt der (einzige) SMD-Elko, stattdessen enthält dieser eine (nicht benötigte) SMD-Diode. Vor meinem geistigen Auge sehe ich arme Lohnknechte, die unter schwierigen Bedingungen Tüten packen, und fühle mich schuldig. Apropos „nicht benötigt“: Eine Aufbauanleitung liegt nicht bei; was wohin zu löten ist, muss man selbst herausfinden. Dank des Internets und des herunterladbaren Entwurfshandbuchs zum M590E ist diese Herausforderung zu meistern.
Das Entwurfshandbuch gibt zahlreiche Empfehlungen für ein gutes Schaltungs- und Platinendesign, welches Störungen vermeiden und einen stabilen Betrieb fördern soll. Die Entwickler der Platine, so scheint es, haben sich davon nicht verrückt machen lassen und sind ihren eigenen Weg gegangen. Beispiele:
DO NOT USE SERRIES diodes to directly step-down the voltage.
Hier wird dennoch eine Diode in Serienschaltung als Verpolungsschutz und zum Absenken der Versorgungsspannung verwendet. Der M590E arbeitet mit 3,3 V bis 4,8 V, wobei 3,9 V der empfohlene Wert ist. Das entspricht ungefähr dem Niveau einer Lithium-Zelle. Für den Betrieb an 5 V ist es natürlich zu verlockend, sich an dieser Stelle mit einer Diode zu behelfen. Ich habe diese auch eingelötet und ziehe mir provisorisch die 5 V vom Raspberry herüber.
USE HIGH VALUE, LOW ESR CAPACITORS, CLOSE TO THE MODULE.
Hier ist genau eine Bestückungsposition vorgesehen für den beiliegenden Tantal-Elko mit 100 μF (C1 laut Entwurfshandbuch). Schöner wären weitere Bestückungspositionen für zusätzliche Kondensatoren (C2 & C3). Bei der Bestückung mit 100 μF können laut Entwurfshandbuch im Sendebetrieb Spitzenströme von bis zu 1,2 A auftreten.
When designing the serial communication interface circuit, a series resistor should be used should the external MCU be operating on a higher voltage – a 200 Ohm resistor should be used if the external MCU is operating on 3.3V. […] A filter capacitor of 100pF should be placed near the module receive pin.
Weder Serienwiderstand noch Filterkondensator sind vorgesehen, müssen also bei Bedarf fliegend oder extern ergänzt werden. Die GPIO-Ports des Raspberry arbeiten mit 3,3 V, die seriellen Ports des M590E mit 2,85 V, aus diesem Grund habe ich zur Entkopplung in die RxD- und TxD-Leitung je einen Serienwiderstand eingesetzt.
Um das Bild abzurunden, bleibt noch zu erwähnen, dass eines der beiden GSM-Module sich partout nicht zur Zusammenarbeit bewegen lassen wollte, also wohl defekt ist. Es bootet nicht trotz testweise nachgerüsteter Pufferkapazitäten, kommuniziert nicht über die serielle Schnittstelle und saugt nur gepulst im Abstand weniger hundert Millisekungen Ströme aus dem Labornetzteil. Zum Glück bekam ich vom freundlichen Shop ohne Diskussionen ein Ersatzmodul nachgeliefert.
Und trotz des ganzen Gemäkels klappt es am Ende mit der Funkerei. Nachfolgend abgebildet mein Testaufbau des GSM-Moduls auf dem Experimentierboard. Damit das Modul gesättigt an der 5-V-Versorgung des Raspberry mitnuckeln kann, habe ich eine Parallelschaltung von 100 nF und 1000 μF Low-ESR-Elko anstelle des einzelnen Tantal-Elkos aufgelötet. Vorteil: Der Spitzenstrom im Betrieb reduziert sich damit auf 0,6 A und das Modul ist gut versorgt. Nachteil: Beim Einschalten muss sich der dicke Elko einmalig vollsaugen, wodurch das Netzteil kurzzeitig stark belastet wird — so stark, dass der Raspberry einen Reboot durchläuft, wenn man das Modul im Betrieb anklemmt. Für einen betriebsfertigen Aufbau werde ich mir also eine robustere Lösung überlegen müssen, notfalls mit zwei getrennten Stromversorgungen.
Erste Kontaktaufnahme per Minicom
Für die serielle Kommunikation verwende ich die Pins GPIO14 (UART0_TXD) und GPIO15 (UART0_RXD) über das Device /dev/ttyAMA0. Ist dieses nicht verfügbar, muss zunächst mittels des Tools raspi-config die standardmäßig auf den Pins aktivierte serielle Login-Shell deaktiviert und die Nutzung als serielle Schnittstelle aktiviert werden:
sudo raspi-config
Interfacing Options
> Serial
> Would you like a login shell to be accessible over serial?
<no>
> Would you like the serial port hardware to be enabled?
<yes>
Nach einem Reboot sollte das Device nun zur Verfügung stehen:
ls -al /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 64 Jul 09 18:06 /dev/ttyAMA0
Anschließend kann die erste Kontaktaufnahme zum GSM-Modul über ein Terminal erfolgen. Ich verwende dafür das Programm Minicom.
sudo apt-get install minicom
Damit der Standard-User pi auf die serielle Schnittstelle zugreifen darf, muss dieser zur Gruppe dialout hinzugefügt werden.
sudo adduser pi dialout
Anschließend einmal ab- und wieder anmelden und ausprobieren:
minicom -b 115200 -o -D /dev/ttyAMA0
Die Willkommensmeldung überspringen mit Taste <ENTER>
. Dann lokales Echo aktivieren mit Tastenkombination <STRG>+<A>
und dann Taste <Z>
und dann Taste <E>
. Nun Eingabe AT
<ENTER>
usw.
AT
OK
AT+CPIN="1234"
OK
AT+CPIN?
+CPIN:READY
Verlassen des Terminals mit Tastenkombination <STRG>+<A>
und dann Taste <Q>
und dann Taste <ENTER>
. Die verfügbaren AT-Befehle sind dokumentiert in der Befehlsreferenz des M590E.
SMS-Daemon als Poststelle
Der SMS-Daemon smsd ist im Paket smstools enthalten. Ähnlich wie ein MTA (Mail Transfer Agent) für das Senden und Empfangen von E-Mails, kümmert sich der SMS-Daemon im Hintergrund um das Senden und Empfangen von SMS.
sudo apt-get install smstools
Für eine grundlegende Funktion müssen nur wenige Parameter in der Konfigurationsdatei /etc/smsd.conf eingetragen werden (diese finden sich ganz am Ende der Datei):
[GSM1]
device = /dev/ttyAMA0
incoming = yes
pin = 1234
baudrate = 115200
Anschließend den SMS-Daemon einmal neu starten:
sudo service smstools restart
Damit der Standard-User pi auf die Verzeichnisstruktur des SMS-Daemons zugreifen darf, muss dieser zur Gruppe smsd hinzugefügt werden.
sudo adduser pi smsd
Anschließend einmal ab- und wieder anmelden und via echo-Befehl eine Test-SMS versenden:
cd /var/spool/sms/outgoing
echo -e "To: 491575xxxxxxxx\n\nEine Test-SMS!" > testdatei
Oder via Editor vi, dort ist die erforderliche Leerzeile zwischen der Rufnummerangabe und der Textmitteilung besser erkennbar:
vi /var/spool/sms/outgoing/testdatei
To: 491575xxxxxxxx
Eine Test-SMS!
Innerhalb weniger Sekunden sollte die SMS nun an ihren Empfänger versendet werden. Im Normalfall, wenn es geklappt hat, wird die soeben erzeugte Datei testdatei aus dem Verzeichnis /var/spool/sms/outgoing verschwunden sein und — um ein paar Info-Zeilen ergänzt — im Verzeichnis /var/spool/sms/sent wieder auftauchen:
To: 491575xxxxxxxx
Modem: GSM1
Sent: 17-07-09 19:09:11
IMSI: 24xxxxxxxxxxxxx
Eine Test-SMS!
Ging etwas schief, findet sich die Datei im Verzeichnis /var/spool/sms/failed wieder, ergänzt um einem Fehlerhinweis. Eingehende SMS landen automatisch im Verzeichnis /var/spool/sms/incoming.
Mit ein wenig Skripterei umzu lässt sich also eine einfache Remote-Steuerung des Raspberry per SMS auf die Beine stellen. Eine Auswertung des RING-Signals (für eingehende Anrufe) sowie die Datenkommunikation per GPRS habe ich bisher nicht benötigt und nicht ausprobiert.