Problemi con modulo SIM800L

Ciao a tutti.
Ho fatto proprio oggi la SIM per il modulo GSM, però non riesco a farlo andare...
Il modulo in questione, appena acceso, si illumina in modo fisso un led, e comincia a lampeggiare il secondo led, per 8 volte, per poi spegnersi completamente sia il secondo che il primo led, per un secondo, e ricominciare da capo.
Le connessioni sono le seguenti:

RX: 7
TX: 8
GND: gnd Arduino
VCC: 5v Arduino

La scheda che uso è Arduino UNO.
Da notare che ho provato, senza risultati, ad alimentare il modulo anche in modo esterno, con alimentatore stabilizzato da 10A massimi di portata.

Il codice che uso è il seguente:

/*
Sketch: GPRS Connect TCP

Function: This sketch is used to test seeeduino GPRS's send SMS func.to make it work, 
you should insert SIM card to Seeeduino GPRS and replace the phoneNumber,enjoy it!
************************************************************************************
note: the following pins has been used and should not be used for other purposes.
  pin 8   // tx pin
  pin 7   // rx pin
  pin 9   // power key pin
  pin 12  // power status pin
************************************************************************************
created on 2013/12/5, version: 0.1
by lawliet.zou(lawliet.zou@gmail.com)
*/
#include <gprs.h>
#include <SoftwareSerial.h>

GPRS gprs;

void setup() {
  Serial.begin(9600);
  while(!Serial);
  Serial.println("GPRS - Send SMS Test ...");
  gprs.preInit();
  delay(1000);
  while(0 != gprs.init()) {
      delay(1000);
      Serial.print("init error\r\n");
  }  
  Serial.println("Init success, start to send SMS message...");
  gprs.sendSMS("XXXXXXXXXX","hello,world"); //define phone number and text
}

void loop() {
  //nothing to do
}

Alla riga:

gprs.sendSMS("XXXXXXXXXX","hello,world"); //define phone number and text

ovviamente al posto di "XXXXXXXXXX" ho inserito il numero del mio cellulare

Spero di aver dato ogni tipo di informazione, e spero in qualche aiuto.
Grazie

La sim l'ho inserita come indicato sul modulo, ovvero con i contatti verso il basso e l'angolo tagliato che punta verso l'esterno

Difficilmente riesci ad alimentare la scheda GSM/GPRS con Arduino senza avere un "reset" del tutto ...
... normalmente quelle schede richiedono un'alimentazione separata da quella di Arduino dato che, nei momenti di picco, arrivano ad assorbire anche 2A, corrente che Arduno NON è assolutamente in grado di fornire.

Quindi, metti prima di tutto un link alla scheda che hai e poi mostra TUTTI i collegamenti, specialmente quelli relativi all'alimentazione, che hai fatto.

Guglielmo

Dunque, il modulo è questo:

I collegamenti li dico scritti, in quanto sono semplici:

Alimentatore settato a 5 volt dc
Gnd alimentatore con Gnd modulo, in comune con quello di Arduino.
5 volt alimentatore con il 5vin del modulo
TX ed RX rispettivamente ai pin 8 e 7

Quindi i 5V che escono dall'alimentatore li mandi sia ad Arduino che al modulo GSM? O prendi i 5V da Arduino?

Comunque, l'effetto che riporti l'ho visto molte volte anche io ... è solo un problema di alimentazione insufficiente del modulo (conta anche lo spessore dei cavetti ... ti ripeto che, in alcuni momenti, specie quando si collega alla rete, arriva ad assorbire 2A).

Dal datasheet del SIM800L:

4.1. Power Supply
The power supply range of SIM800L is from 3.4V to 4.4V.Recommended voltage is 4.0V.The transmitting burst will cause voltage drop and the power supply must be able to provide sufficient current up to 2A. For the VBAT input, a bypass capacitor (low ESR) such as a 100 μF is strongly recommended.

Guglielmo

gpb01:
Comunque, l'effetto che riporti l'ho visto molte volte anche io ... è solo un problema di alimentazione insufficiente del modulo (conta anche lo spessore dei cavetti ... ti ripeto che, in alcuni momenti, specie quando si collega alla rete, arriva ad assorbire 2A).

Infatti a datasheet parlano di picchi vicini ai 2A in caso di burst transmittion.
Io per curiosità l'avevo attaccato ad un alimentatore stabilizzato da banco e gli facevo fare cicli ad oltranza di riavvi, connessione alla rete e invio messaggi e non mi era mai salito sopra i 150mA di picco di consumo, poi c'è da dire che non so la durata del picco magari l'alimentatore non fa ora ad accorgersi.

Io comunque lo alimento a 4,2V 3A per stare sul sicuro.

Questo link potrebbe esserti utile, anche se non è esattamente la board che usi te ci sono informazioni interessanti ad esempio il significato del lampeggio del Led.

Aggiornamento..
Il modulo Sim800l si connette alla rete con successo, in quanto il led lampeggia in modo lento ogni 3 secondi circa.
Secondo problema: Non invia i messaggi...
Il codice che uso è questo:

/* 
 *  This library was written by Vittorio Esposito
 *    https://github.com/VittorioEsposito
 *
 *  Designed to work with the GSM Sim800L.
 *
 *  ENG
 *    This library uses SoftwareSerial, you can define RX and TX pins
 *    in the header "Sim800L.h", by default pins are RX=10 and TX=11.
 *    Be sure that GND is connected to arduino too. 
 *    You can also change the RESET_PIN as you prefer.
 *  
 *  ESP
 *    Esta libreria usa SoftwareSerial, se pueden cambiar los pines de RX y TX
 *    en el archivo header, "Sim800L.h", por defecto los pines vienen configurado en
 *    RX=10 TX=11.  
 *    Tambien se puede cambiar el RESET_PIN por otro que prefiera
 * 
 *  ITA
 *    Questa libreria utilizza la SoftwareSerial, si possono cambiare i pin di RX e TX
 *    dall' intestazione "Sim800L.h", di default essi sono impostati come RX=10 RX=11
 *    Assicurarsi di aver collegato il dispositivo al pin GND di Arduino.
 *    E' anche possibile cambiare il RESET_PIN.
 *
 *
 *   DEFAULT PINOUT: 
 *        _____________________________
 *       |  ARDUINO UNO >>>   Sim800L  |
 *        -----------------------------
 *            GND      >>>   GND
 *        RX  10       >>>   TX    
 *        TX  11       >>>   RX
 *       RESET 2       >>>   RST 
 *                 
 *   POWER SOURCE 4.2V >>> VCC
 *
 *
 *  SOFTWARE SERIAL NOTES:
 *
 *    PINOUT
 *    The library has the following known limitations:
 *    1. If using multiple software serial ports, only one can receive data at a time.
 *    2. Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
 *    3. Not all pins on the Leonardo and Micro support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
 *    4. On Arduino or Genuino 101 the current maximum RX speed is 57600bps
 *    5. On Arduino or Genuino 101 RX doesn't work on Pin 13
 *  
 *    BAUD RATE
 *    Supported baud rates are 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600, and 115200.
 *
 *
 *  Edited on:  December 24, 2016
 *    Editor:   Vittorio Esposito
 *    
 *  Original version by:   Cristian Steib
 *        
 *
*/

#include <Sim800L.h>
#include <SoftwareSerial.h>               

#define RX  10
#define TX  11

Sim800L GSM(RX, TX);

/*
 * In alternative:
 * Sim800L GSM;                       // Use default pinout
 * Sim800L GSM(RX, TX, RESET);        
 * Sim800L GSM(RX, TX, RESET, LED);
 */

char* text;
char* number;
bool error; 					//to catch the response of sendSms


void setup(){
	GSM.begin(4800); 			
	text="Testing Sms";  		//text for the message. 
	number="2926451386"; 		//change to a valid number.
	error=GSM.sendSms(number,text);
	
	// OR 
	//Sim800L.sendSms("+540111111111","the text go here")

}

void loop(){
	//do nothing
}

Da notare che, dove dice "Or", e poi il comando da usare, io ho provato anche in quel modo, ma non funziona.
Per quanto riguarda l'alimentazione, i 5 Volt vanno al modulo.
Ora ho usato un metodo che funziona, ovvero connettere il modulo ai 5 volt di arduino, ma alimentare Arduino stesso con un alimentatore adatto

Che faccio?

Prova questa libreria.
C'è un esempio che si chiama All functions che potrebbe fare al caso tuo, così vedi anche sul monitor seriale se la comunicazione con il modulo funziona.

Moce993:
Prova questa libreria.
C'è un esempio che si chiama All functions che potrebbe fare al caso tuo, così vedi anche sul monitor seriale se la comunicazione con il modulo funziona.

è un pochino complessa, ha molti comandi...
Il fatto di non avere un esempio di invio SMS mi destabilizza un po'..
Vedrò
Se riesci a darmi una mano o se la conosci già un po', fammi sapere
Grazie

Nell'esempio da me suggerito c'è la parte di invio SMS.
Vero che ci sono molte funzioni, ma sono quasi tutte indipendenti una dall'altra.

Come prima cosa c'è da capire se il modulo comunica correttamente con arduino, quindi hai caricato l'esempio ? il monitor seriale cosa ti fa vedere ?

Moce993:
Nell'esempio da me suggerito c'è la parte di invio SMS.
Vero che ci sono molte funzioni, ma sono quasi tutte indipendenti una dall'altra.

Come prima cosa c'è da capire se il modulo comunica correttamente con arduino, quindi hai caricato l'esempio ? il monitor seriale cosa ti fa vedere ?

Dunque..
Proprio ieri notte, tramite la libreria GSM.h (https://www.arduino.cc/en/Reference/GSM), con l'esempio proposto dalla libreria stessa ("SendSMS"), il modulo invia correttamente il messaggio.
Come potete vedere dal codice, sia numero di telefono, sia messaggio, vengono inseriti al momento tramite monitor seriale.
Il codice è il seguente:

/*
 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++;
      }
    }
  }
}

Questa parte di codice, invece, è esattamente quella che invia il messaggio:

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

Dove "remoteNum" indica il numero di telefono (Privo di prefisso +39), e txtMsg indica il messaggio che verrà poi inviato.

Ho provato a fare un secondo codice, molto banale, utilizzando direttamente queste poche righe di comando, inserendole nel Setup(), e funziona, in questo modo però:

  // send the message
  sms.beginSMS("XXXXXXXXXX");
  sms.print("Test Messaggio");
  sms.endSMS();
  Serial.println("\nCOMPLETE!\n");

Da notare che, ovviamente, al posto di "XXXXXXXXXX" ho inserito il numero di telefono.

Successivamente ho provato a fare così:

char TestoMessaggio[0] = {"Test Parte 2"};
char NumeriValidi[0] = {"XXXXXXXXXX"};

  // send the message
  sms.beginSMS(NumeriValidi[0]);
  sms.print(TestoMessaggio[0]);
  sms.endSMS();
  Serial.println("\nCOMPLETE!\n");

Il codice viene compilato, però non funziona.
Ovviamente le variabili "Char" le ho scritte subito dopo l'inclusione della libreria, mentre nel setup() ho messo le 4 righe responsabili dell'invio, dopo le dovute inizializzazioni.
Come dovrei scrivere le variabili, per evitare di inserire direttamente i numeri e i messaggi nei comandi?

Altra cosa: Il modulo GSM, nel momento in cui riceve un messaggio o una chiamata, salta la connessione. Perchè?

Non mettere lo zero come indice di array quando lo inizializzi

Standardoil:
Non mettere lo zero come indice di array quando lo inizializzi

Quindi scrivo così?

char NumeriValidi[] = {"XXXXXXXXXX"};
char TestoMessaggio[] = {"Test 2"};

Non avevo badato alle graffe
Togli le
E prendi un buon libro di C
Secondo me senza il K&R non si va da nessuna parte...

Standardoil:
Non avevo badato alle graffe
Togli le
E prendi un buon libro di C
Secondo me senza il K&R non si va da nessuna parte...

Ho anche provato senza graffe, ma non va

Hai tolto lo zero anche dove usi la stringa?

Standardoil:
Hai tolto lo zero anche dove usi la stringa?

Si
Ora provo di nuovo così:

char NumeroValido[] = "XXXXXXXXXX";

AGGIORNAMENTO:
Ora funziona perfettamente. Tuttavia, se chiamo o invio un messaggio, salta la connessione. Qualcuno sa il motivo? Grazie

Karma grazie

AleDi2:
AGGIORNAMENTO:
Ora funziona perfettamente. Tuttavia, se chiamo o invio un messaggio, salta la connessione. Qualcuno sa il motivo? Grazie

Ma come lo alimenti alla fine ?

Moce993:
Ma come lo alimenti alla fine ?

Allora, puoi fare in due modi:

Puoi decidere di alimentare il modulo GSM (Sim800l) tramite un alimentatore stabilizzato a 5 volt, e, per andare sul sicuro, 5 Ampere di carico massimo.
Lo colleghi in questo modo:
I 5 Volt che escono dall'alimentatore, li mandi al modulo (pin "5Vin"), mentre il negativo dell'alimentatore lo colleghi sia al modulo (pin "GND", che è accanto al "5Vin"), sia ad un qualsiasi GND di Arduino.

In alternativa, e io faccio così, puoi collegare il modulo Sim800l ad Arduino, tramite i pin 5V e GND, alimentando però Arduino Tramite apposito spinotto (Se parliamo di Arduino UNO o Mega), oppure tramite pin Vin e GND, utilizzando sempre e comunque un alimentatore stabilizzato, da massimo 12 Volt, con un carico massimo di 5 Ampere, per stare sul sicuro.

AleDi2:
In alternativa, e io faccio così, puoi collegare il modulo Sim800l ad Arduino, tramite i pin 5V e GND ...

... e ti ho già detto che NON va bene ... il SIM800 lo devi alimentare DIRETTAMENTE !!!

Guglielmo