Das SIM900 GSM/GPRS Shield und der Leonardo

Im Blog Arduino-Hannover.de hatte ich bereits meine ersten Erfahrungen mit dem SIM900 Shield beschrieben. Bei den weiteren Untersuchungen und Vorbereitungen für das eigentliche Projekt, bin ich dann auf einige Ungereimtheiten gestoßen. Ich brachte es partout nicht zustande auch einmal eine SMS zu empfangen. Im nächsten Supermarkt habe ich mir dann erst einmal eine neue Prepaid SIM Karte beschafft. Nach einigen Vorrecherchen war ich mir sicher, dass der Provider klarmobil.de meinen technischen Anforderungen entspricht. Ich habe jetzt 5 € bezahlt und dafür eine SIM mit 10 € Startguthaben erhalten. Die Anmeldung der SIM-Karte erfolgt recht komfortabel über das Internet. Man muss nur darauf achten, sich nicht weitere und damit teurere Tarife unterjubeln zu lassen und natürlich keinesfalls eine Kontonummer anzugeben!

Selbstverständlich kann ich keinerlei Verantwortung bei Verwendung der Information aus diesem Beitrag übernehmen, weder für die SIM, die AT-Kommandos oder für den Sketch! Bei einem Fehlverhalten kann es zum Beispiel schnell passieren, dass das Guthaben auf der SIM-Karte umgehend aufgebraucht ist.

Aber auch mit der neuen SIM-Karte konnte ich immer noch keine SMS empfangen! Was nun?

Der Kontrollmonitor

Kurz davor alles in die Ecke zu „legen“, ist mir aufgefallen, dass einige der wenigen von mir bis dahin verwendeten AT-Kommandos gar keine Rückmeldung gaben, so wie es im Manual angegeben ist, obwohl sie grundsätzlich funktionierten. Daraufhin habe ich mir aus diversen Codeschnipseln erst einmal einen Debugmonitor gebastelt. Ziel ist es damit mit dem PC über die Arduino Pins 0 uns 1 mit dem Arduino zu kommunizieren und über die Pins 7 und 8 die AT-Kommandos mit dem SIM900 Shield in beiden Richtungen auszutauschen. Um auch den Bootvorgang in der Setup-Routine beobachten zu können, sind hier einige Zeilen mit einem delay() sowie Textausgeben vorgesehen. Über den Pin 9 wird das Shield eingeschaltet. Dazu muss die Stromversorgung bereits angeschlossen sein, bevor der USB-Anschluss zum Arduino hergestellt wird. Sofort danach muss die serielle Verbindung zum Serial Monitor der Arduino IDE hergestellt werden. Wird der Zeitpunkt verpasst, kann das Shield jedoch immer noch manuell eingeschaltet werden.

Der Testsketch

/****************************************************************************************/
/* SIM900 GSM/GPRS sketch to establish a serial link from SIM900 to PC.
* PC is connected to serial hardware 0,1; GSM Shield to SoftwareSerial 7,8
*
* Enter AT-commands into the serial monitor like: ATD + +491xxxxxxxxx;
* Hang up: ATH
* Dial last number: ATDL
* Answer incoming call: ata
* Disconnect SIM Power down: AT+CPOWD=1
*
* Tested with Arduino Uno only. Leonardo obviously does not respond to serial requests!
*
* Origin Author:        Olaf Meier
*
* Modified by:
*
*
* Hardware connection:  Digital pin 0  –  RX
*                                                   Digital pin 1  –  TX
*                                                   Digital pin 7  –  SoftSerial RX
*                                                   Digital pin 8  –  SoftSerial TX
*                                                   Digital pin 9  –  Shield On/Off
*
* ToDo:
*
*/
/****************************************************************************************/
/****************************************************************************************/
/***  Declaration of global constants and initialization of variables. Add includes.  ***/
/****************************************************************************************/
/***  Software release and date  ***/
const char* sketchname            =  „SIM900Link“;
const char* revision                      =  „R.0.1“;
const char* author                        =  „Olaf Meier“;
const char* date                            =  „2014/04/26“;
/****************************************************************************************/
/***  Declare constants and variables for the SIM900 GSM shield. Dial a number  ***/
#include <SoftwareSerial.h>
# define GSMONOffPIN 9                                          // On/Off-pin of the GSM shield
const unsigned int BAUDRATE   =  9600;             // Baud rate for the serial monitor
const unsigned int GSM900BAUDRATE =  19200; // Default baud rate for SIM900 shield
SoftwareSerial GSM900(7, 8);                                 // GSM SoftSerial RX/TX to Pin 7 and 8
unsigned char buffer[64];                                        // Buffer array fo received serial data
int count=0;                                                                     // Counter for buffer array
/****************************************************************************************/
/****************************************************************************************/
void setup()
{
GSM900.begin(GSM900BAUDRATE);                   // GPRS baud rate
Serial.begin(BAUDRATE);                                         // Serial monitor baud rate
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
delay(3000);                                                                  // Needed to debug the setup with Leonardo
Serial.println(sketchname);                                  // Print the sketch name to serial out
Serial.print(„SIM900 GSM Shield Power „);
GSM900PowerOnOff();                                              // Power on GSM shield
Serial.println(„is on now!“);
delay(15000);                                                               // 15s left to log onto the GSM network
Serial.println(„Logged into a GSM network“);
}
void loop()
{
/*** Data received via SoftwareSerial from SIM900 shield  ***/
if (GSM900.available())
{
while(GSM900.available())                                     // While reading data from SIM900
{
buffer[count++]=GSM900.read();                        // Writing data into array…
if(count == 64)break;                                                 // …until buffer is full
}
Serial.write(buffer,count);                                      // Write buffer to hardwired serial port
clearBufferArray();                                                     // Function to delete content of buffer
count = 0;                                                                        // Reset counter to zero
}
/***  Data received via hardwired serial monitor and send via SoftSerial to SIM900  ***/
if (Serial.available())                                               // While reading data via hardwired serial
GSM900.write(Serial.read());                               // Write data into SIM900 shield
}
/****************************************************************************************/
/****************************************************************************************/
void clearBufferArray()                                            // Function to delete buffer content
{
for (int i=0; i<count;i++)
{
buffer[i]=NULL;                                                            // Overwrite array
}
}
/****************************************************************************************/
/***  Function to switch GSM shield on and off via software  ***/
void GSM900PowerOnOff()
{
digitalWrite(GSMONOffPIN, HIGH);
delay(1000);                                                                // 1s HIGH to switch SIM900 ON or OFF
digitalWrite(GSMONOffPIN, LOW);
delay(3000);                                                                 // Wait 3s until chip is initialized
}
/****************************************************************************************/

DerSketch ist gut dokumentiert und sollte sich weitgehend wieder selbst erklären. Um den Aufbau etwas übersichtlicher zu gestalten, gibt es 2 Funktionen. Eine dient zum Ein- und Ausschalten des Shields, mit der 2. Funktion wird der serielle Puffer wieder gelöscht. Damit kann nun jeder AT-Befehl in den Serial Monitor eingegeben und getestet werden. Mittels dieses Testsketches bestätigte sich nun, dass das Shield zwar AT-Befehle annahm, diese jedoch offensichtlich nicht quittierte. Irgendwo liegt noch eine Ungereimtheit in der seriellen Kommunikation vor. Nach diversen weiteren Tests und steigender Ratlosigkeit habe ich ein anderes Projekt geschlachtet und den dort verbauten Arduino Uno gegen den hier von mir verwendeten Leonardo getauscht.

Und siehe da, es funktioniert alles wie erwartet

Eine Erklärung habe ich derzeit nicht. Ich vermute allerdings, dass die unterschiedliche Hardwarearchitektur zwischen dem Atmega328 und dem im Leonardo verbauten Atmega32u4 im Zusammenspiel mit der SoftwareSerial.h Library eine Rolle spielt.

Fazit

SoftwareSerial Library und Leonardo funktionieren nicht zusammen!

Vier Arten von AT-Kommandos

Da ich nun schon mal deutlich tiefer in das Modem Thema eingestiegen bin als ursprünglich geplant, nachfolgend noch einige allgemeine Infos zu den AT-Befehlen. In der Liste am Ende sind einige der von mir inzwischen auch angetesteten Kommandos mit einer Kurzbeschreibung und ggf. dem Response im Terminalfenster aufgeführt.

Testbefehle                        AT+<x>=?                 Zeigt Liste der Parameter und Wertebereiche
Lesebefehle                       AT+<x>?                    Zeigt den gerade aktuellen Wert
Schreibbefehle                AT+<x>=<…>         Setzt benutzerdefinierte Werte
Ausführungsbefehle    AT+<x>                      Ausführung nichtveränderlicher Parameter

Das Terminal

Serial_Monitor_ScreenshotPuTTY_ScreenshotNach dem Einschalten ist nun in etwa nachfolgender Inhalt im seriellen Monitor zu sehen. Das Shield meldet sich erst mit einigen kryptischen Zeichen, dann jedoch im Klartext:

ÀÀÿÿÿÿÿÿÿÿ
RDY
+CFUN: 1
+CPIN: READY
Call Ready

Neben dem Serial Monitor der Arduino IDE stehen auch viele andere Tools im Internet zur Verfügung. Putty ist mein favorisiertes Terminalprogramm.

Diverse AT Kommandos mit den Ausgaben am Terminal

Vor Benutzung eines AT-Befehles empfehle ich auf jeden Fall unbedingt noch zumindest das grobe Studium des Manuals!

AT-Kommando  Beschreibung                                                    Antwort

AT                              Shield antwortet mit (für Tests)                OK
ATD+ +4917xxxx;  Wähle Rufnummer (mit Semikolon abschließen!!!)
ATDL                         Wahlwiederholung                                           OK
ATH                            Gespräch auflegen                                           OK
ATI                             Identifiziert FW Revision                                SIM900 R11.0
ATE0                          Echo ausschalten                                              OK
ATE1                          Echo einschalten                                               OK
AT+CPOWD=1      SIM abmelden und herunterfahren       NORMAL POWER DOWN
AT+GMR                 Identifiziert die volle Firmware

  •                         Revision:1137B02SIM900M64_ST_ENHANCE

AT+GMI                    Identifiziert Hersteller                                    SIMCOM_LTD
AT+GMM                 Identifiziert Modultyp                                     SIMCOM_SIM900
AT+GSN                   Identifiziert IMEI                                                 013xxxxxxxxxxx AT+CSCA?              SMS Servicecenternummer

  •                          +CSCA: „+491722270333“,145

AT+CNUM?              SIM Rufnummer, Error falls nicht hinterlegt
AT+CREG?                Bestätigung, SIM/Modem verbunden  +CREG: 0,1
AT+CSQ                    Signalstärke:                                                       +CSQ: 18,0

  • 0 = -133dBm;
  • 1 = -111dBm;
  • 2-30 = -109 to –53dBm;
  • 31 =-51dBm;
  • 99 = No reception

AT+CPOWD=1         SIM abmelden und Shield herunterfahren
NORMAL POWER DOWN
AT+IPR=19200      Setze Baudrate (0 ist Auto-Bauding)
AT&F                         Reset Herstellereinstellungen
AT&W                        Benutzereinstellungen speichern
AT&V                         Benutzereinstellungen abfragen

  •                        ACTIVE PROFILE:
  •                       E1 Q0 V1 X4 &C1 &D1 +IFC= 0,0 +FCLASS0
  •                       S004 0:RI 4100 S0:STO
  •                       &=C:3 08

ATE1                           Echo einschalten (ATE0 ist Echo aus)     OK
AT+CPIN=“xxxx“   Pin-Nummer übertragen, SIM entsperren
AT+CMFG=1           Text Mode
AT+CMFG=0           Packet Data Mode
AT-CSCS=”GSM”   GSM Character Text Mode 0 oder 1        +CIPMUX: (0,1)
AT+CGA TT?            Daten aktiv                                                            +CGATT: 1
AT+COPS?                Netzwerkprovider

  •                          +COPS: 0,0,“Vodafone.de“

AT+CIPMUX=?        Multiplex Mode
AT+CIPCSGP=1,”internet”,””,””

  •                          Defines GPRS connection, APN = “internet”,
  •                          First “” = username,
  •                          Second “” = password    ERROR

AT+CIPSRIP=?        Zeigt IP-Adresse und Port                            +CIPSRIP: (0,1)

Beispiele:

Wird eine SMS an das Shield gesendet, kann das wie folgt aussehen:

+CMT: „+4917xxxxxxxx“,““,“14/04/27,00:10:23+08″

Neue SMS   <<<—— Das ist der Inhalt der SMS gewesen

Trifft ein Anruf ein, ist folgende Nachricht am seriellen Monitor zu sehen:

RING

+CLIP: „+4917xxxxxxxx“,145,““,,““,0

Wird ein Anruf vom Anrufer abgebrochen erscheint:

NO CARRIER

Die Verwendung der AT-Kommandos wie auch des Sketches erfolgt immer auf eigenes Risiko!

 

 

Advertisements

9 Gedanken zu “Das SIM900 GSM/GPRS Shield und der Leonardo

  1. Hallo,

    danke erst einmal für das ausprobieren und vorstellen des GSM Shields. Im Netz findet man ja leider relativ wenige nützliche Informationen dazu (wenn man es mal mit anderen Shields vergleicht).
    Eine Frage habe ich aber noch. Ist dein günstiges Ebay Shield mit dem teuren Originalshield von Arduino kompatibel, bzw. mit der GSM library? Ich habe vor ein GSM Shield zum Data Logging in meinem Garten zu nutzen. Für das Original Shield gibt es sogar schon einen fertigen Sketch um die Sensordaten zu xively zu schicken, der mit der GSM library funktioniert, da wäre es natürlich perfekt für mich, wenn ich für ca. 20€ das günstige Shield kaufen und damit die fertige Lösung nutzen könnte. So fit bin ich nämlich noch nicht mit Arduinos, dass ich bei so einer komplexen Sache wie dem GPRS komplett selber etwas auf die Beine stellen könnte.

    Viele Grüße

    Stephan

  2. Hallo Stephan,
    wenn Du auf der einfachen Seite sein möchtest, nimmst Du das originale Arduino Shield und die dazu passende Library. Ich kenne allerdings beides nicht! Da ich jedoch manches Mal auch eher etwas Risikofreudiger bin….. Wie hoch das Risiko in Deinem Fall ist, mag ich nicht abzuschätzen. Entscheidend ist jedoch, dass Du unbedingt prüfst, ob der identische GSM Baustein verwendet wird. Ist auf dem Arduino Shield der gleiche SIM900 verbaut, ist das Risiko überschaubar, da dieser über die identischen standardisierten AT-Kommandos angesprochen wird. Dann wird auch die Library von der Du hier sprichst vermutlich funktionieren. Eventuell muss der SIM900 allerdings über etwas andere IO-Pins als ich sie hier verwendet habe erst einmal generell zum Leben erweckt werden. Das sollte sich aber herausfinden lassen.

  3. GSM hab ich jetzt vor mir hergeschoben. Ich hab hier eine Platine liegen die mehrere Sensordaten auf eine SD-Karte schreibt. Die Daten sollten aber noch an eine Nummer übermittelt werden.

    Für den Test des Shields bin ich dankbar. Das spart mir den Test von einem Ding das nicht funktioniert. Hab hier eine Mini im Einsatz und schau mir gerade weitere GSM-shields an.

  4. Ich bin seit kurzem Arduino Anfänger, probieren dies und das aus und finde dies für mich als wohlverdienten Rentner aus der IT-Branche eine sinnvolle Freizeitbeschäftigung. Dringend suche ich ein Projekt, dass mit einem Arduino Uno und dem SIM900 GSM/GPRS Shield auf Knopfdruck eine SMS an eine Mobilfunknummer schickt. Ebenfalls ist eine SIM-Karte vorhanden. Leider stehe ich erst am Anfang und werde solch einen Sketch erst in ein paar Jahren verstehen und selbst entwickeln können.

    Kann mir da jemand Hilfe zukommen lassen. Vielen Dank im Voraus

    Reinhard

    1. Hallo Reinhard,

      ich bin ziemlich sicher, das wird keine Jahre dauern. Schaue Dir einfach erst einmal die vorhandenen Sketche an, versuche die zu verstehen, passe die an. Vielleicht muss es ja auch nicht gleich zu Anfang ein GSM Sketch sein. Mein Vorschlag ist da immer mit dem Arduino „Hello World“ und dme Blinken von LEDs anzufangen. von hier aus geht es dann schnell weiter. WEnn Du das verstanden hat, ist es zum Senden einer SMS auf Knopfdruck nicht mehr weit.
      Gruß Olaf

  5. Hallo Olaf,

    ich habe schon einige Projekte mit Sketchen selbst gebaut. So z.B. eine Temperaturregelung und einen Helligkeitssensor. Nun möchte ich mir eine Servo- Regelung bauen, so dass ich immer weiter in diese Welt einsteige. Mein GSM-Projekt ( senden einer SMS auf Knopfdruck) muss irgendwie nebenher laufen, da ich dieses für mich schnellstmöglich benötige ( als Sicherheit für meine Mutter, wenn ich mal nicht zu Hause bin). SMS über den Seriellen Monitor funktioniert schon, aber über einen Taster angeschlossen an einem Digitalen PIN klappt noch nicht

    Gruß Reinhard

  6. habe den sketch mal getestet leider geht er nicht, ich glaube mir fehlt die passende bibiliothek.
    würde mich über eine antwort freuen

  7. Hallo Olaf,

    nun habe ich es als blutiger Anfänger dank deiner als auch anderer Tutorials geschafft, das GSM-Shield am Controller betreiben zu können.

    Anfangs wurden mir auf AT-Eingaben keine Rückmeldungen gegeben bis ich ein Tutorial bei Youtube fand, in dem der Ersteller drei Verbindungen zwischen Shield und Controller eingespart hatte; +5V, RX und TX. Es blieben also nur noch Ground, PIN9 zum Einschalten und die PINS7/8 für die serielle Schnittstelle übrig und schon konnte ich SMS versenden und auch den Empfang darstellen lassen!

    Lieben Gruß
    Jens

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s