Problemi con Modulo SIM900 GSM

Ciao a tutti,

mi aggangio a questo post (RISOLTO: Modulo SIM900 GSM (ICSH029A ) non comunica .... uff!!! - Hardware - Arduino Forum) in quanto anch'io sto riscontrando lo stesso problema, ossia la comunicazione tra lo shield e arduino.

vado a dettagliare il problema:

Alimento lo shield con 5V 2A

-Arduino 2009.

-GSM library con esempio di sketch "Receive Voice Call"

LA sim si collega in rete e nel caso venga chiamata risponde libero. Purtroppo non riesco a stabile la connessione tra le due schede. Ho modificato i pin, utilizzando sia il controllo tramite pin software che tramite pin hardware.

Detto ciò avete suggirimenti?

Buonasera,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ...

... poi, evita di appendere i tuo post a thread esistenti, ma apri un thread per i TUOI problemi, facendo eventualmente riferimento (con un link) a post simili :wink:

Grazie,

Guglielmo

P.S.: Ho separato io il tuo post dal thread dove lo avevi messo.

Buongiorno a tutti,

come da oggetto, il problema che sto riscontrando è nella comunicazione tra il mio SIM900 (della SIMCOM) e Arduino 2009.

Da precedente post, sto utilizzando:

-Arduino 2009;

Mentre dall’immigine allegata, ho collegato i PIN di ricezione e trasmissione sulla porta 0 e 1 di arduino per la comunicazione Seriale in modalità software (ho provato anche in modalità hardware, impostando le porte di trasmissione sui pin 7-8, ma il risultato non cambia).

Ho usato la libreria GSM, presente all’interno della sezione “Manages” e il codice utilizzato è quello di esempio “Receive Voice Call”, che di seguito riporto:

#include <GSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;
GSMVoiceCall vcs;

// Array to hold the number for the incoming call
char numtel[20];

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
  }

  Serial.println("Receive Voice Call");

  // 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);
    }
  }

  // This makes sure the modem correctly reports incoming events
  vcs.hangCall();

  Serial.println("Waiting for a call");
}

void loop()
{
  // Check the status of the voice call
  switch (vcs.getvoiceCallStatus())
  {
    case IDLE_CALL: // Nothing is happening

      break;

    case RECEIVINGCALL: // Yes! Someone is calling us

      Serial.println("RECEIVING CALL");

      // Retrieve the calling number
      vcs.retrieveCallingNumber(numtel, 20);

      // Print the calling number
      Serial.print("Number:");
      Serial.println(numtel);

      // Answer the call, establish the call
      vcs.answerCall();
      break;

    case TALKING:  // In this case the call would be established

      Serial.println("TALKING. Press enter to hang up.");
      while (Serial.read() != '\n')
        delay(100);
      vcs.hangCall();
      Serial.println("Hanging up and waiting for the next call.");
      break;
  }
  delay(1000);
}

All’interno del monitor, Arduino si ferma al print della scritta : “Receive Voice Call”, non restituendo nessun’altro dettaglio.

Durante i Test, la sim risulta essere funzionante. Il led Netlight lampeggia con intervalli di circa 3 secondi e nel caso riceva la chiamata, il led status si spegne restituendo lo squillo (interrompendosi al 4 squillo con l’inserimento della segreteria).

Ho verificato tramite questo LINK le varie impostazioni (come suggerite in un vecchio post), ma anche impostando le configurazioni indicate, non riesco a far comunicare le due schede.

Lo scopo del mio progetto è quello di integrare all’arrivo di una chiamata, l’esecuzione di un comando come può essere lo stimolo di un relè. Sicurmante per la mia poca esperienza mi sta sfuggendo qualcosa, ma non sto capendo dove sto sbagliando.

N.B. In conclusione ringrazio il sig. Guglielmo per la spiegazione e spero di aver eseguito alla lettera i suoi consigli.

Dunque … hai un vecchio Arduino 2009 ? Quale … quello con ATmega168 o con ATmega328 ?

In entrambi i casi ti sconsiglio l’uso dei pin 0 ed 1 dato che sono quelli della vera seriale collegati al FT232 (convertitore seriale <–> USB della FTDI) che potresti usare con il “monitor seriale” per fare il debug.

Meglio usare la SoftwareSerial usando altri due pin che il modulo ti fa selezionare …

Ovviamente i pin devono essere incrociati:

TX modulo GSM —> RX SoftwareSerial
RX modulo GSM <— TX SoftwareSerial

Fatto questo dovresti poter parlare con il modulo …
… io per provare NON userei quel tuo programma, ma farei un semplice programmino che scrive sulla seriale del modulo il comando “AT” e vedi se il modulo risponde “OK”

Una volta che sei sicuro che il modulo almeno risponde … puoi cominciare a giocarci …

Guglielmo

Buona sera,

le confermo che il mio Arduino è con ATmega328, inoltre ho configurato le comunicazioni secondo i suoi suggerimenti, ma all’interno del monitor ricevo il seguente messaggio:

Goodnight moon!
bZkPkkcúb7ÿb7ÿb7ÿÂT¶ã
Goodnight moon!
bZkPkkcúb7ÿb7ÿb7ÿÂT¶ã

Dove “b7ÿ” corrisponde agli squilli, mentre “ÂT¶ã” è il relativo HUNGUP.

Il codice utilizzato è quello di default della libreria SoftwareSerial al quale ho modificato le porte su arduino, come diseguito illustrato:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(5, 6); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("Goodnight moon!");
  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Saluti.

Sicuro che il modulo parli a 4800 baud ? ... provato a 9600 (che dovrebbe essere la velocità di default se non la si cambia) ?

Guglielmo

Buona sera a tutti, dopo tanti tentativi e molte letture sono riuscito ad integrare il modulo SIM900 con Arduino 2009 in base al mio scopo, ossia quello di azionare un relè solamente da numeri autorizzati (presenti nel codice non su sim) e nel caso non fosse autorizzato l'invio di un SMS.

Casomai domani cercherò di dettagliare il tutto.

Grazie a tutti per disponibilità

Buongiorno a tutti,

non so se vi può essere d’aiuto, ma come anticipato nel mio vecchio post vi voglio dettagliare il modo in cui ho risolto il problema di comunicazione tra il mio GPRS Shield e Arduino 2009.

In questa versione ho anche aggiunto lo shield Relè LINK

Leggendo su alcuni siti, ho scaricato e modificato all’interno della file GSM.cpp presente nella libreria “GSM_GPRS_GPS_Shield_GSMSHIELD” le porte di comunicazione dello shild con Arduino, impostandole sulla porta 2 e 3, come di seguito mostrato.

#define _GSM_TXPIN_ 2
#define _GSM_RXPIN_ 3

Modificate le porte ed eseguito le seguenti connessioni:

Shiled GSM - Arduino - Releè SHILED (montato direttamente sopra Arduino)

Porta 1 RX → Porta 2 TX
Porta 2 TX → Porta 3 RX
Porta 13 led
Porta 5 → Rele1
Porta 6 → Rele2
Porta 7 → Rele3
Porta 8 → Rele4

ho deployato il seguente codice:

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

CallGSM call;
SMSGSM sms;
CallGSM gsmAccess;

// PIN Number della scheda 32XXXXXXX

#define PINNUMBER ""

SoftwareSerial mySerial(2, 3); // RX, TX

boolean started=false;

int led = 13; // Il Pin 13 è quello connesso al LED

char number_incoming[20];

// Define constants and variables
const int out1 = 5; // define Arduino pin connected to relay 1
const int out2 = 6; // define Arduino pin connected to relay 2
const int out3 = 7; // define Arduino pin connected to relay 3
const int out4 = 8; // define Arduino pin connected to relay 4

void setup()
{
     pinMode(led,OUTPUT);
     mySerial.begin (19200);
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     if (gsm.begin(19200))
          Serial.println("\nstatus=READY");
     else Serial.println("\nstatus=IDLE");
     
     pinMode(out1, OUTPUT); // initialize the digital pin as an output     
     pinMode(out2, OUTPUT); // initialize the digital pin as an output
     pinMode(out3, OUTPUT); // initialize the digital pin as an output
     pinMode(out4, OUTPUT); // initialize the digital pin as an output

     digitalWrite( out1,LOW );
     digitalWrite( out2,LOW );
     digitalWrite( out3,LOW );
     digitalWrite( out4,LOW );

     Serial.println("CHIUDO LA CHIAMATA");
     delay(1000);
     call.HangUp();
     delay(1000);
     Serial.println("ASPETTO CHIAMATA");
 };

void loop()
{
  if (mySerial.available())
      Serial.write(mySerial.read());
    
  switch (call.CallStatus())
  {
    case CALL_NONE: // Nothing is happening
      Serial.println("NESSUNA CHIAMATA");
      break;
    case CALL_INCOM_VOICE: // Yes! Someone is calling us
      Serial.println("RECEIVING CALL");
         call.CallStatusWithAuth(number_incoming,0,0);
         Serial.print("incoming voice call from ");
         Serial.println(number_incoming);

    if ((strcmp(number_incoming,"+3932XXXXXXX")==0) 
    || (strcmp(number_incoming,"+3932XXXXXXX")==0)
    || (strcmp(number_incoming,"+3932XXXXXXX")==0)
    || (strcmp(number_incoming,"+3932XXXXXXX")==0)
    || (strcmp(number_incoming,"+3932XXXXXXX")==0)) {

            Serial.println(" => Accendo il LED");
            delay(1000);  
            digitalWrite(led, HIGH); // Accende il LED impostando il voltaggio a HIGH
            delay(1000);
            Serial.println(" => Aziono il cancello");
            delay(1000);
            Serial.println(" => Apro il Relè");
            digitalWrite(out1, HIGH);
            call.HangUp();
            delay(1000);  
            digitalWrite(led, LOW); // Accende il LED impostando il voltaggio a HIGH
            delay(1000);
            digitalWrite(out1, LOW);
            break;
    } else {
            
            Serial.print(number_incoming);
            Serial.println(" => non riconosciuto!");
            call.HangUp();
            delay(4000);
            InvioMessaggio();
            break;
    } 
    case CALL_COMM_LINE_BUSY:  // In this case the call would be established
      Serial.println("TALKING. Line busy.");   
      break;
}
  delay(1000);
}

void InvioMessaggio ()
{
    mySerial.println ( "AT + CSCS = \"GSM\"" "\r"); // Imposta il modulo GSM in modalità testo
    delay (1000); // Ritardo di 1000 milli secondi o 1 secondo
    mySerial.println ( "AT + CMGF = 1" "\r"); // Imposta il modulo GSM in modalità testo
    delay (1000); // Ritardo di 1000 milli secondi o 1 secondo
    mySerial.println ( "AT + CMGS = \"32XXXXXXX\"" "\r"); // Sostituisci x con il numero di cellulare
    delay (1000);
    mySerial.println ("Alert! - Apertura cancello" "\r"); // Il testo SMS che si desidera inviare
    delay (1000);
    mySerial.println ((char) 26); // codice ASCII di CTRL + Z
    delay (1000);

Come potete notare, all’interno del codice ho impostato la gestione del chiamante, in modo tale che nel caso sia presente in quella lista abilito il led e il relè, mentre nel caso non sia presente invio un sms ad un numero di cellulare personale.

Tale gestione mi permette di modificare la lista senza smontare la sim ed inserirla in un cellulare per la memorizzazione dei numeri.

A questo punto l’unico mio problema è la gestione della corrente. Nel caso essa salti devo impostare il reset della connessione GSM in modo automatico ma non avviene.

Avevo impostato questo codice con relativi collegamenti:

void powerUpOrDown()
{
  pinMode(9, OUTPUT);
  digitalWrite(9,LOW);
  delay(1000);
  digitalWrite(9,HIGH);
  delay(2000);
  digitalWrite(9,LOW);
  delay(3000);
}

ma non ottengo nessun risultato anche se sulla libreria GSM è definita la porta 9

#define GSM_RESET           9

il progetto è finito, ma naturalmente tutto è migliorabile infatti attendo vostri consigli per risolvere il problema della connessione e sulla gestione degli errori e sbagli che ho fatto all’interno del codice.

Grazie a tutti per la collaborazione.