Dieser Beitrag wurde uns von dem Gastautoren Matteo Trovò zur Verfügung gestellt:
Elektronische Sensoren sind Teil vieler digitaler Geräte, die wir jeden Tag benutzen, wie unsere Smartphones, unsere Computer oder unsere Autos.
Ein Sensor ist im Grunde ein Gerät, das Informationen jeglicher Art sammelt (in der Regel eine physikalische Größe), die dann von einer Recheneinheit verwendet werden kann, um eine Entscheidung zu treffen und folglich in der physischen Welt zu interagieren. Einige Beispiele aus der realen Welt sind die Beschleunigungssensoren, die in jedem Smartphone eingebaut sind und die es ermöglichen, den Bildschirm jedes Mal richtig auszurichten, wenn wir das Telefon bewegen, oder der Öldrucksensor eines Autos, der bei der Diagnose eines Motorproblems helfen kann.
Ein weiteres interessantes Beispiel sind Sensoren, die für die Umweltüberwachung eingesetzt werden. Die Umweltüberwachung besteht aus jeder Art von Datenerfassung in Bezug auf eine bestimmte Umgebung, die in der Regel Temperaturen, Druck, Luftfeuchtigkeit usw. umfasst. Das bezieht sich auf eine lokale Umgebung, wie unser Zuhause, oder eine entfernte Umgebung, wie einen beliebigen Ort außerhalb unseres Heimnetzwerks.
In diesem Artikel werde ich später ein Beispiel zeigen und somit sehen wir, wie es möglich ist, den Temperatursensor aus einem vorherigen Artikel anzuschließen: Temperaturmessung? Niemals so einfach mit STM32 und MCP9808! (englisch) mit einem SIM800L GSM Mobilfunkmodem, um einen Ferntemperatursensor zu erstellen, der per SMS ausgelesen werden kann.
Was ist ein Mobilfunkmodem?
Ein Mobilfunkmodem-Modul ist eine integrierte Komponente, die in allen Fällen verwendet wird, in denen eine zellulare Kommunikation erforderlich ist, wie zum Beispiel bei unseren Smartphones. Mit einem Mobilfunkmodem ist es grundsätzlich möglich, SMS zu senden und zu empfangen, Telefonate zu führen und sogar im Internet zu surfen.
Auf dem Markt sind verschiedene Modultypen erhältlich, die auf unterschiedlichen Mobilfunktechnologien basieren, wie 2G, 3G oder 4G (Tabelle 1).
Tabelle 1: Einige der älteren und neueren Mobiltelefontechnologien.
Diese Module können in der Regel leicht an jeden Mikrocontroller angeschlossen werden, wobei Schnittstellen wie UART oder SPI verwendet werden.
Während für GSM- und GPRS-Modems nach wie vor UART am häufigsten verwendet wird, da eine geringe Datenrate erwartet wird, ist SPI die am häufigsten verwendete Wahl für LTE-Modems, bei denen hohe Performance erforderlich ist.
Die Kommunikation mit dem Mobilfunkmodem erfolgt über ein spezielles String-basiertes Protokoll, die sogenannten AT-Befehle. Eine kurze Erläuterung dieser Befehle wird in einem anderen Kapitel gegeben.
Normalerweise enthält ein Mobilfunkmodem den kompletten Software-Stack für den Telefonteil, die SMS-Verarbeitung und die Internetverbindung, was die Integration in eingebettete Systeme so weit wie möglich vereinfacht.
Werfen wir nun einen genaueren Blick auf das Modemmodell, das wir für dieses Projekt verwenden werden, das SIM800L.
SIM800L Modem-Modul
SIM800L ist ein sehr bekanntes und weit verbreitetes Mobilfunkmodem-Modul, das sehr häufig in Embedded-System-Projekten eingesetzt wird, wo eine Telefon-/Internetverbindung benötigt wird und keine anderen Netzwerke (z.B. Wi-Fi) verfügbar sind.
Das Modul ist unter Fachleuten und Bastlern sehr bekannt und kann leicht von verschiedenen Mikroelektronik-Anbietern im Internet gekauft werden.
Es folgt ein Bild des Moduls, sowohl von oben als auch von unten (Bild 1):
Abbildung 1: SIM800L Modulbausatz, Ansicht von oben und unten
Wie auf dem Bild zu sehen ist, ist das Mobilfunkmodemmodul auf eine kleine Testplatine gelötet, deren Pins über die seitlichen Stiftleisten zugänglich sind. Es wurden nicht alle Pins des Moduls angeschlossen, um den Zugang zu erleichtern, sondern nur einen Teil davon. Dadurch ist es möglich, die grundlegenden Modemfunktionen zu nutzen. Die Gesamtzahl der Pins ist sehr hoch. Zwei verschiedene Antennen sind im Bausatz enthalten. Auf der Unterseite ist der Steckplatz zu sehen, in den die SIM-Karte eingelegt werden muss. Mobilfunkmodule benötigen eine SIM-Karte, wie wir sie auch in unseren Smartphones verwenden. Jede funktionierende SIM-Karte mit genügend Guthaben für den Grundbetrieb kann hier eingesetzt werden. Bitte beachten Sie, dass der Steckplatz nur für das Micro-SIM-Kartenformat geeignet ist, allerdings sind Adapter leicht zu finden.
Es folgt ein Makro-Schaltplan des Evaluation Boards aus dem AZ-Lieferumfang, der die Pinbelegung zeigt (Bild 2):
Abbildung 2: Pinbelegung des AZ Delivery SIM800L Evaluation Boards
Das Modul wird mit einem klassischen UART über AT-Befehle an einen STM32 angeschlossen. Die Pins für den UART sind RXD und TXD.
Ein Lautsprecher und ein Mikrofon können verbunden werden, um Anrufe tätigen und empfangen zu können. Der Lautsprecher kann an die Pins SPKP und SPKN, das Mikrofon an die Pins MICN und MICP angeschlossen werden. Diese beiden Schnittstellen sind unterschiedlich. Die Antenne kann an den ANT-Eingang angeschlossen werden. Erwähnenswert ist, dass das Mobilfunkmodem mit einer Nennspannung von etwa 4 Volt (VCC-GND) arbeitet. Das Modem ist recht anspruchsvoll in Bezug auf die Stromaufnahme, daher kann das Modul nicht direkt vom Entwicklungsboard versorgt werden und es ist eine externe Stromversorgung erforderlich. Ein Netzteil, das Spitzenwerte von 2 Ampere bei 4 Volt liefern kann, wäre ausreichend.
Modem AT-Befehle
AT-Befehle (oder Hayes-Befehle) bestehen aus einem Befehlssatz, der sich aus einer Reihe kleiner Textzeichenfolgen zusammensetzt. In Kombination werden sie verwendet, um die Ausführung bestimmter Vorgänge auf Modems, wie Telefonanrufe, das Senden und Empfangen von SMS oder die Datenübertragung über das Internet, auszulösen.
Eine sehr gute Einführung in das Thema finden Sie hier:
https://de.wikipedia.org/wiki/AT-Befehlssatz
während ein vollständiger Befehlssatz für die SIM800L hier zu finden ist:
https://www.elecrow.com/wiki/images/2/20/SIM800_Series_AT_Command_Manual_V1.09.pdf.
Los geht's! Einrichten der Hardware
Nach dieser Einführung können wir nun die Hardware einrichten. Das Mobilfunkmodem wird an ein STM32 Nucleo-64 Evaluation Board angeschlossen, für das bereits in diesem Beitrag eine gute Einführung zu finden ist: Using the USB Serial Port on the STM32 Nucleo-64 board
In der folgenden Abbildung ist der komplette elektrische Schaltplan unseres Projekts (Bild 3) und auch ein Bild meines aktuellen Aufbaus (Bild 4) zu sehen.
Abbildung 3: Elektrischer Schaltplan des Fernsensors
Der Schaltplan ist relativ einfach und verwendet zwei UARTs und einen I2C. Der I2C wird zum Auslesen des MCP9808-Temperatursensors, während ein UART zum Debuggen verwendet wird (serieller Port). Der andere UART ist mit dem SIM800L-Modem verbunden ist. Relevant ist der Stromanschluss des Modems, der von einem externen Netzteil mit 4 Volt versorgt werden muss. Der Reset-Pin wird beim Start verwendet, um das Modem vor der Initialisierung zurückzusetzen. Es kann ein beliebiger freier GPIO-Pin des STM32 sein. In meinem Projekt habe ich ihn über den Pin PA8 konfiguriert.
Ein weiterer wichtiger Punkt ist, dass alle beteiligten Masseanschlüsse untereinander verbunden sein sollten. (Eval-Platine und externe Stromversorgung).
Abbildung 4: Hardware Setup
Die Software
Sie können jetzt das gesamte Projekt von GitHub hier herunterladen: https://github.com/EmbeddedEspresso/remote_temp
Dies ist ein STM32CubeIDE-Projekt, so dass Sie es kompilieren und mit dem Debugging über den STM32 beginnen können.
Die Software ist in mehreren Zustandsmaschinen organisiert. Eine für jede spezifische Handhabung, wie z.B. I2C oder UART Modem Kommunikation. Es folgt ein Blockschaltbild der Software und eine kurze Beschreibung der einzelnen Handler (Bild 5).
Abbildung 5: Softwarearchitektur
Alle Zustandsautomaten werden von der main() initialisiert und ausgeführt, wie im folgenden Codeabschnitt der Datei main.c gezeigt wird:
/* Initialize all the software state machines */ UartModemHdlrInit(&huart1); UartDebugHdlrInit(&huart2); ModemHdlrInit(); DebugHdlrInit(); AppHdlrInit(); TempSensorHdlrInit(); while (1) { /* Main software handler */ UartModemHdlrRun(); UartDebugHdlrRun(); ModemHdlrRun(); DebugHdlrRun(); AppHdlrRun(); LedAliveRun(); TempSensorHdlrRun(); }
Alle Softwaremodule basieren, wie bereits erwähnt, auf Zustandsautomaten, die so konzipiert sind, dass sie eine ablauffähige und nicht blockierende Implementierung bieten.
Die Ausführungszeit jedes "Run"-Funktionsaufrufs ist so gering wie möglich, da alle Zustände klein und so konzipiert sind, dass keine Warteschleife erforderlich ist (z. B. nicht blockierender Hardwarezugriff).
Modem- und Debug-UART-Treiber
Die UART-Treiber wurden komplett neu geschrieben, weshalb die standardmäßig generierten STM-HAL-Treiber nicht verwendet wurden. Der Grund dafür war, eine nicht-blockierende Implementierung zu erhalten, die Polling so weit wie möglich ausschöpfen kann.
Der für das Debugging verwendete UART hat eine vollständige Polling-Implementierung, bei der jeder Hardware-Zugriff über einen speziellen Switch-Case-Zustand abgewickelt wird, was eine nicht blockierende reentrant-Implementierung (eintrittsinvariant) ermöglicht. Leistung ist für diesen Treiber kein Muss, daher wurde hier keine tiefergehende Optimierung durchgeführt.
Beim UART, der für die Modemkommunikation verwendet wird, sieht die Sache etwas anders aus: während die vom Mikrocontroller gesendeten Befehle in keinem Fall unter Leistungsproblemen leiden, können wir das Gleiche für die vom Modem empfangenen Daten nicht sagen. Das Modem selbst kann von uns in Bezug auf die erzeugten Daten nicht kontrolliert werden, und es ist auch nicht möglich, vorherzusagen, wann das Modem Daten senden wird, auch wegen der unaufgeforderten Befehle, die normalerweise durch zufällige Ereignisse und nicht durch eine spezifische Mikrocontroller-Anfrage ausgelöst werden, weshalb hier eine Interrupt-Lösung gewählt wurde (Abbildung 6).
Abbildung 6: Einzelheiten der Treiberimplementierung für Modem UART
Der Empfangspuffer für den Modem-UART hat auch eine spezielle Handhabung, um eine feste Formatierung der empfangenen Strings zu gewährleisten. Beim Empfang wird automatisch durch jedes Befehlstrennzeichen ein Teil (\r und \n, falls vorhanden) entfernt.
Modem Handler
Der Modem Handler besteht aus der kompletten Modem-Befehls- und Initialisierungs-Verarbeitung. Dieser Handler kümmert sich um die Durchführung einer vollständigen Modeminitialisierung und die Behandlung aller anderen Befehle. Er bietet eine Schnittstelle, die auf mehreren APIs basiert, um die Integration von höheren Funktionsschichten zu vereinfachen.
Das Modul ist recht skalierbar, so dass neue Befehle oder neue APIs leicht hinzugefügt werden können. Hier folgt eine Liste der angebotenen APIs:
- ModemHdlrGetSignalLevel: ermöglicht das Auslesen des aktuellen Signalempfangspegels des Modems
- ModemHdlrGetDateTime: ermöglicht das Abrufen des aktuellen Datums und der Uhrzeit aus der verbundenen Funkzelle
- ModemHdlrSendSMS: Sendet eine SMS an eine bestimmte Nummer
- ModemHdlrReadSMS: Lesen einer empfangenen SMS aus dem lokalen Speicher des Modems
- ModemHdlrDeleteSMS: Löschen einer bestimmten SMS oder des gesamten SMS-Speichers
Debug Handler
Dieser Handler erlaubt es, Echtzeit-Debugging zu verwalten. Vor allemist er hilfreich, um die Anwendung und den Monitor-Status zu überwachen. Dieses Modul bietet keine externe API und gibt lediglich einige Menüs aus, in denen einige Befehle an das Modem ausgegeben werden können. Es ermöglicht auch eine direkte Modem-Debugging-Sitzung. Um das Menü zu erreichen, genügt es, in der Putty-Konsole 'm' einzugeben. Hier folgt ein Screenshot (Bild 7) des Debug-Menüs, in dem der Befehl zum Abrufen des Modemsignalpegels aufgerufen wurde:
Temperatur Sensor Handler
Dies ist ein einfaches Modul, das den Temperatursensor handhabt, einschließlich der I2C-Kommunikation. Die verwendeten I2C-Treiber stammen aus dem STM HAL-Paket und sind daher beim Senden und Empfangen von Daten blockiert. Obwohl dies vielleicht nicht die beste Lösung für ein Endprodukt wäre, kann es in unserem Demotest, bei dem alle Ausführungszeiten für jede Aufgabe überwacht wurden, sicher verwendet werden. Sobald die Temperatur abgetastet wird, wird eine Variable mit dem neuesten Wert aktualisiert. Auf diese Variable kann von den anderen Modulen über eine spezielle API zugegriffen werden: TempSensorGetValue.
Application Handler
In diesem Modul befindet sich die eigentliche Logik der Software. Die Anwendung prüft, ob eine SMS empfangen wurde. Falls ja, sucht sie im Textinhalt nach der Zeichenfolge "Get Temperature". Wenn die Zeichenfolge erkannt wird, wird die Temperatur per SMS an die gleiche Nummer zurückgesendet, die die Anfrage gestellt hat (Abbildung 8).
Abbildung 8: Ablaufdiagramm der Hauptfunktionalität
Testen der GSM-Verbindung
Der erste Test prüft, ob wir die elektronische Schaltung korrekt realisiert haben. Wir testen nur die Verbindung mit dem Mobilfunkmodem und dann prüfen, ob wir Befehle senden oder empfangen können.
Die Nutzung der Funktion "Direct Modem Debugging" des Debugging-Menüs ermöglicht es uns, eine Art Brücke zu entwickeln, bei der der STM32 als Durchgang zwischen den beiden verwendeten UARTS, dem Debug-UART und dem Modem-UART, fungiert.
Abbildung 9: Diagramm des "UART-Bridge"-Ansatzes
Die Lösung ist recht einfach und besteht im Wesentlichen darin, jedes empfangene Byte vom Modem-UART an den Debug-UART weiterzuleiten und umgekehrt.
Jetzt können wir das Board einfach über den USB-Anschluss an einen PC anschließen und unseren Code mit einem seriellen Terminal testen. Für dieses Beispiel werde ich Putty verwenden, das hier heruntergeladen werden kann. Nach dem Öffnen zeigt das Tool das folgende Konfigurationsfenster an (Abbildung 10).
Abbildung 10: Screenshot der Putty-Konfiguration
Sobald die richtigen Parameter ausgewählt sind, wie z.B. der richtige COM-Port oder die richtige Geschwindigkeit, können wir auf Open klicken, um die Sitzung zu starten.
Starten Sie dann das Projekt über Run->Debug. Von der Putty-Konsole aus können wir dann das Menü aufrufen, indem wir 'm' und dann noch einmal 5 eingeben, um die Funktion "Direct modem debugging" zu aktivieren. Von nun an wird jedes getippte Zeichen an das Modem weitergeleitet (Abbildung 11).
Abbildung 11: Direct modem debug Modus
Lassen Sie uns nun einige Befehle an das Modem senden. Wir können mit dem klassischen AT beginnen, das im Grunde nur dazu dient, die Modemverbindung zu testen und den Status der SIM-Karte zu überprüfen. Damit kann festgestellt werden, ob eine PIN erforderlich ist oder nicht (Abbildung 12):
Abbildung 12: Beispiel für AT-Befehlsanfragen und -antworten
Wie auf dem Bild zu sehen ist, antwortete das Modem positiv auf den Befehl AT, mit einem OK und es antwortete ohne Fehler auch auf den Befehl "AT+CPIN?", der den Pin-Status der SIM-Karte abfragt. Offensichtlich erfordert die SIM-Karte in diesem Fall keine Pin-Code-Aktivierung und kann für SMS oder Internet verwendet werden. Wir können nun mit dem nächsten Kapitel fortfahren und schließlich das gesamte Projekt testen.
Bereit, Ihren GSM-Sensor zu testen?
Wenn der vorherige Test erfolgreich durchgeführt wurde, können wir davon ausgehen, dass unser Modem korrekt mit unserem STM32 verbunden ist. Wir können nun den direct debugging-Modus verlassen, indem wir 'q' eingeben und die Anwendung mit der Option '6' neustarten. Die Initialisierung beginnt, wie in der Abbildung (Bild 13) gezeigt:
Abbildung 13: Initialisierung
Während der Initialisierung werden viele Debug-Strings ausgegeben, die es uns ermöglichen, den aktuellen Softwarestand zu verstehen. Relevant sind die unaufgeforderten Meldungen "Call Ready" und "SMS Ready", die der Software im Wesentlichen anzeigen, dass das Modem bereit ist, für SMS und Anrufe verwendet zu werden.
In der Zwischenzeit wird auch die Temperaturaufzeichnung der Sensordaten angezeigt.
Sobald die Initialisierung abgeschlossen ist, ist die Software bereit, SMS zu empfangen und die aktuelle Temperatur abzufragen. Senden wir nun von unserem Smartphone eine SMS mit dem Text "Get Temperature" an die Telefonnummer des Mobilfunkmodems und beobachten die protokollierte Ausgabe von Putty (Abbildung 14):
Abbildung 14: Debug-Ausgabe während des Empfangs und der Beantwortung der Temperatur-SMS
Sobald die eingehende Nachricht von der Software erkannt wird („unsolicited detected-> +CMTI“), wird die Nachricht gelesen und der Inhalt analysiert. Wenn der Inhalt mit der Zeichenfolge "Get Temperature" übereinstimmt, wird eine neue SMS mit der aktuellen Temperatur als Text und mit der Telefonnummer des Empfängers erstellt, die auf dieselbe Nummer wie die des Absenders eingestellt ist.
Der Debug-String "SMS sent successfully" zeigt an, dass die SMS korrekt versendet wurde. Es folgt ein Screenshot der gesendeten und empfangenen Nachricht von meinem Telefon (Bild 15):
Abbildung 15: Smartphone Screenshot mit der empfangenen Temperatur
Fazit
In diesem Artikel wurde gezeigt, wie das SIM800L-Modem einfach an einen STM32 angeschlossen werden kann, um einen SMS-basierten Temperatursensor zu erstellen. Natürlich ist SMS nicht mehr die am häufigsten verwendete Datenübertragungstechnologie, aber es ist immer noch eine gute Lösung, wenn man die relativ kleine Datenrate bedenkt.
Das SIM800L-Modem unterstützt auch 2G-Internetverbindungen. Eine mögliche Projekterweiterung wäre daher, den Modem-Handler um die Unterstützung von Internetbefehlen zu erweitern, um die Temperaturdaten direkt an einen Server zu senden, der die Daten sammeln und eine grafische Visualisierungsschnittstelle anbieten kann.
Matteo Trovò