Low Cost GSM/GPRS-(SIM800)-Node

Nachdem wir das Thema vor langem schon mal in der Mailingliste (nicht abschließen) diskutiert haben, möchte ich es auch hier im Forum nochmal anstoßen:

GSM/GPRS ist jenseits von WLAN und LoRa immer noch ein Standard, der es schafft Daten von Standorten zu schicken, die von der Infrastruktur eher “vergessen” sind. Daher ist das immer noch ein Übertragungsweg der für die Masse der Imker interessant ist.

Sehr viele Arduino-GSM-shields verwenden die SIM800 Hardware-Version leider häufig in einer 5V-board-Version und nicht unbedingt auf Stromsparen optimiert.

Besser für unsere Zwecke ist das GPRSBee von SODAQ. Dies hat allerdings den etwas unüblichen bee socket als physikalische Schnittstelle und ist mit 35 EUR immer noch teuer.

Deutlich günstiger sind breakouts, wie dieses hier: http://www.ebay.com/itm/1PCS-Smallest-SIM800L-GPRS-GSM-Module-Card-Board-Quad-band-Onboard-Antenna-/172118758210 das schon für um die 5 EUR zu haben ist.

Leider können wir die Module nicht 1:1 an einen Arduino anschließen.

  • die Dinger brauchen viel Strom - peak 2 A wird häufig genannt.
  • wenn sie immer an Strom hängen verbrauchen sie den auch, wir müssen die also zwischendurch abschalten
  • die pins sind nicht 3.3.V tolerant

Gerne würde ich diskutieren wie man die Dinger gut und für längere Zeit an einen 3,3 V-Arduino anschließen kann.

Zum Thema abschalten habe ich vor langem schon mal diesen Thread gestartet:
https://forum.arduino.cc/index.php?topic=383081.0

Mir ist noch nciht klar, welche Pins nun 3,3 V tolerant sind und welche nicht. Was bieten sich hier für einfache und günstige Lösungen an?

A post was split to a new topic: ULPnode

Eine Lösung könnte hier die von SODAQs GPRSBee sein, siehe den Schaltplan des GPRSBees Abschnitt: “Level Converter”: auch die Pin-Belegung ist manchmal hilfreich.

Da schaut es so aus, also ob nur TX und RX nicht tolerant für 3,3 V sind. DTR und CTS werden jedenfalls nicht “converted”. Als Level Converter wird ein 74LVC1G125DCK von TI (das richtige datasheet?) verwendet.

Hilfreich zum Thema Level-Anpassung allgemein ist http://forum.arduino.cc/index.php?action=dlattach;topic=214606.0;attach=67681

Nein - alle pins der Seriellen des Modems (Namen in Knauff’s SIM800H-Symbol im Schaltbild: RXD, TXD, RTS, CTS, UART_DCD , UART_RI, UART_DCD) halten maximal 2,8V aus; siehe Tabelle 9 auf Seite 30 von sim800h_hardware_design_v1.00.pdf :

Hm. Ja, nur - diejenigen des Modems werden aber auch gar nicht verwendet in der GPRSBee v6, also gibt es auch keinen Grund, diese Leitungen auch noch über level shifter zu schicken. Du meinst sicher die namensähnlichen Pins am Bee header U2 (!DTR/IO und !CTS/IO). Oder? ;)

Diese beiden Leitungen brauchen keine Pegelwandlung, weil

  • !DTR/IO den load switch aus T1/Q1 für VBATT sowie mittels T3 PWRKEY schaltet, also muß !DTR/IO lediglich die Basis von zwei BJT treiben, und
  • !CTS/IO hängt am STATUS-Ausgang des Modems, der mit VOHmin=2.7V ohne Hilfe einen 3.3V-Logik-Eingang auf H treiben kann.

Ja, stimmt, ich meinte DTR und CTS am GPRSBee-Modul, war mir nicht ganz bewußt, dass das SIM800-Modul die ähnlich bezeichneten pins hat, die aber beim GPRSBee-Modul anders “generiert” / nicht verwendet werden.

Bin bisher immer von der GPRSBee-Lib ausgegangen, da sind DTR und CTS obligatorisch. DTR schaltet das Modem an (bei der SIM900-Version war es noch ein toggle switch, d.h. wenn es an war schaltete DTR aus, wenn es aus war wurde es mit DTR angeschaltet). Mit CTS wird der an/aus-Status signalisiert. Ich sehe aber gerade auf der beelogger-Seite zum SIM800-Modul, dass die beiden pins nicht zwingend nötig sind. Anscheinend ist mit einer vorhandenen (bzw. geschalteten) Stromversorgung das SIM800 automatisch “on”, d.h. wir könnten auch auf diese beiden pins / Funktionen verzichten, weil wir eine geschaltete Vcc haben/brauchen! Dann wäre allerdings die SODAQ GPRSBee Lib anzupassen, bzw. wir switchen auf die von dir empfohlene lib TinyGSM mit direkter MQTT-Unterstützung.

Bei der Teileliste vom Beelogger GSM-Shield sind übrignes zwei Widerstände angegeben deren Verbauung (noch) nicht dokumentiert ist - ich habe da mal angefragt, ich nehme aber an, dass es ein voltage divider für den RX-Pin des SIM800 ist. Dachte eigentlich dass ein widerstands-basierter Spannungsteiler für so schnelle Schaltvorgänge wie bei einem Modem nicht der Königsweg ist, aber es scheint wohl zu funktionieren.

Auch im Datenblatt zum SIM800-Modul http://simcom.ee/documents/SIM800/SIM800_Hardware%20Design_V1.08.pdf werden auf Seite 30 (auch Seite 30 wie bei deiner Referenz, gerade nur die v1.08 gefunden) als Referenz-Design für den Seriellen Anschluss bei einem 3,3 V MC auch ordinäre voltage divider mit 1k und 5k6 empfohlen. Kann also nicht sooo schlecht sein.

TX level shiften die gar nicht. Warum ist das beim GPRSBee-Modul so “kompliziert” gelöst, oder verträgt das ggf. auch 5V über die Serielle?

Interessanterweise empfiehlt Felix Rusu ein voltage divider für den Anschluss eines RFMxx an einen “richtigen” 5V Arduino (Uno) (3,3 V vs. 5 V) und ich habe das auch so bei meinen Open Hive shields für den Arduino Yun gemacht und die laufen auch ganz gut.

Für mich würde das jetzt bedeuten, dass wir TX direkt anschließen, RX mit einem voltage divider, auf DTR und CTS verzichten können und die Versorgungsspannung direkt vom Lipo über einen Transistor / Mosfet wie beim Beelogger schalten oder eben einen P-channel als direkten high-side switch verwenden, wenn der im Leerlauf nicht zu viel braucht.

Guter Plan, oder passt da was nicht? ;-)

A post was merged into an existing topic: Sim800

Die dort empfohlenen P-channel MOSFETs hatte ich damals nicht bei Segor im Laden bekommen, als Alternative wurde mit der IRLML6401 empfohlen. Not tested yet. ;-)

Ich habe zuerst versucht die Spannung per MOSFET mit einem high side switch zu schalten, analog zu diesem Schaltbild von NIck Gammon

Das Problem ist aber

which means that we have to output 5V (HIGH) from the Arduino to turn the MOSFET off.

Der “angeschaltete” pin braucht nämlich Strom und zwar genau in der Zeit wenn das ganze System eigentlich schlafen soll. Das ist für ein “low power” oder gar “ultra low power” System im sleep mode zu viel - ich habe es gemessen und es war jenseits dessen was der Seeeduino braucht, die Zahl habe ich gerade nicht auf dem Schirm, war schon etwas her.

D.h. wir brauchen doch einen Transistor, der uns das Leben etwas erleichter und auch dazu liefert uns NIck eine Schaltung:

… und wir können hier mit LOW ausschalten:

To turn the MOSFET off, we output a LOW signal from the Arduino, thus Q1 does not conduct, and therefore the 1k resistor (R2) pulls the Gate to 12V.

Ich habe es noch nicht aufgebaut und durchgemessen, hoffe aber das funktioniert so - auch in unserem 3,7/3,3 V-System

…macht Onkel Sodaq auch so! B)

Detail der GPRSBee:

image

1 Like