Certo che non funziona ... era solo per far vedere come era in origine e come lo avevi scritto MALE tu ... con delle #define multiple che vanno anche in conflitto tra loro ...
Comunque ...
... se leggi bene le specifiche di quella scheda, vedi che, in realtà, non è adatta alla Mega ... :
I problemi sono che ...
... o usa la SoftwareSerial (quando è definito #define UNO) e quella scheda è cablata per usare i pin 7 e 8 che NON sono utilizzabili come SoftwareSerial sulla Mega.
... o usa la vera seriale sui pin 0 ed 1 (quando è definito #define MEGA) il che però rende INUTILIZZABILE la porta USB ed il monitor seriale visto che il convertitore USB <--> Seriale usa i pin 0 e 1.
Secondo me, se la vuoi far funzionare ...
... devi per forza fare delle modifiche hardware alla scheda o non funzionerà MAI come vuoi tu sulla Mega !
Praticamente dovresti :
tagliare via i pin 7 ed 8 in modo che non raggiungano gli equivalenti pin sulla mega
con i ponticelli sulla scheda selezionare, come da istruzioni, la SoftwareSerial
scegliere due pin utilizzabili con la SoftwareSerial sulla Mega (es. pin 10 per RX ed 11 per TX) e ponticellare i pin tagliati con i rispettivi pin scelti (es. il 7 con il 10 e il 8 con il 11)
definire in GPS.h che si sta su una UNO (così viene usata la SoftwareSerial)
definire in GPS.cpp i giusti valori per GSM_TXPIN e GSM_RXPIN in funzione dei pin scelti.
In questo modo ingannerai il SW facendogli credere di essere su una UNO e di dover usare la SoftwareSerial e, a livello HW, utilizzerai pin validi per la suddetta libreria.
Un altra strada potrebbe essere quella, ma richiede tutta una lunga serie di modifiche nella libreria, di NON usare la SoftwareSerial, usare un'altra delle 3 seriali disponibili sulla mega e ... modificare tutti i richiamai a Serial con Serialx dove x è 1, 2 o 3, a secondo della seriale scelta.
Prova a vedere se la libreria che usi è la stessa che ho usato io, magari la scheda anche se è diversa come marca risponde alla stessa maniera essendo sempre SIM900. C'è scritto tutto qui nel mio post:
Chiedo venia Guglielmo ! Nella fretta di poter dare un aiuto non ho letto tutto il tuo ultimo passaggio, dove hai spiegato esattamente come risolvere il problema !
tagliare via i pin 7 ed 8 in modo che non raggiungano gli equivalenti pin sulla mega
con i ponticelli sulla scheda selezionare, come da istruzioni, la SoftwareSerial
scegliere due pin utilizzabili con la SoftwareSerial sulla Mega (es. pin 10 per RX ed 11 per TX) e ponticellare i pin tagliati con i rispettivi pin scelti (es. il 7 con il 10 e il 8 con il 11)
definire in GPS.h che si sta su una UNO (così viene usata la SoftwareSerial)
definire in GPS.cpp i giusti valori per GSM_TXPIN e GSM_RXPIN in funzione dei pin scelti.
In questo modo ingannerai il SW facendogli credere di essere su una UNO e di dover usare la SoftwareSerial e, a livello HW, utilizzerai pin validi per la suddetta libreria.
ma quando carico il programma su ARDUINO MEGA mi da errore
In file included from C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD/SIM900.h:5:0,
from GSM_GPRSLibrary_SMS.ino:1:
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD/GSM.h:190:21: error: redeclaration of 'SoftwareSerial GSM::_cell'
SoftwareSerial _cell;
^
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD/GSM.h:187:15: note: previous declaration 'HWSerial GSM::_cell'
HWSerial _cell;
^
Errore durante la compilazione
se poi metto:
scegliere due pin utilizzabili con la SoftwareSerial sulla Mega (es. pin 10 per RX ed 11 per TX) e ponticellare i pin tagliati con i rispettivi pin scelti (es. il 7 con il 10 e il 8 con il 11)
Riscarica la libreria originale, cancella quella con cui hai giocato, modifica SOLO ed ESCLUSIVAMENTE, in GSM.cpp, le righe :
#defineGSM_TXPIN 2 #defineGSM_RXPIN 3
cambiando i pin 2 e 3 con i pin usati ed accertandoti che in GSM.h SIA commentata la define della MEGA e NON commentata la define della UNO.
Non toccare altro ... SE ( : ) le modifiche HW sono fatte bene, i ponticelli inseriti correttamente e la libreria corretta come detto ... dovrebbe andare (usa qualche esempio di cui si è certi, non tuoi programmi).
#define MEGA
#ifndef _HWSERIAL_H_
#define _HWSERIAL_H_
#include "Arduino.h"
#include "Streaming.h"
#include <inttypes.h>
class HWSerial {
#ifdef MEGA
private:
int write_error;
size_t printNumber(unsigned long, uint8_t);
size_t printFloat(double, uint8_t);
public:
HWSerial();
//bool listen();
void end();
/*
bool isListening();
bool overflow();
*/
int peek();
virtual void begin(long baud_rate);
virtual size_t write(uint8_t byte);
size_t write(const char *str) {
return write((const uint8_t *)str, strlen(str));
}
virtual size_t write(const uint8_t *buffer, size_t size);
virtual int read();
virtual int available();
virtual void flush();
size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t println(const __FlashStringHelper *);
size_t println(const String &s);
size_t println(const char[]);
size_t println(char);
size_t println(unsigned char, int = DEC);
size_t println(int, int = DEC);
size_t println(unsigned int, int = DEC);
size_t println(long, int = DEC);
size_t println(unsigned long, int = DEC);
size_t println(double, int = 2);
size_t println(void);
int getString( char *pre_string, char *post_string, char *buffer, int length);
boolean find(char *target);
boolean findUntil(char *target, char *terminate);
#endif
};
#endif
mi da questo errore (è una parte)
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp: In member function 'int SIMCOM900::configandwait(char*)':
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:78:31: error: 'class HWSerial' has no member named 'read'
connCode=_cell.read();
^
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp: In member function 'virtual int SIMCOM900::read(char*, int)':
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:123:22: error: 'class HWSerial' has no member named 'read'
temp=_cell.read();
^
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp: In member function 'int SIMCOM900::readCellData(int&, int&, long int&, long int&)':
C:\Users\Mattia99\Documents\Arduino\libraries\GSM-GPRS-GPS-Shield-GSMSHIELD\SIM900.cpp:156:16: error: 'class HWSerial' has no member named 'read'
mcc=_cell.read();
^
i pin di collegamento che faccio sono giusti? allego foto.
... NON DEVI LASCIARE LE "#define MEGA" ... altrimenti gli dici di usare i pin 0 e 1 (la vera seriale) ... devi far finta di stare su una UNO (#define UNO) in modo che usi la SoftwareSerial con i pin che hai scelto.
Ti sei studiato i sorgenti della libreria ?
Perché se non te li studi non riesci a capire cosa fanno quelle "#define MEGA" e "#define UNO" che vengono usare in varie parti con delle "#ifdef UNO" e "#ifdef MEGA" ... :
Guarda .... fai una semplice prova (che io ho appena fatto) ...
... scarica la libreria, scompattala, se c'è elimina il "-master" finale dal nome della cartella, copiala dove hai le tue librerie Arduino, lancia l'IDE, Esempi -> GSM-GPRS-GPS-Shield-GSMSHIELD -> GSM_GPRSLibrary_AT e compila ...
... la compilazione DEVE andare a buon fine (di default vedo che arriva già con le "#define UNO" e quindi con l'uso della SoftwareSerial).
Ciao Guglielmo
ho fatto una bella pulizia di tutto e reinserito la libreria GSM-GPRS-GPS-Shield-GSMSHIELD poi ho preso l'esempio detto da te GSM_GPRSLibrary_AT e inserito sul mio arduino mega(senza fare nessuna modifica sui file della libreria).
poi ho collegato il mio arduino mega con la scheda con questo collegamento (vedi foto n°1 se è giusta)
poi ho attivato il serial monitor e ho avuto questa risposta.
il collegamento tra arduino mega è 18->7 19->8
poi ho messo i ponticelli come descritto nella foto n°2
il risultato è 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
tagliare via i pin 7 ed 8 in modo che non raggiungano gli equivalenti pin sulla mega
con i ponticelli sulla scheda selezionare, come da istruzioni, la SoftwareSerial
scegliere due pin utilizzabili con la SoftwareSerial sulla Mega (es. pin 10 per RX ed 11 per TX) e ponticellare i pin tagliati con i rispettivi pin scelti (es. il 7 con il 10 e il 8 con il 11)
definire in GPS.h che si sta su una UNO (così viene usata la SoftwareSerial)
definire in GPS.cpp i giusti valori per GSM_TXPIN e GSM_RXPIN in funzione dei pin scelti.
In questo modo ingannerai il SW facendogli credere di essere su una UNO e di dover usare la SoftwareSerial e, a livello HW, utilizzerai pin validi per la suddetta libreria.
Un altra strada potrebbe essere quella, ma richiede tutta una lunga serie di modifiche nella libreria, di NON usare la SoftwareSerial, usare un'altra delle 3 seriali disponibili sulla mega e ... modificare tutti i richiamai a Serial con Serialx dove x è 1, 2 o 3, a secondo della seriale scelta.
Vedi un po' tu ... :
Guglielmo
Per evitare di dover bypassare i pin 7 e 8 devo modificare la libreria gsm/gprs ?
ho erroneamente scritto libreria seriale
lucamuscas:
Per evitare di dover bypassare i pin 7 e 8 devo modificare la libreria gsm/gprs ?
ho erroneamente scritto libreria seriale
Ah ... ok ...
... si, se vuoi usare una delle seriali HW della MEGA e NON usare la SoftwareSerial, devi crearti una tua copia della libreria GSM/GPRS (così da avere sempre da parte l'originale), decidere quale porta seriale della MEGA usare (Serial1, Serial2 o Serial3) e andare in tutti i files a sostituire dove usa "Serial" con quella scelta da te (Serial1 oppure Serial2 oppure Serial3).