Ciao a tutti,
sto tentando di usare la nuova libreria GSM_GPRS su Arduino UNO R2 con il compilatore 1.0 ma con scarsi risultati.
La compilazione non restituisce errori. Riesco ad uploadare correttamente lo sketch, arduino esegue il codice ma non ho i risultati.
Ad esempio se tento di inviare una SMS con l'esempio a corredo della libreria, mi viene scritto sul SerialMonitor "SMS sent" ma io non ricevo nulla! Nello sketch di esempio, ovviamente, ho modificato solo il numero di telefono di destinazione mettendo quello del mio cellulare...
Altro tentativo che ho fatto è usare l'esempio GSM_GPRSLibray_Client che crea una connessione GPRS a Internet e tenta di leggere una URL. Qui ho modificato solo l'APN ma niente, ricevo 0 byte. Ho pravato a cambiare anche vari APN del mio gestore ma nulla. =(
Ho provato ad utilizzare la vecchia versione della libreria per inviare gli SMS e tutto funziona regolarmente!
Garantisco quindi che le SIM (ho provato con 2) funzionano sia per il traffico dati GPRS sia per gli SMS. Arduino funziona. Lo shield funziona e si registra sulla rete GPRS.
Il mio obiettivo è passare dei parametri via QueryString ad una pagina APSX che ho sviluppato.
Ormai sono 3 giorni che prendo di mira tutti gli spigoli di casa!! :~
questo vuol dire che arduino dovrebbe usare i pin 2 e 3 per trasmettere e ricevere dati dallo shield, ma non è fisicamente vero perchè usa o i pin 4 e 5 (deviatore dello shield su software) o 0 e 1 (deviatore dello shield su hardware)
lasciando il deviatore su software commenta le righe così
Ciao,
si intendo proprio quella libreria.
Ho modificato il GSM.cpp come mi hai indicato ma non è cambiato nulla eseguendo gli esempi.
Ho un dubbio, nell'esempio, che inserisco qui sotto, non c'è nessun riferimento al file GSM.cpp... il compilatore quando va a leggere il file gsm.cpp?
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.
//Simple sketch to start a connection as client.
InetGSM inet;
//CallGSM call;
//SMSGSM sms;
char msg[50];
int numdata;
char inSerial[30];
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(2400))
Serial.println("\nstatus=READY");
else Serial.println("\nstatus=IDLE");
//GPRS attach, put in order APN, username and password.
//If no needed auth let them blank.
if (gsm.attachGPRS("web.omnitel.it", "", ""))
Serial.println("status=ATTACHED");
else Serial.println("status=ERROR");
delay(10000);
//Read IP address.
gsm.SimpleWrite("AT+CIFSR\r");
delay(5000);
//TCP Client GET, send a GET request to the server and
//save the reply.
numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);
//Print the results.
Serial.println("\nNumber of data received:");
Serial.println(numdata);
Serial.println("Data received:");
Serial.println(msg);
//Tweet
//inet.tweet("*********************key************", "An Arduino at #cpes15");
};
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();
}
Esguito su arduino l'esempio, sul Serial Monitor mi compare questo:
GSM Shield testing.
status=READY
status=ATTACHED
Number of data received:
0
Data received:
Ho fatto un tentativo con l'esempio che invia un SMS e funziona!
Che c' che non va nell'esempio del Client HTTP?
Come avrai capito sono alle prime armi con Arduino
ora vado a fare un po' di stretching per lo stomaco che tra poco iniziano le abbuffate!
Scusa se quel che sto dicendo non ti può aiutare ma volevo chiederti se hai comprato direttamente lo shield per arduino da 63 euri o il modulo da solo...
djpatrik1824:
Scusa se quel che sto dicendo non ti può aiutare ma volevo chiederti se hai comprato direttamente lo shield per arduino da 63 euri o il modulo da solo...
GSM Shield testing.
status=READY
status=ATTACHED
=============================================
Inizio output da inetGSM.cpp
Server:www.google.com
Porta:80
Path:/
GPRS:READY
connectTCP=false
Fine output da inetGSM.cpp
=============================================
Number of data received:
0
Data received:
Quindi è la funzione gsm.connectTCP che non riesce a connettersi al serverweb....
continuo a indagare ma se avete qualche dritta sono tutto orecchie e occhi
Forse non riesce a leggere la pagina perchè CREDO che la connessione alla rete GPRS in realtà non sia effettuata al 100%...
Se uso getStatus() in vari punti mi restituisce sempre READY (stato 2) e non ATTACHED (stato 3)... forse per funzionare deve essere in stato 3.
Ho appena scaricato il manuale dei comandi AT del SIM900 ma non riesco ad inviarglieli... ho provato sia con il SerialMonitor del compilatore che con HyperTerminal...
Ciao, puoi fare questa prova:
Carica il file di esempio AT.
Una volta lanciato aspetti che il modulo invii qualche stringa di accensione (10-15 sec)
e invii i seguenti comandi:
AT
-->OK (questa è la risposta che dovresti ottenere, questo comando vede se c'è comunicazione con il modulo)
AT+CSTT="nomeapn","username","password"
-->OK (imposti l'APN, dove al posto di nomeapn, username e password metti quelli del gestore, se non hai username e pass lasci vuoto)
AT+CIICR
-->OK (avvii una connessione internet)
AT+CIFSR
-->192.xxx.xxx.xxx (restituisce l'IP)
Così vediamo di capire, dov'è il problema in fase di connesione.
Ciao, puoi fare questa prova:
Carica il file di esempio AT.
Una volta lanciato aspetti che il modulo invii qualche stringa di accensione (10-15 sec)
e invii i seguenti comandi:
AT
-->OK (questa è la risposta che dovresti ottenere, questo comando vede se c'è comunicazione con il modulo)
AT+CSTT="nomeapn","username","password"
-->OK (imposti l'APN, dove al posto di nomeapn, username e password metti quelli del gestore, se non hai username e pass lasci vuoto)
AT+CIICR
-->OK (avvii una connessione internet)
AT+CIFSR
-->192.xxx.xxx.xxx (restituisce l'IP)
Così vediamo di capire, dov'è il problema in fase di connesione.
Marco
Grande dritta marco
Si comunque la versione è la 3.02 del 15 dicembre.
Ho eseguito i comandi che mi hai indicato e mi hanno restituito tutti OK.
Ho provato con gli APN web.omnitel.it e mobile.vodafone.it ed entrambi mi hanno restituito un indirizzo IP pubblico valido.
Guardandomi la libreria sono andato oltre e ho provato a fare una connessione TCP con AT+CIPSTART="TCP","www.google.it","80"
e mi ha restituito
OK
CONNECT OK
dopo ho provato a inviare il comando AT+CIPSEND
e mi è comparso ">" e credo che sia il prompt del web server.
invio quindi questi comandi ed ho la seguente risposta:
> GET / HTTP/1.0
Host: www.google.it
User-Agent: Arduino
aspetto un po'.... e poi ricevo
CLOSED
ERROR
e ho come l'impressione che la richiesta GET al web server vada in timeout....
Ho visto che nel file inetGSM.cpp esegue gsm.SimpleWrite(end_c); dopo aver scritto la richiesta GET. La costante end_c è = a 2.
Ho provato anche a inviargli il 2 come comando ma non cambia nulla...
Ti dico cosa mi viene in mente,
dopo scritto la tua HTTP request devi effettivamente inviarla al server, quindi:
una volta completato tutto scrivi /END
con questo comando lui effettivamente invia tutto ciò che hai scritto al server.
Come giustamente hai detto tu, se dopo un po' google non riceve nulla, chiude tutto per timeout.
Ricordati due "a capo" alla fine della request.
Per quanto riguarda lo sketch del Client,
prova con quest'ultima versione, è stata aggiunta un "AT+CIFSR" per richiedere l'IP,
in quanto a volte è necessaria per il funzionamento della connessione.
GSM Shield testing.
status=READY
OK
AT
OK
AT+CSTT="web.omnitel.it","",""
OK
AT+CIICR
OK
AT+CIFSR
109.114.121.52
AT+CIPSTART="TCP","www.google.it","80"
OK
CONNECT OK
AT+CIPSEND
> GET / HTTP/1.0
Host: www.google.it
User-Agent: Arduino
_
SEND OK
_
CLOSED
(il trattino - rapprensenta il /END)
Quindi ora google.it ha ricevuto correttamente richiesta ma non mi ha restituito nulla a schermo... è normale?
Do un'occhiata al nuovo esempio che mi hai linkato...
Ok già è un passo avanti, se google non risponde è perché non gli piace la GET request.
Così a occhio mi sembra non ci siano i due "\n" alla fine, sei sicuro di averceli messi?