Antrax GPS/GSM/GPRS Shield
von Stefan Schuster
Dieser Artikel nimmt am Artikelwettbewerb 2012/2013 teil.
GPS und GSM sind häufig mit Arduino verwendete Technologien. Bei der Kombination von beiden können Daten mit GPS Informationen angereichert und per GSM verschickt werden. Dieser Artikel beschreibt die Verwendung des GPS/GSM Shields von Antrax Datentechnik mit einem Arduino Board. Es wird eine eigene Bibliothek für die Verwendung von GSM und GPS vorgestellt (frei zum Download). Die verwendeten Chips sind auch in vielen anderen Produkten vorhanden oder können direkt mit wenig Beschaltung verwendet werden. Daher kann dieser Artikel auch bei ähnlichen Produkten mit diesem Chips weiterhelfen. Anhand von Beispielen wird auf die Funktionen des Shields eingegangen. Getestet sind die Beispiele auf einem Arduino Mega R3. Die Bibliothek kann mit kleinen Anpassungen auch auf einem Arduino Uno verwendet werden. Das Ziel des Artikels ist es, eine Grundlage für die Arbeit mit dem Shield oder den einzelnen sowie kompatiblen ICs zu liefern.
Die Hardware und Anbindung des GPS/GSM Shields
Dieser Abschnitt enthält die wichtigsten technischen Informationen zu den verbauten Komponenten und deren Anbindung. Die Angaben basieren auf den Produktinformationen aus der Seite des Onlineshops[1]. Das Shield ist für einen Arduino Uno ausgelegt, es ist jedoch auch eine Anleitung und sogar ein Umbaukit verfügbar, mit dem die einfach Adaption an einen Arduino Mega gegeben ist. Die Anbindung des Shields an den Arduino ist mit Level-Shiftern realisiert, d.h. die interne Betriebsspannung und die Pegel des GSM und des GPS Teils können von den üblichen 5V des Arduino abweichen (und tun es auch). Als Level-Shifter Bausteine kommen 74AVC4T774 ICs zum Einsatz. Die notwendigen Betriebsspannungen werden auf dem Shield selbst aus der Ardunio-Spannungsversorgung erzeugt.
Verwendete Pins
Die verwendeten Pins sind in der Shieldlist[2] dokumentiert. Aus Gründen der Übersichtlichkeit hier nochmals als Liste (bezogen auf das Arduino Uno Layout).
| Arduino Uno Pin | Bedeutung |
|---|---|
| D0, D1 | RX, TX (Serielle Kommunikation mit GSM) |
| D2 | CRING (Serielle Kommunikation mit GSM) |
| D3 | CTS (Serielle Kommunikation mit GSM) |
| D4 | DTR (Serielle Kommunikation mit GSM) |
| D5 | RTS (Serielle Kommunikation mit GSM) |
| D6 | DCD (Serielle Kommunikation mit GSM) |
| D7 | GSM_EN (GSM einschalten) |
| D9 | GPS LED (kann auch via SPI eingeschaltet werden) |
| D10, D11, D12, D13 | SPI Kommunikation mit GPS |
| A0 als D14 | P1 (GSM-Button, kann auch via SPI abgefragt werden) |
| A1 as D15 | P2 (GPS-Button, kann auch via SPI abgefragt werden) |
Achtung: Da die RX/TX Pins D0 und D1 verwendet werden, kommt es zu einer Überschneidung mit dem USB-UART eines Arduino Uno (und wenn die Pins nicht anderst verbunden werden auch beim Mega). Das zeigt sich auch daran, dass im Serial Monitor der Arduino IDE die AT Befehle und Antworten des GSM Modems zu sehen sind. Siehe dazu auch den Eintrag im Forum [3]
Für die Verwendung mit dem Arduino Mega R3 sind die folgenden Pins vorgesehen (Achtung, das bedeutet, das man das Shield nicht einfach stecken kann, es muss statt dessen mit Brücken/Kabeln passend verbunden werden!).
| Arduino Mega R3 Pin | Bedeutung |
|---|---|
| D19, D19 | RX, TX (Serielle Kommunikation mit GSM Serial1) |
| D2 | CRING (Serielle Kommunikation mit GSM) |
| D3 | CTS (Serielle Kommunikation mit GSM) |
| D4 | DTR (Serielle Kommunikation mit GSM) |
| D5 | RTS (Serielle Kommunikation mit GSM) |
| D6 | DCD (Serielle Kommunikation mit GSM) |
| D7 | GSM_EN (GSM einschalten) |
| D9 | GPS LED (kann auch via SPI eingeschaltet werden) |
| 50, 51, 52, 53 | SPI Kommunikation mit GPS |
| A0 als D14 | P1 (GSM-Button, kann auch via SPI abgefragt werden) |
| A1 as D15 | P2 (GPS-Button, kann auch via SPI abgefragt werden) |
GSM Teil
Es ist das GSM-Modul Telit GE865-QUAD [4] verbaut. Eine Antenne ich nicht auf dem Board, es ist eine externe Antenne notwendig. Diese wird über einen SMA/M-Konnektor angeschlossen. Ebenso ist eine SIM-Karte notwendig (im Mini-SIM Format). Die Betriebsspannung des GSM Teils beträgt 4V. Die Kommunikation erfolgt über Pegelwandler direkt zwischen Arduino-Board und dem GSM Chip. Das Setup der Schnittstelle wird durch die Library erledigt. Ist die Verbindung hergestellt, werden AT-Kommandos ausgetauscht.
GPS Teil
Beim GPS Modul handelt es sich um ein UP501 von Fastrax [5]. Die Betriebsspannung des GPS Teils beträgt 3,3V. Die Kommunikation mit dem GPS Modul erfolgt über SPI zum Shield. Dort wird SPI mit einer SC16IS750 SPI-UART Bridge an das eigentliche GPS Modul angebunden. Das bedeutet, dass nach dem Setup der Bridge (wird von der Library erledigt) über SPI mit dem GPS Modul kommuniziert werden kann, die Fluss-Steuerung erfolgt durch die Kommunikation mit den Registern des SPI-UART Chips. Auch hier sind die Details durch die Library gekapselt. Die Kommunikation auf Anwendungsebene erfolgt durch den Austauch von NMEA Sätzen.
Die Software Library und die Funktionen
Dieser Abschnitt beschreibt die beiden Libraries, deren Methoden für den Anwender und interne Funktionsweise. Die Library kommt in einem zip-File. Dieses wird in das "libraries" Verzeichniss von Arduino entpackt. Danach stehen die beiden Headerfiles GSM.h und GPS.h zur Verfügung, die in eigene Programme inkludiert werden können. Ebenso steht nach einem Neustart der Arduino IDE ein Beispiel zur Auswahl.
Generelle Funktion und Aufruf der Library
Die Library stellt zwei Klassen zur Verfügung GPS und GSM. Diese werden nicht im Headerfile instanziiert (das macht z.B. die SPI Lib so, darum kann man da gleich SPI.methodeX aufrufen), sondern muss selbst instanziiert werden. Alle Methoden der Klassen sind nicht wartend ausgelegt und nicht blockierend. Das bedeutet, dass Sie gut in der Haupt-Loop aufgerufen werden können, wenn nichts zu tun ist oder noch kein Ergebniss vorliegt kehren Sie sofort zurück. Es bedeutet aber auch, dass die Methoden unter Umständen öfter aufgerufen werden müssen, bis ein Ergebniss vorliegt (weil z.B. ein NMEA String noch nicht vollständig vorliegt). Ein Beispiel dazu ist die Methode (reduziert auf die logischen Schritte, mit pseudocode_ namen markiert): <C> bool GPS::read_gps_buffer() {
pseudocode_lese_zeichen_von_GPS();
if(pseudocode_NMEA_zeile_fertig()) { // <cr> emfpangen?
return true;
} else {
return false;
}
} </C> Um also alle Zeichen zu lesen und einen kompletten NMEA String im Puffer vorzufinden, muss ein Aufrufer die Methode wie folgt benutzen: <C> GPS gps; void loop() {
// .... in der main loop andere dinge erledigen
// prüfen, ob schon ein ganzer String vorliegt
if(gps.read_gps_buffer()){
// puffer hält kompletten NMEA String, abholen!
my_buffer = gps.get_gps_buffer();
}
// ....
} </C> Die Methode wird also in jedem Schleifendurchlauf aufgerufen und meldet dann per Rückgabewert, wenn sie ein sinnvolles Ergebniss erzeugt hat. Wenn das Ergebniss noch nicht da ist, dann vielleicht beim nächsten Aufruf. Das klingt erstmal umständlich, damit hat der Aufrufer aber die bessere Kontrolle über die zeitlichen Ablauf seines Programmes. Oft sollen ja noch andere Dinge erledigt werden, während z.B. das GPS Modul noch kein Ergebniss geliefert hat. Ausflug in die Programmierung allgemein: Wenn eine Funktion nicht in jedem Durchlauf aufgerufen werden soll, dann kann man das gut mit dem Einsatz der millis() Funktion tun. Einfach bei jedem Durchlauf prüfen ob schon genug Zeit vergangen ist. Ein guter Artikel dazu findet sich unter [6]
GPS verwenden
Die GPS Klasse verwendet die SPI Pins der jeweiligen Plattform wie oben in den Tabellen angegeben. Es wird intern die SPI Bibliothek verwendet. Die öffentlichen Methoden sind hier aufgelistet (mit Beschreibung):
Einzelnachweise
- ↑ Shield Bezug GSM/GPS Shield im Antrax Online-Shop
- ↑ Antrax GPS/GSM bei Shieldlist Shieldlist
- ↑ Forenbeitrag zum Shield und Arduino UnoForenbeitrag
- ↑ Telit GE865-QUAD Datenblätter und Guides Telit GE865-QUAD Product Page
- ↑ Fastrax UP501 Datenblätter und GuidesFastrax UP501 Product Homepage
- ↑ Artikel zu Arduino und Zeit-Programmierung Tutorial: Arduino und Zeit
Board im Antrax Onlineshop