Mancanza di comunicazione con modulo SIM800L - [RISOLTO]

Salve a tutti

dopo molti tentativi e vari assetti non sono riuscito a far comunicare il modulo GSM SIM800L EVB con la Mega. Ho letto un post in italiano specifico su questo problema seguendo attentamente le indicazioni ma niente.

Ho provato numerosi esempi ma non funzionano. Vi posto il primo:

void setup() {
  //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  Serial1.begin(9600);

  delay(1000);
   
  Serial.println("Starting...");
}
 
void loop() {
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if(Serial1.available()){
    Serial.write(Serial1.read());
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if(Serial.available()){    
    Serial1.write(Serial.read());
  }
}

Ho collegato il 5V ad arduino ed anche GND.
Ho collegato l’RX del modulo al pin 18 TX, il TX del modulo al pin 19 RX

Non accade nulla quando digito un comando AT.

Stessa cosa con softserial:

#include <SoftwareSerial.h>
 
//SIM800 TX is connected to Arduino D8
#define SIM800_TX_PIN 8
 
//SIM800 RX is connected to Arduino D7
#define SIM800_RX_PIN 7
 
//Create software serial object to communicate with SIM800
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
 
void setup() {
  //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  while(!Serial);
   
  //Being serial communication witj Arduino and SIM800
  serialSIM800.begin(9600);
  delay(1000);
   
  Serial.println("Setup Complete!");
}
 
void loop() {
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if(serialSIM800.available()){
    Serial.write(serialSIM800.read());
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if(Serial.available()){    
    serialSIM800.write(Serial.read());
  }
}

In questo caso il TX del modulo l’ho collegato come richiesto al PIN 8 e RX al 7.

anche in questo caso nulla. Ho provato altri esempi che inviano SMS presi da questo link

ed alimentato tutto dall’esterno con alimentatore 5V (positivo sul pin 5V di arduino) ma nulla. Il modulo se chiamato con un cellulare risponde (squilla…).

Poi ho provato questo:

#include "SIM900.h"
#include <SoftwareSerial.h>
//If not used, is better to exclude the HTTP library,
//for RAM saving.
//If your sketch reboots itself proprably you have finished,
//your memory available.
//#include "inetGSM.h"

//If you want to use the Arduino functions to manage SMS, uncomment the lines below.
#include "sms.h"
SMSGSM sms;

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to send and receive SMS.

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

void setup()
{
     //Serial connection.
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          //Enable this two lines if you want to send an SMS.
          if (sms.SendSMS("349XXX15X4", "Arduino SMS"))
          Serial.println("\nSMS sent OK");
     }

};

void loop()
{
     if(started) {
          //Read if there are messages on SIM card and print them.
        /**  deprecated method
        if(gsm.readSMS(smsbuffer, 160, n, 20)) {
               Serial.println(n);
               Serial.println(smsbuffer);
          }
          **/
          //get 1st sms
          sms.GetSMS(1,n,20,smsbuffer,160);
          Serial.println(n);
          Serial.println(smsbuffer);
          
          delay(1000);
     }
};

con i pin 18, 19 ed alimentato da esterno come prima… e niente

Io francamente con le mie conoscenze mi fermo… non riesco ad andare oltre. Dove sbaglio? Oppure il modulo ha un problema…

RISOLTO: Il modulo era rotto, non funzionava. Il nuovo funziona con tutti gli sketch!

Allora

ho ri iniziato tutto nuovamente,

ho utilizzato questo sketch:

#include <SoftwareSerial.h>
 
//SIM800 TX is connected to Arduino D8
#define SIM800_TX_PIN 8
 
//SIM800 RX is connected to Arduino D7
#define SIM800_RX_PIN 7
 
//Create software serial object to communicate with SIM800
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
 
void setup() {
  //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  while(!Serial);
   
  //Being serial communication witj Arduino and SIM800
  serialSIM800.begin(9600);
  delay(1000);
   
  Serial.println("Setup Complete!");
}
 
void loop() {
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if(serialSIM800.available()){
    Serial.write(serialSIM800.read());
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if(Serial.available()){    
    serialSIM800.write(Serial.read());
  }
}

ho collegato il TX del modulo al pin 8 e l’RX al pin 7.

Ho alimentato con una alimentatore step down a 5V il modulo., ho messo la massa dell’alimentatore a GND di arduino. Ho messo la seconda GND del modulo al GND di arduino.

e niente… qualunque comando AT non viene ricevuto

Non so che fare, l’unico altro dubbio e se occorre utilizzare una tensione diversa per TX e RX anche se il modulo SIM800L EVB è chiaramente detto che funziona direttamente a 5V…

Io mi arrendo. Ho bisogno di consigli

Prova con una interfaccia USB-232TTL se ce l’ hai, collegata al modulo.
Altrimenti collega i piedini RX e TX dell’ Arduino direttamente al modulo, senza caricare nessuno sketch. Poi verifichi con il SerialMonitor, con il baud rate del modulo.

Ciao

grazie per la risposta, purtroppo non ho una interfaccia usb 232. Posso fare la prova che mi ha suggerito pero...

se ho capito bene dovrei collegare RX e TX del modulo ai piedini del MEGA in posizione 0 e 1? E cosa dovrei fare nel serial monitor? Inviare comanti AT?

Intanto ho fatto una seconda prova, sempre usando lo sketch sopra ho collegato arduino nano invece del mega con il seguente schema:

e niente... non funziona proprio!

Ho appena provato ma non sono sicuro di aver fatto quello che mi suggerivi:

ho caricato uno sketch vuoto, ho collegato RX al piedino TX del nano, e lo stesso per TX del modulo al RX del nano. Ho aperto il serial monitor ed ho provato ad inviare comandi AT....

niente...

Ma potevi alimentare il Nano con L'USB. Poi non serve neanche caricare uno sketch, salvo cancellarne uno precedente.

A parte gli altri ammennicoli che caricherebbero il circuito, a te basta collegare l' USB per fare le prove.

folagana:
Allora
ho ri iniziato tutto nuovamente …

… Io mi arrendo. Ho bisogno di consigli

Il consiglio è studiati la SoftwareSerial perché … i pin che hai usato, sulla Mega, NON funzionano !!!

Se vuoi fare un rapido test di colloquio seriale, usa queto programma ampiamente collaudato :

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

Devi collegare :

TX modulo GSM —> pin 10 Arduino (SoftwareSerial RX)
RX modulo GSM <— pin 11 Arduino (SoftwareSerial TX)
GND modulo GSM <-> GND Arduino
+5V modulo GSM <-> +5 Arduino

Attenzione … in realtà occorrerebbe un alimentatore dedicato al modulo GPS perché quei moduli, durante il lavoro, arrivano ad assorbire anche più di 1 A !!!

Tutto quello che scrivi nel monitor seriale viene trasmesso al modulo GPS, tutto quello che il modulo trasmette viene visualizzato nel monitor serial.

Guglielmo

Grazie per le risposte. Ho già provato con i pin 10 e 11. Ho alimentato il modulo con un alimentatore separato perché altrimenti si riavvia perché assorbe troppo come Guglielmo giustamente sottolinea.

Ho messo i due GND del modulo e di arduino in comunicazione ed alimentato la mega con USB.

E purtroppo niente. Non funziona la comunicazione.

ExperimentUno:
A parte gli altri ammennicoli che caricherebbero il circuito, a te basta collegare l' USB per fare le prove.

Ahimé è quello che ho fatto. Niente.

Contatto il venditore e gli comunico che non funziona. Non ho altro da fare, non riceve e non invia nessuna comunicazione via serial, che sia software o hardware.....

Ho fatto l'ultima prova ed ho ottenuto un risultato strano!

Utilizzando il codice:

void setup() {
  //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  while(!Serial);
   
  //Being serial communication witj Arduino and SIM800
  Serial1.begin(9600);
  delay(1000);
   
  Serial.println("Setup Complete!");

}
 
void loop() {
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if(Serial1.available()){
    Serial.write(Serial1.read());
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if(Serial.available()){    
    Serial1.write(Serial.read());
  }
}

Il monitor serial mi restituisce ogni messaggio che scrivo solo se elimino la connessione a GND tra arduino e il modulo.

Quindi alimentando il modulo da solo con un alimentatore a 2A stepdown a 5V ed utilizzando solo le porte serial hardware, in effetti quello che scrivo lui mi ritorna....

Con la comunicazione seriale software nulla, utilizzando qualunque pin e con e senza GND collegati. Solo che scollegando il GND (la connessione tra il modulo ed arduino) il monitor seriale restituisce caratteri a casaccio....

L'altra cosa che non capisco è perchè digitando AT lui non restituisca OK.... comunque ci studio ma se avete qualche suggerimento

La precedente prova l'ho fatto con TX modulo > RX1 e RX modulo > TX1

adesso ho fatto un passo avanti.....

Ho inverito i segnali.... TX modulo > TX1 e RX modulo > RX1....

e magia ottengo lo stesso risultato

poi ho detto... mah... adesso stacco i connettori dal modulo e metto in comunicazione TX1 e RX1...... ed ottengo lo stesso risultato....

devo pensare che c'è qualcosa che non va?

SI, che DEVI fare come ti ho detto al post #6, il resto sono solo chiacchiere ed errori !

SE i collegamenti sono ben fatti e stabili, in quel modo DEVE funzionare, senza se e senza ma ...
... altrimenti è guasto (... ma non ci credo).

Guglielmo

... a, metti un link al prodotto esatto che stai usando, perché di board basate sul SIM800L ce ne sonio un'infinità e senza sapere quella esattamente usata da te è difficle capire anche altro.

Guglielmo

... e ancora, leggiti BENE QUESTO vecchio thread che parla dello stesso problema e della soluzione.

Guglielmo

In effetti è il primo post che ho letto ed ho comprato lo stesso modulo SIM800L EVB (mi pare di averlo indicato nel mio primo post). Ho eseguito esattamente tutte le indicazioni, collegato il 5V ad un alimentatore esterno, il GND vicino al 5V al GND dell’alimentatore ed il GND del modulo vicino ai pin TX e RX con il GND di arduino perché qui è chiaramente indicato che il GND vicino ai pin ha proprio questa funzione.

Ho caricato l’esempio per i comandi AT

#include "SIM900.h"
#include <SoftwareSerial.h>
//#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to communicate with SIM900 through AT commands.

//InetGSM inet;
//CallGSM call;
//SMSGSM sms;

int numdata;
char inSerial[40];
int i=0;


void setup()
{
     //Serial connection.
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(9600))
          Serial.println("\nstatus=READY");
     else Serial.println("\nstatus=IDLE");
};

void loop()
{
     //Read for new byte on serial hardware,
     //and write them on NewSoftSerial.
     serialhwread();
     //Read for new byte on NewSoftSerial.
     serialswread();
};

void serialhwread()
{
     i=0;
     if (Serial.available() > 0) {
          while (Serial.available() > 0) {
               inSerial[i]=(Serial.read());
               delay(10);
               i++;
          }

          inSerial[i]='\0';
          if(!strcmp(inSerial,"/END")) {
               Serial.println("_");
               inSerial[0]=0x1a;
               inSerial[1]='\0';
               gsm.SimpleWriteln(inSerial);
          }
          //Send a saved AT command using serial port.
          if(!strcmp(inSerial,"TEST")) {
               Serial.println("SIGNAL QUALITY");
               gsm.SimpleWriteln("AT+CSQ");
          } else {
               Serial.println(inSerial);
               gsm.SimpleWriteln(inSerial);
          }
          inSerial[0]='\0';
     }
}

void serialswread()
{
     gsm.SimpleRead();
}

ed ho ottenuto questo:

GSM Shield testing.
DB:NO RESP
DB:NO RESP
DB:NO RESP
Trying to force the baud-rate to 9600

1200
2400
4800
9600
19200
38400
57600
115200
ERROR: SIM900 doesn’t answer. Check power and serial pins in GSM.cpp

status=IDLE
AT

AT

AT

fdfdf

Questi li ho scritti io!

Dopo lil messaggio di IDEL

Quindi francamente a me pare che il modulo abbia qualche problema…e non so più dove sbattere la testa!

Dimenticavo che la compilazione ha dato il seguente messaggio:

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\HWSerial.cpp: In member function 'size_t HWSerial::print(const __FlashStringHelper*)':

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\HWSerial.cpp:63:26: warning: 'progmem' attribute ignored [-Wattributes]

const char PROGMEM *p = (const char PROGMEM *)ifsh;

^

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:194:50: warning: character constant too long for its type

p_char = strchr((char *)(gsm.comm_buf),'+CMGL');

^

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp: In member function 'boolean SIMCOM900::readCall(char*, int)':

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:269:52: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

_cell.getString("", """, number, nlength);

^

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:269:52: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp: In member function 'int SIMCOM900::getCCI(char*)':

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:353:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

_cell.getString("AT+QCCID\r\r\r\n","\r\n",cci, 21);

^

D:\Documenti\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:353:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Lo sketch usa 7.390 byte (2%) dello spazio disponibile per i programmi. Il massimo è 253.952 byte.
Le variabili globali usano 795 byte (9%) di memoria dinamica, lasciando altri 7.397 byte liberi per le variabili locali. Il massimo è 8.192 byte.

... ribadisco ... al post #6 ti ho dato un programma per provare ad inviare A MANO i comandi AT (ricorda di mettere il monitor seriale in modo che invii il CR/LF alla fine) e con quello DEVE funzionare quindi, di tutto il resto NON mi interessa nulla, prima di tutto voglio vedere che ad "AT" il modulo risponde "OK".

Prova, in quel codice, a cambiare il baud rate della SoftwareSerial ... di base dovrebbe essere 9600, ma ... visto mai che te ne hanno dato uno programmato a 19200 o 38400 ... ::slight_smile:

Guglielmo

Guglielmo

credimi ho usato sketch che mi avevi suggerito ma a 9600, senza risultati e l'ho rifatto adesso provando tutte le velocità.... da 300 a 250000 dando il comando AT nel monitor serial (avendo selezionato NL & CR) non succede nulla.

Adesso ho smontato tutto e ho guardato il modulo e mi pare di vedere una piccola "ammaccatura" sul chip o meglio sulla cover metallica dove c'è l'adesivo... non so se
è importante. Ad ogni modo lo restituisco e poi rifaccio le prove con quello nuovo.

Questo è il primo intoppo con arduino, fino ad adesso sfruttando le info sul forum e su vari networks ho fatto un pò di cose ...

Più tardi post le foto dei collegamenti giusto per fugare ogni dubbio

Risolto

Il modulo nuovo funziona perfettamente con tutti gli sketch.

Grazie a tutti comunque per il contributo....... spero di farvi poche domande in futuro!

Vorrei condividere la mia esperienza con questo modulo.

Il primo è arrivato rotto, dopo mille esperimenti non ha mai risposto ad alcun comando AT.

Il secondo a primo colpo ha risposto .........

In questi giorni, sono ritornato a lavorare su parte del mio progetto che prevede l'utilizzo di questo modulo a 5V. Ecco cosa ho scoperto: semplicemente non si connette in alcun moto alla rete GSM (mentre il primo lo faceva). Adesso non voglio fare il pessimista ma suggerisco vivamente di evitare questo tipo di modulo SIM800L EVB e di utilizzarne altri magari più semplici.

Io adesso ho un semplice SIM800L come questo e non perde un colpo. Certo va alimentato a 3.8-4.0 e bisogna portare la connessione TX/RX a 3.3V ma è almeno affidabile. Ormai lo sto testando da un mese.

Magari aiuterà altri ad evitare di sbatterci la testa con queste cineserie.....