Conflitto tra GSM Shield e Arduino Ethernet

Ciao a tutti,
ho acquistato questo GSM Shield della Open Electronics http://www.open-electronics.org/arduino-gsm-shield/
e Arduino Ethernet (non lo Shield, ma direttamente Arduino Ethernet).

Ho scaricato le librerie GSMGPRS Google Code Archive - Long-term storage for Google Code Project Hosting. (vers.3.06) ed effettuato dei test con alcuni sketch forniti.
Il tutto funziona egregiamente, ovvero riesco a effettuare chiamate, inviare SMS e ricevere chiamate dai cellulari.
Faccio presente che nello Shield GSM ho impostato lo switch su SW e i pin del file GSM.cpp sono:

#define _GSM_TXPIN_ 4
#define _GSM_RXPIN_ 5

Il mio obiettivo però è far convivere questo Shield mentre è in uso l'Ethernet, in quanto l'intenzione è, una volta ricevuta una chiamata da un certo numero, effettuare una GET http su un mio server. Per fare questo ho scaricato le librerie HTTPClient http://interactive-matter.eu/how-to/arduino-http-client-library/ le quali funzionano anch'esse egregiamente, se utilizzate da sole in uno sketch.

Il problema nasce quando utilizzo nello stesso sketch sia le librerie GSM che quelle Ethernet/HTTPClient e secondo me il conflitto è sui pin di TX e RX.
Mi chiedevo se ho fatto un errore comprando Arduino Ethernet invece di Arduino + Ethernet Shield. Ma secondo me non cambiava nulla.
Tanto per farvi capire, questo è il codice del mio sketch:

#include <SPI.h>
#include <Ethernet.h>
#include <HTTPClient.h>
#include "SIM900.h"
#include "call.h"
#include <SoftwareSerial.h>

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0xEE, 0x12 }; //Arduino Ethernet Shield MAC
IPAddress ip(172,16,11,180); //static ip arduino device
IPAddress dns(172,16,9,11);
IPAddress gateway(172,16,11,1);
IPAddress subnet(255,255,255,0);

char* serverName = "www.google.it"; //server name
byte serverIp[] = { 173,194,35,56 }; //server ip

CallGSM call; //Initialize the GSM module
char number_incoming[20];
EthernetClient client; //Initialize the Ethernet client library (port 80 is default)
HTTPClient httpClient = HTTPClient(serverName,serverIp);

void setup() {
  Serial.begin(9600);
  Serial.println("Starting test...");

  if (gsm.begin(2400))
    Serial.println("gsm status: READY");
  else Serial.println(" gsm status: IDLE");

  Ethernet.begin(mac,ip,dns,gateway,subnet);
  delay(1000);
  Serial.print("My IP: ");
  Serial.println(Ethernet.localIP());
}

void loop()
{
  if (Check_Call() == 1) {
    verifyNumber();
  }
  delay(1000);
}

int Check_Call()
 {
   byte stat = call.CallStatusWithAuth(number_incoming,1,2);
   if(stat==4) {
     Serial.print("Incoming call from ");
     Serial.println(number_incoming);
     delay(1500);
     call.HangUp();
     return 1;
   }
   return 0;
 }

void verifyNumber() {
  char * requestString = "/stringa del mio server";
  FILE* result = httpClient.getURI(requestString);
  int returnCode = httpClient.getLastReturnCode();
  
   if (result!=NULL) {
      httpClient.closeStream(result);  // this is very important -- be sure to close the STREAM
    }
    else {
      Serial.println("failed to connect");
    }
    
    if (returnCode==200) {
      Serial.println("return code: 200");
    }
}

Veniamo al debug, cosa accade di preciso sul Serial Monitor? Una volta avviato, dopo circa 30 sec mi da il messaggio "gsm status: READY" il che mi fa pensare che tutto procede bene. Ma poi non viene assegnato un indirizzo IP, difatti appare: "My IP: " (vuoto).

Se provo ad effettuare una chiamata sulla sim dello shield gsm, mi dà libero, ma il Serial Monitor non dà segni.
Insomma in sintesi, lo shield funziona bene se non utilizzo l'Ethernet, e viceversa. Insieme, non lavorano! :~

Qualcuno può aiutarmi?

ciao

l'ethernet shield dovrebbe usare i PIN SPI... il dubbio è che quello di ChipSelect (CS) sia utilizzato anche dalla GSM Shield... stai usando l'ethernet shield ufficiale? Da solo quindi funziona?

Ciao,
innanzitutto non penso che questo ti serva:

#include <SoftwareSerial.h>

(considera che nella libreria GSM è già richiamata la NewSoftwareSerial)

Poi:

#define GSM_TXPIN 4
#define GSM_RXPIN 5

mi pareva di ricordare qualche problema legato all'utilizzo dei pin..
Leggi qui:

@lucadentella
sì, è l'Arduino Ethernet originale -> http://arduino.cc/en/Main/ArduinoBoardEthernet
da solo funziona

@pitusso
cosa dovrei dedurre dal link che hai postato? io uso i pin 4 e 5 come dice lì.
considerate che ho provato anche a impostare i pin 0 e 1 come dice qui: http://www.open-electronics.org/arduino-gsm-shield/ "This Library is derived from Hwkitchen’s GSM Library http://www.hwkitchen.com and include the NewSoftSerial library to comunicate using the pin 4 (RX) and 5 (TX). You can also use the pin 0 and 1 (RX and TX) but you must disconnect the module to upload the sketch (so it’s not very nice), and you must modify the library."

cioè ho impostato 0 e 1 nel file .cpp, tolto la basetta, fatto l'upload dello sketch, poi rimessa. ma il Serial Monitor non mi dà segni di vita. Gli unici segni (status=ready) li ottengo coi pin 4 e 5, il telefona dà libero ma non vedo nulla sul SM.

che pizza....

Ciao

i pin 0/1 sono la seriale "hardware" (oggetto Serial), mentre se la tua lbreria usa la SoftSerial devi usare altri PIN... 4 e 5 dovrebbero andare bene.
Guardando lo schema dell'arduino ethernet, il PIN4 è utilizzato per il CS della scheda SD... potrebbe essere quello che "da fastidio" allo shield GSM

@pitusso
tu dici che la libreria SoftwareSerial non dovrebbe servirmi, in realtà non è così, perché mi da errore di compilazione se la tolgo..
ricordo che le librerie che uso sono queste: Google Code Archive - Long-term storage for Google Code Project Hosting.

@lucadentella
tu dici che potrebbe dar fastidio quel pin. c'è modo quindi di risolvere la cosa in qualche modo? sono poco pratico di elettronica, lavoro prevalentemente con software & codice..

ciao

sullo shield GSM puoi decidere quali pin utilizzare o la scelta dei pin 4 e 5 è vincolante?

posso decidere tramite un file cpp.
ho provato in vari modi, per ora l'unico funzionante (intendo quando opera da sola, senza l'ethernet) è

#define _GSM_TXPIN_ 4
#define _GSM_RXPIN_ 5

ciao

ok nel sorgente ma se poi i collegamenti tra arduino e shield sono bloccati... :slight_smile:

cosa dovrei dedurre dal link che hai postato?

io leggo:

La shield utilizza i pin 4 e 5 per comunicare con Arduino, ma utilizza altri pin per reset, verificare il ring ecc... alcuni pin sono collegati ma non utilizzati, però bisognerebbe tagliare le piste per evitare conflitti.
http://www.open-electronics.org/arduino-gsm-shield/
qui trovate lo schema

forse son visionario, ma mi sembra che dica che ci son altri pin utilizzati oltre a quelli dichiarati :roll_eyes:
Nello schema potrebbero esserci informazioni utili.

tu dici che la libreria SoftwareSerial non dovrebbe servirmi, in realtà non è così, perché mi da errore di compilazione se la tolgo..

Io il codice tuo non l'ho provato, ma guardando i link che hai postato, vedo che nel file SIM900.h c'è:

#include "SoftwareSerial.h"

quindi presumibilmente non dovrebbe essere necessario re-includerlo (se usato solo dal modulo GSM).

Tornando poi ai pin utilizzabili, viene specificato che va modificata la libreria, per utilizzare i pin 0 e 1...

Io cercherei innanzitutto di capire se e quali altri pin vengono realmente utilizzati.

Altra domanda: come alimenti il tutto?
Se non ricordo male, il modulo consuma abbastanza, e consigliavano un'alimentazione esterna a 12v.

Eccomi, scusate il ritardo.
I pin da utilizzare sono quelli che utilizzano la seriale sofware, pertanto 4 e 5. Lo switch deve rimanere su SFW.
(la confusione è nata perchè stiamo sviluppando la nuova GSM/GPRS eeeee GPS shield che può ospitare SIM900 o SIM908.... e che utilizzerà altri pin)
La prima versione della libreria (sviluppata intorno all'IDE 0022) utilizzava la NewSoftSerial, con l'IDE viene utilizzata la SoftSerial già presente nel pacchetto.
Devi includerla come da esempio (che trovi nel download Google Code Archive - Long-term storage for Google Code Project Hosting.):

#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;

char msg[150];
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.SimpleWrite(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWrite("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    
    else{
      Serial.println(inSerial);
      gsm.SimpleWrite(inSerial);
    }    
    
    inSerial[0]='\0';
  }
}

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

Poi, se usi i pin della seriale hardware (0 e 1) devi modificare tutta la libreria. Te lo sconsiglio.
Per quanto riguarda i conflitti con la ethernet.. Attento ai pin che utilizza... (10,11,12,13,... poi non mi ricordo...)
Gli stessi pin vengono utilizzati dalla gsm shield per DTR, CTS, RTS... ecc) http://www.open-electronics.org/arduino-gsm-shield/
Quindi potrebbero generarti conflitto... pertanto.... sega le piste... non vengono comunque utlizzati.. Nella versione 2 della gsm shield li abbiamo collegati a dei jumper, in modo da collegarli solo se ti interessa.
Spero di avere detto tutto, altrimenti...
sono qua.

:smiley:

Boris

invece di segare le piste, ho semplicemente curvato un po' i 4 piedini, come si vede dalla foto, in modo che non entrino dentro ma rimangano fuori.
pensate vada bene così? ho fatto delle prove ma non cambia nulla purtroppo!
sbaglio qualcosa? i pin "tagliati" fuori sono D10, D11, D12, D13.

Si va bene comunque.
E così riesci a gestire tutte le funzioni GSM, giusto?
Se però ci inserisci sopra la ethernet non va'. Senza modificare il codice.
Ho capito bene?

Ok, prima di aspettare la risp ti dico subito che il pin 4 viene utilizzato dalla ethernet per gestire l'SD card...
A dir la verità non capisco come ciò possa creare mal funzionamenti, perchè il pin 4 va ad un buffer nella ethernet, pertanto se non inserisci l'SD non dovresti avere problemi.

allora, ultimi aggiornamenti.
Premesso che le varie prove le faccio sempre con la basetta gsm SEMPRE inserita su Arduino (che ricordo è Arduino Ethernet, non Arduino "semplice").

Se avvio uno sketch con gsm funziona bene. Anche con i 4 piedini non inseriti. Questo è segno che quei piedini NON vengono effettivamente utilizzati dallo shield gsm.

Stavo facendo delle prove con uno sketch che usa solo l'ethernet ma purtroppo non mi funziona più (anche senza la basetta gsm!). Se faccio ping sull'indirizzo che avevo impostato ottengo risposta, ma lo sketch non va. Probabilmente si tratta di problemi con l'hw Arduino. Domani dovrebbe arrivarmi un'altra basetta e farò delle prove con quella. Pertanto attendete miei segnali domani, spero....
Ho provato a staccare e riattaccare tutto più volte, ma nulla.

Che sfiga, proprio quando volevo fare la prova completa....

Ok, facci sapere

mi rifaccio vivo per dare gli ultimi aggiornamenti.
ho comprato arduino uno + lo shield ethernet (ricordo che avevo arduino ethernet fino adesso).
ho fatto un po di test mettendo in cascata le basette gsm - ethernet, spostando i pin della basetta gsm come suggerito e il tutto funziona!!!

quindi il problema era proprio il conflitto di alcuni pin.
grazie a tutti davvero!!
ciao