GSM-Modul zum Laufen kriegen

Hallo liebes Forum,

wieder mal ich mit einem neuen Problem... diesmal ein GSM-Modul (M95 Quectel) betreffend.

Ich versuche zurzeit, lediglich eine SMS an mein privates Gerät über den Arduino zu verschicken. Dafür bediene ich mit beim Code an einem Beispiel, das mit der IDE selbst kommt:

/*
 SMS sender

 This sketch, for the Arduino GSM shield,sends an SMS message
 you enter in the serial monitor. Connect your Arduino with the
 GSM shield and SIM card, open the serial monitor, and wait for
 the "READY" message to appear in the monitor. Next, type a
 message to send and press "return". Make sure the serial
 monitor is set to send a newline when you press return.

 Circuit:
 * GSM shield
 * SIM card that can send SMS

 created 25 Feb 2012
 by Tom Igoe

 This example is in the public domain.

 http://www.arduino.cc/en/Tutorial/GSMExamplesSendSMS

 */

// Include the GSM library
#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("SMS Messages Sender");

  // connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
}

void loop() {

  Serial.print("Enter a mobile number: ");
  char remoteNum[20];  // telephone number to send sms
  readSerial(remoteNum);
  Serial.println(remoteNum);

  // sms text
  Serial.print("Now, enter SMS content: ");
  char txtMsg[200];
  readSerial(txtMsg);
  Serial.println("SENDING");
  Serial.println();
  Serial.println("Message:");
  Serial.println(txtMsg);

  // send the message
  sms.beginSMS(remoteNum);
  sms.print(txtMsg);
  sms.endSMS();
  Serial.println("\nCOMPLETE!\n");
}

/*
  Read input serial
 */
int readSerial(char result[]) {
  int i = 0;
  while (1) {
    while (Serial.available() > 0) {
      char inChar = Serial.read();
      if (inChar == '\n') {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }
      if (inChar != '\r') {
        result[i] = inChar;
        i++;
      }
    }
  }
}

Laut Code sollte im Serial Monitor eine Abfrage erfolgen. Bei mir erscheint jedoch nur "SMS Messages Sender", also der erste Teil aus der Loop.

Die rote Signal-LED am GSM-Modul blinkt in Abständen von je zwei Sekunden, was lautdieses PDFs bedeutet, dass ich eine Verbindung mit dem Netzwerk hergestellt habe, jedoch kein Datentransfer stattfindet.

Ich weiß nicht, wie ich das Modul funktionsfähig mache bzw. ob es das schon ist und wie ich das prüfen kann. Ich hoffe, ihr könnt mir hierbei weiterhelfen, denn aus den ganzen anderen Beiträgen in englischer Sprache oder diversen YouTube-Videos bin ich nicht schlau geworden...

Viele Grüße

jpfor3:
Laut Code sollte im Serial Monitor eine Abfrage erfolgen. Bei mir erscheint jedoch nur "SMS Messages Sender", also der erste Teil aus der Loop.

"SMS Messages Sender" wird im Setup ausgegeben, hast Du den nachfolgenden Teil beachtet bzgl der PIN der Sim Karte bzw die PIN deaktiviert?
Sieht jedenfalls danach aus, als wenn der Sketch da hängt, da ja das nachfolgende "GSM initialized" nicht mehr ausgegeben wird.

Moko:
"SMS Messages Sender" wird im Setup ausgegeben, hast Du den nachfolgenden Teil beachtet bzgl der PIN der Sim Karte bzw die PIN deaktiviert?
Sieht jedenfalls danach aus, als wenn der Sketch da hängt, da ja das nachfolgende "GSM initialized" nicht mehr ausgegeben wird.

Genau, aus irgendeinem Grund wird nicht initialisiert. Ich habe das mit der PIN auch beachtet und ebenfalls schon versucht, die PIN in ein Smartphone einzustecken, die PIN zu deaktivieren und so wieder am Arduino zu nutzen. Leider bisher ohne Erfolg.

Wenn ich im Übrigen das Codebeispiel zum Testen des Moduls selbst nutze (was in der Theorie auch ohne SIM-Karte funktionieren soll, was ich sowohl mit SIM als auch ohne getestet habe), kriege ich auch folgenden Output raus:

14:05:39.098 -> Starting modem test...ERROR, no modem answer.
14:05:54.152 -> Checking IMEI...Modem's IMEI: 0
14:05:56.141 -> Resetting modem...Modem is functoning properly

Das ist der Code des Sketchs:

/*

 This example tests to see if the modem of the
 GSM shield is working correctly. You do not need
 a SIM card for this example.

 Circuit:
 * GSM shield attached

 Created 12 Jun 2012
 by David del Peral
 modified 21 Nov 2012
 by Tom Igoe

 http://www.arduino.cc/en/Tutorial/GSMToolsTestModem

 This sample code is part of the public domain

 */

// libraries
#include <GSM.h>

// modem verification object
GSMModem modem;

// IMEI variable
String IMEI = "";

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start modem test (reset and check response)
  Serial.print("Starting modem test...");
  if (modem.begin()) {
    Serial.println("modem.begin() succeeded");
  } else {
    Serial.println("ERROR, no modem answer.");
  }
}

void loop() {
  // get modem IMEI
  Serial.print("Checking IMEI...");
  IMEI = modem.getIMEI();

  // check IMEI response
  if (IMEI != NULL) {
    // show IMEI in serial monitor
    Serial.println("Modem's IMEI: " + IMEI);
    // reset modem to check booting:
    Serial.print("Resetting modem...");
    modem.begin();
    // get and check IMEI one more time
    if (modem.getIMEI() != NULL) {
      Serial.println("Modem is functoning properly");
    } else {
      Serial.println("Error: getIMEI() failed after modem.begin()");
    }
  } else {
    Serial.println("Error: Could not get IMEI");
  }
  // do nothing:
  while (true);
}

Hast du weiterhin für die Datenübertragung an das GSM die Pins D0 und D1 verwendet ?

Wenn ja, dann ist das dein Problem.
Du musst die Pins ändern und mit SoftwareSerial arbeiten.

D0 und D1 werden auch vom USB-Wandler auf dem Uno verwendet und das gibt Probleme.

HotSystems:
Hast du weiterhin für die Datenübertragung an das GSM die Pins D0 und D1 verwendet ?

Wenn ja, dann ist das dein Problem.
Du musst die Pins ändern und mit SoftwareSerial arbeiten.

D0 und D1 werden auch vom USB-Wandler auf dem Uno verwendet und das gibt Probleme.

Die Standardeinstellungen für das Modul sehen so aus:

PIN1: D0_RX (Arduino ---> M95 GSM Shield) default
PIN2: D1_TX (M95 GSM Shield ---> Arduino) default

Muss ich im Code dann die Pins umstellen? Und falls ja, wie genau müsste ich das bewerkstelligen?

Danke für deine Antwort!

jpfor3:
Die Standardeinstellungen für das Modul sehen so aus:

PIN1: D0_RX (Arduino ---> M95 GSM Shield) default
PIN2: D1_TX (M95 GSM Shield ---> Arduino) default

Muss ich im Code dann die Pins umstellen? Und falls ja, wie genau müsste ich das bewerkstelligen?

Danke für deine Antwort!

Wie schon geschrieben, diese Pins werden vom USB-Wandlerchip genutzt und können nicht paralell von anderen Geräten verwendet werden.

Du musst dein Sketch dahin umschreiben, dass du für die Kommunikation mit dem GSM SoftwareSerial verwendest und andere Pins (dazu nach Doku umlöten) dafür verwendest.
Diese müssen dann in der Definition von SoftwareSerial angepasst werden.
Die Beschreibung dazu findest du in den Beispielen zur Library.

HotSystems:
Wie schon geschrieben, diese Pins werden vom USB-Wandlerchip genutzt und können nicht paralell von anderen Geräten verwendet werden.

Du musst dein Sketch dahin umschreiben, dass du für die Kommunikation mit dem GSM SoftwareSerial verwendest und andere Pins (dazu nach Doku umlöten) dafür verwendest.
Diese müssen dann in der Definition von SoftwareSerial angepasst werden.
Die Beschreibung dazu findest du in den Beispielen zur Library.

Ich danke dir vielmals!

jpfor3:
Ich danke dir vielmals!

Aber gern doch.

Ich komme leider nicht weiter :frowning:

Die Pins habe ich so umgesteckt, dass die virtuellen RX und TX (jeweils 10 und 11) auf die TX und RX Ports des GSM-Moduls geleitet, weiß aber nicht inwiefern ich in dem Code an welcher Stelle was ansprechen muss.

Ich bin auch schon seit Stunden dabei, Libraries für das Quectel M95 zu suchen, finde aber auch nichts was weiterhilft :(.

jpfor3:
Ich komme leider nicht weiter :frowning:

Die Pins habe ich so umgesteckt, dass die virtuellen RX und TX (jeweils 10 und 11) auf die TX und RX Ports des GSM-Moduls geleitet, weiß aber nicht inwiefern ich in dem Code an welcher Stelle was ansprechen muss.

Ich bin auch schon seit Stunden dabei, Libraries für das Quectel M95 zu suchen, finde aber auch nichts was weiterhilft :(.

Eine Library dafür ist mir nicht bekannt und wird dir sicher auch kaum helfen, da sie auch nur über seriell kommunizieren.

Hast du denn deinen Sketch mit SoftwareSerial erweitert ?

HotSystems:
Eine Library dafür ist mir nicht bekannt und wird dir sicher auch kaum helfen, da sie auch nur über seriell kommunizieren.

Hast du denn deinen Sketch mit SoftwareSerial erweitert ?

Ich habe es leider erfolglos versucht zu erweitern. Da sind dann auch Dinge wie die baud-Rate, mit der ich nichts anfangen kann und auch keine Spezifikation des Moduls, die mir dies ermöglicht :frowning:

Was ich gemacht habe ist, die Pins 10 für RX und 11 für TX vom Arduino als SoftwareSerial zu definieren und die Verkabelung zum GSM-Modul in die Pins 1 und 0 gesteckt.

jpfor3:
Ich habe es leider erfolglos versucht zu erweitern. Da sind dann auch Dinge wie die baud-Rate, mit der ich nichts anfangen kann und auch keine Spezifikation des Moduls, die mir dies ermöglicht :frowning:

Was ich gemacht habe ist, die Pins 10 für RX und 11 für TX vom Arduino als SoftwareSerial zu definieren und die Verkabelung zum GSM-Modul in die Pins 1 und 0 gesteckt.

Und warum machst du es nicht entsprechend der Beschreibung ?
Da wird Pin D2 und D3 verwendet. Umlöten auf der Platine nicht vergessen !

Welche Betriebsspannung hast du wo angeschlossen ?

HotSystems:
Und warum machst du es nicht entsprechend der Beschreibung ?
Da wird Pin D2 und D3 verwendet. Umlöten auf der Platine nicht vergessen !

Welche Betriebsspannung hast du wo angeschlossen ?

Also auf dem Modul die Pins unten abschneiden und dann oben von 0 auf 2 und von 1 auf 3 umlöten? Sorry, falls ich das missverstehe

Lies dir doch einfach mal die PDF-Beschreibung durch, die du hier selbst verlinkt hast.

Sorry, aber da ich das Modul selbst nicht habe, kann ich nur empfehlen, was ich gelesen habe und das solltest du auch lesen.
Wenn man sich solch einem komplexen Thema annimmt, muss man sich auch in die Materie einlesen.
Ohne das wird das nichts. Grundlagen lernen gehört dazu.

HotSystems:
Lies dir doch einfach mal die PDF-Beschreibung durch, die du hier selbst verlinkt hast.

Sorry, aber da ich das Modul selbst nicht habe, kann ich nur empfehlen, was ich gelesen habe und das solltest du auch lesen.
Wenn man sich solch einem komplexen Thema annimmt, muss man sich auch in die Materie einlesen.
Ohne das wird das nichts. Grundlagen lernen gehört dazu.

Dem kann ich nicht widersprechen. Habe mich jetzt den Tag mal zu der Thematik etwas näher eingelesen und glaube zu verstehen, wie es funktionieren möchte. Habe jetzt verschiedene Code Snippets auch mal ausprobiert und das GSM-Modul versucht, über die Pins 2 und 3 mit SoftwareSerial im Monitor anzeigen zu lassen. Müsste dann ja auch auf Befehle wie "AT" antworten. Leider kriege ich keine Antwort zurück......

Die Baud Rate müsste 115200 sein, aber egal wie ich was rumprobiere, es funktioniert nicht.
Da der Pin 2 für SW RX und 3 für SW TX auf dem GSM-Modul sind, habe ich dementsprechend die Pins des Arduinos im SoftwareSerial auch angepasst

Mein aktueller Code sieht so aus, natürlich mit geänderter Handynummer:

#include <SoftwareSerial.h>   
#define rxPin 3  
#define txPin 2  
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);  
char text[150];   
String message="";
int i;   

void setup(){ 


pinMode(10,OUTPUT); 
pinMode(10, HIGH); // GSMON muss auf HIGH sein damit das M95 kommunizieren kann laut Spezifikationen

// Serial und SoftwareSerial starten
Serial.begin(9600);  
while (!Serial){}  
mySerial.begin(115200); 

Serial.println("Write your SMS:");  
}  

void loop(){   

i=0;   
while( Serial.available()>0 ){     
 text[i] = Serial.read();   
 message += text[i];   
 i++;   
 if (text[i-1]==46){  
  Serial.println("Send SMS......");  
  SendTextMessage();  
  ShowSerialData();  
  delay(1000);   
  Serial.println("\r"); 
  Serial.println("Success");   
  message="";  
  i=0;  }}}  


void SendTextMessage(){ 
  
mySerial.print("AT+CMGF=1\r"); 
delay(1000);  
mySerial.print("AT+CMGS=\"+4900000000000\"\r");  
delay(1000);  
mySerial.println(message);  
mySerial.print("\r");  
delay(1000);  
mySerial.println((char)26);  
mySerial.println();  }  


void ShowSerialData(){  

while(mySerial.available()!=0)  
 Serial.write(mySerial.read());}

Für die Verbindung mit SoftwareSerial solltest du mal eine kleinere Baud-Zahl nehmen.
Höher als 19200 würde ich da nicht gehen, da SoftwareSerial dafür nicht spezifiziert ist.
Das würde ich auch mit einem einfachen Testsketch testen.

HotSystems:
Für die Verbindung mit SoftwareSerial solltest du mal eine kleinere Baud-Zahl nehmen.
Höher als 19200 würde ich da nicht gehen, da SoftwareSerial dafür nicht spezifiziert ist.
Das würde ich auch mit einem einfachen Testsketch testen.

Danke dir schonmal! Ich bin jetzt bei 9600 geblieben, aber selbst so will es leider nicht funktionieren :frowning:
Ich habe es auch mit einem Testsketch versucht, den jemand bei Stackoverflow gepostet hat (ebenfalls mit Arduino Uno und dem Quectel M95). Derjenige hatte dieselben Probleme (gsm - Arduino + GPRS m95 not responding - Stack Overflow)

Mein Sketch:

#include <SoftwareSerial.h>

#define rxPin 3
#define txPin 2

SoftwareSerial mySerial(rxPin,txPin); // RX, TX

void setup(){

 pinMode(10, HIGH);
 
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);

 Serial.begin(9600);
 Serial.println("Arduino serial initialized!");
 delay(10);

 mySerial.begin(9600);
 Serial.println("Software serial initialized!");
 delay(10);
}

void loop(){
 issueCommand("AT");
 readSerial();
 delay(3*1000);

 while(true){
   readSerial();
 }
}

void issueCommand(char* msg){
 mySerial.println(msg);
 Serial.print(msg);
 delay(10);
}

void readSerial(){
 while (mySerial.available()){
   Serial.write(mySerial.read());
   delay(10);
 }
}

Auf das gesendete "AT" kriege ich leider auch keine Antwort, der Kollege aus dem Link immerhin Rechtecke

Hi

Mit welcher Geschwindigkeit lauscht denn das GSM-Modul am anderen Ende?
Bringt ja Nichts, wenn Du laaaaangsaaaamer schwätzt, als das GSM-Modul erwartet.

MfG

postmaster-ino:
Hi

Mit welcher Geschwindigkeit lauscht denn das GSM-Modul am anderen Ende?
Bringt ja Nichts, wenn Du laaaaangsaaaamer schwätzt, als das GSM-Modul erwartet.

MfG

Eigentlich ist die Rate laut Handbuch adaptiv, aber nativ bei 115200. Damit funktioniert es wie gesagt ja aber auch nicht :frowning: