Schnelleinstieg GSM mit dem Sim-800L

Quellen

Grundlagen

Zur Zeit sind sehr preiswerte Breakout-Boards mit dem Modul Sim-800L erhältlich. (Sim800L mini Shield)
Diese sind nur mit den für den Betrieb des Moduls unbedingt nötigen Bauelementen bestückt.
Es gibt einen Micro-SIM-Slot und eine Mini-Antenne, eine LED und dazu ein paar Widerstände und Kondensatoren.
Die Mini-Antenne kann direkt auf das Board gelötet werden, so dass sie quer über dem SIM-Slot steht.
Dieser Modul soll mit einer Betriebsspannung von ca. 3,5 bis 4,2 Volt betrieben werden.
Die Spannung darf den angegebenen Bereich nicht überschreiten, sonst kann das Modul zerstört werden.
Allerdings wird während des Sendens ein Strom von bis zu 2 A benötigt.
Eine Versorgung über den USB des Arduino-Nano scheidet daher aus.
Für die Versorgungsspannung kann ein weiteres Breakout-Board mit dem Spannungsregler LM2596 verwendet werden.
Hier gibt es eine einstellbare Version (LM2596S-ADJ), diese kann in einem Bereich von ca. 1,5V bis
fast zur Eingangsspannung eingestellt werden.
Die Bauteile auf den Breakout-Boards entsprechen nicht ganz den Anforderungen des Datenblatts, die Tests
funktionieren aber dennoch.
Der Arduino-Nano dient hier nur zur Verbindung des Moduls mit dem PC.
Es kann auch ein USB-UART-Modul verwendet werden, der auf 5V eingestellt wird.
Für erste Experimente müssen nur 3 Verbindungen zwischen Sim800L und Arduino bestehen.

Laut SIM800H_Hardware_Design_V1.00.pdf Kapitel 4.5.4 kann für diesen Fall auf die Levelanpassung verzichtet werden.
Im Kapitel 4.5.2 werden verschiedene Level-Anpassungen für des stabilen Betrieb beschrieben.

Versuchsaufbau

Die für die Versuche nötigen Bauteile werden auf einem Breadboard aufgebaut.

Hardware

Zuerst wird der Arduino mit dem PC verbunden.
Das Proxy-Sketch (siehe unten) wird mit der Arduino-IDE kompiliert und geladen.
Ein Terminalprogramm wird mit der Schnittstelle verbunden und es wird auf die "Ready"-Meldung gewartet.
Evtl. muss der Reset-Taster auf dem Arduino gedrückt werden.
Nun kann die Stromversorgung des Sim800L-Moduls zugeschaltet werden.
Nach ein paar Sekunden kann man ein "AT"-Kommando zum Modul senden, es muss mit einem "OK" geantwortet werden.
Das Terminalprogramm muss die Zeilen mit einem "\n", "\r" oder beidem abschliessen.

Achtung, Treiberproblem!

Falls der Arduino-Nano nicht erkannt wird, folgendes versuchen:
SIM800L-Stromversorgung abschalten, bevor der Arduino mit PC verbunden wird.
Zuerst den Arduino allein mit dem PC verbinden und die Verbindung überprüfen.

Tests des Sim-800L

Es folgt die Beschreibung der einzelnen Schritte zum Senden und Empfangen von SMS.

Test der Verbindung zum Sim-800L

AT
OK
	

Abfrage, ob Pin-Eingabe nötig ist

"SIM PIN" -> Pin-Eingabe nötig / "READY"->keine Pin nötig

AT+CPIN?
+CPIN: SIM PIN

OK

Pin eingeben.

"READY"->akzeptiert, danach kommen die Meldungen der Dienste.

AT+CPIN=1111
OK

+CPIN: READY

Call Ready

SMS Ready

Format für SMS setzen

Format 1 wählt das Textformat aus.

AT+CMGF=1
OK

SMS Ziel angeben, danach kommt die Texteingabe

Das "> " ist der Prompt vom Sim800L.
Der Text muss mit <CTRL-Z> abgeschlossen werden, ASCII-Code 26 bzw 0x1A.
Wenn das Terminal die direkte Eingabe nicht unterstützt, im UltraEdit im HEX-Mode (0x1A)
eingeben und Text kopieren.
"+CMGS: 8" zeigt die Anzahl der Zeichen in der SMS.

AT+CMGS="0190110110"
> hallo 
> <CTRL-Z>
+CMGS: 8

OK

Falls alles klar geht, wurde die SMS gesendet. Diese wird beantwortet.
Meldung der ankommenden SMS:

+CMTI: "SM",3

Die SMS wurde auf Speicherplatz 3 gespeichert.

Abfrage der empfangenen SMS

AT+CMGR=3
+CMGR: "REC UNREAD","+49190110110","","17/06/30,10:38:45+08"
ohh, aah

OK

Umlaute senden

Zum Senden von Umlauten muss man vom 7-Bit-Zeichensatz auf UCS-2 umschalten.
UCS-2 ist im Prinzip die erste Code-Seite von Unicode, jedes Zeichen wird durch 2 Bytes dargestellt.
Siehe "Basic Multilingual Plane"
Diese Bytes werden als Hex-Code dargestellt. 0x00-0x7f entspricht den ASCII-Codes.
Die Telefonnummer im Bsp. beginnt mit "0172", die weiteren Stellen sind durch "x" dargestellt.
Hier wird nur ein "ä" gesendet. Zum Schluss wird wieder auf die "normale" 7-Bit-Darstellung umgeschaltet.

AT+CSCS="UCS2"
OK
AT+CMGS="0030003100370032003x003x003x003x003x003x003x"
> 00e4<CTRL-Z>
AT+CSCS="GSM"
OK

Fehlermöglichkeiten

Falls die erste SMS zwar gesendet werden konnte, aber die Antwort nicht empfangen wird,
könnte die Nummer der SMS-Zentrale nicht korrekt eingestellt worden sein.
Sind mehrere SIM-Karten zu einer Telefonnummer zugeordnet (Multi-Card), muss evtl.
die aktuelle Karte für den Empfang ausgewählt werden.
Dazu können USSD-Codes verwendet werden.

Senden von USSD-Codes

Im Beispiel die Umstellung bei O2, zuerst Einstellung des Formats, dann Senden des Codes, Antwort folgt:

AT+CUSD=1

OK
AT+CUSD=1,"*125#"

OK

+CUSD: 0, "SMS Empfang jetzt auf: SIM 2.", 15

Folgende USSD-Codes sind aktuell bei O2 verfügbar:

Surfen im Internet

Nachdem der Access-Point des Providers eingestellt ist, steht dem Sufvergnügen nichts mehr im Wege!

+CPIN: READY

Call Ready

SMS Ready
AT+SAPBR=3,1,"APN","internet"
OK
AT+SAPBR=1,1
OK
AT+httpinit
OK
AT+httppara="URL","google.com"
OK
AT+httpaction=0
OK

+HTTPACTION: 0,302,258
AT+httpread
+HTTPREAD: 258
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Move<</H1>
The document has moved
<A HREF="http://www.google.de/?gfe_rd=cr&ei=-hRYWdXfBuaA8Qek4JzIDQ">here</A>.
</BODY></HTML>

OK

Arduino-Proxy

// SIM800 TX an D11 / SIM800 RX an D10 / Don't forget "GND"-connection!
#include <SoftwareSerial.h>
#define SIM800_TX 11
#define SIM800_RX 10
SoftwareSerial sim800(SIM800_TX,SIM800_RX); 
void setup() {
  Serial.begin(9600); while(!Serial);  
  sim800.begin(9600); // use same baud rate for both directions
  delay(1000);
  Serial.println("Ready");
} 
void loop() {
  if(sim800.available()){ Serial.write(sim800.read()); }
  if(Serial.available()){ sim800.write(Serial.read()); }
}