Durch einen Hinweis auf einer anderen Webseite bin ich auf das AI Thinnker A7 Modul gestoßen. Hierbei handelt es sich um ein GSM und GPS Modul für gerade mal 8€. In der oben verlinkten Variante mit Adapter-Platine ist das A7-Modul relativ leicht nutzbar. In folgenden Artikel zeige ich, wie man das Modul zusammen mit einem ESP8266 nutzen kann.
Zwei Warnungen:
- Die mitgelieferte längere Antenne ist laut einem Beitrag von Andreas Spiess nicht für GPS geeignet, da es sich um eine normale WLAN-Antenne handelt.
Ich habe deshalb für 2€ eine passive GPS-Antenne mitbestellt. - Laut einem Datenblatt, benötigt der A7 zwar eine Versorgungsspannung von 5 V, aber die GPIOs sollten mit max. 2,8 V angesprochen werden. Andere Quellen gehen aber von 3,3 V aus.
Wenn ihr den esp8266 nutzt, wird der A7 mit 3,3 V angesprochen, was möglicherweise zu viel Spannung ist. In meinen Test funktionierte es jedoch ohne Probleme. Wer sicher gehen will, nutzt ein Level-Konverter inkl. einer 2,8 V Referenzspannung, die ihr aus einem entsprechenden Spannungsteiler konstruieren könnt.
Da es leider sehr wenig Information bzgl. dem Betrieb an einem ESP8266 gab, stelle ich hier die relevanten Information inkl. Sourcecode zur Verfügung. In diesem Artikel konzentriere ich mich auf die GPS Funktionalität.
In diesem Beispiel nutzte ich ein Nodemcu-Board. Das Nodemcu und das A7-Board wird hierbei über USB mit Strom versorgt.
Mit dem A7 wird über zwei serielle Schnittstellen kommuniziert. Die erste Schnittstelle (11.5200 Baud, U_TXD und U_RXD Pins) dient zur Ansteuerung des A7. Über die zweite Schnittstelle (9.600 Baud, nur GPS Pin) werden die GPS Informationen im NMEA-Format zurückgeliefert.
Die 3 Pins werden folgendermaßen verbunden:
A7 | Nodemcu |
---|---|
U_TXD | D6 |
U_RXD | D5 |
GPS | D7 |
Und noch mein minimalistischer Sourcecode:
#include "Arduino.h" #include "SoftwareSerial.h" SoftwareSerial readerSerial(D6, D5); // RX, TX SoftwareSerial gps(D7, -1); // RX, TX unsigned long timeout = 0; String input = ""; void setup() { Serial.begin(115200); delay(3000); Serial.println("Started"); readerSerial.begin(115200); gps.begin(9600); input.reserve(40); } void loop() { // If you receive no data, enable GPS Tracking if (timeout < millis()) { Serial.println("Sending GPS enable"); readerSerial.print("AT+GPS=1\r\n"); resetTimeout(); } // New GPS Data if (gps.available() > 0) { resetTimeout(); char chr = (char) gps.read(); input.concat(chr); if (chr == '\n') { process(input); input = ""; } } // New Data from the A7 if (readerSerial.available() > 0) { uint chr = readerSerial.read(); Serial.print((char)chr); } } void resetTimeout() { timeout = millis() + 2000; // retry in 2 sec } void process(String inp) { if (inp.startsWith("$GPRMC")) { Serial.print("DATA: " + inp); } else if (inp.startsWith("$GPGGA")) { Serial.print("Fix Data: " + inp); } else if (inp.startsWith("$GPGSA")) { Serial.print("DOP/Satellites: " + inp); } else if (inp.startsWith("$GPGSV")) { Serial.println("Satellites: " + inp); } else if (inp.startsWith("$GPVTG")) { Serial.print("Track/Speed: " + inp); } else { Serial.println("Unknown: " + inp); } }
Solange der ESP8266 keine Daten empfängt, sendet er alle zwei Sekunden den Befehl zur Aktivierung der GPS-Empfangs. Anschließend werden die empfangenen Informationen für die serielle Schnittstelle in Richtung PC weitergeleitet.
Dies ist natürlich nur der Anfang.
Wer die GPS-Daten auswerten will, sollte sich mal TinyGPS++ anschauen. Im Bereich GSM könnt ihr euch TinyGSM oder Bibliotheken anschauen, die für den A6 entwickelt wurden.
Um das ganze Konstrukt mobil zu bekommen, müsste man sich über eine Stromversorgung Gedanken machen und eine Möglichkeit einbauen, den A7 vom ESP8266 aus, via Transistor, einschalten zu können.
Meine Planung läuft in Richtung einem Tracker, der zur Bestimmung der Position GPS, GSM-Zellen und WLan-Netze nutzt.
[Update] Ein paar Tage/Wochen später, meine ersten Erfahrungen:
Bei meinen Test zeigten sich erbliche Probleme mit der Ansteuerung der seriellen Schnittstelle. Der A7 schien immer mal wieder die Baud-Rate zu ändern, was zu ziemlich viel Zeichenmüll führte. Außerdem fehlten immer mal wieder ganze Teile der Antworten des A7. Besser wurde es, als ich die WLAN-Funktionalität des ESP8266 komplett deaktivierte. Bekanntermaßen wird auf dem ESP8266 sowohl die Programmausführung als auch die WLAN-Steuerung auf dem gleichen Chip ausgeführt. Da ich aber mit dem A7 über zwei per Software simulierte UART-Verbindung kommuniziere, vermute ich schlicht und einfach Timing-Probleme.
Zwei mögliche Lösung sehe ich gerade: Einmal die zwei durch die Software simulierte UARTs durch Hardware-basierte UARTs zu ersetzen. Hierfür wäre die SC16IS752-Familie von NXP interessant. Dieses Modul kann über i²c gesprochen werden und verfügt über zwei echte UARTs. Oder aber macht nutzt den ESP32, der mehrere Hardware UARTs unterstützt.
Thanks for sharing. It saved me a lot of time for the 1st setup.
Mega Interessant. Genau an so einer Idee bin ich auch gerade dran. Ich will einen einfachen Schlüsselanhänger bauen der einfach Programierbare SMS/Instant Messages verschicken kann an selbst programmierbare Nummern auf Knopfdruck. Ich hatte da an einen ESP8266 und ein GSM Modul gedacht. Hab es aber noch nicht genau spezifiziert. Sollte ein nützliches Hobby projekt werden. Eine Art Panic Button. Das soll nichts kommerzielles werden. Deswegen bin ich gerade auf deinen Beitrag gestoßen. 🙂
Bist du weiter gekommen oder evtl. Fertig geworden?
Wegen den oben genannten Problemen, ruht das Projekt erstmal.
Ich werde es wohl bei Gelegenheit nochmal mit einem ESP32 probieren.