COLLEGAMENTO SHIELD E ARDUINO MEGA 2560

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 ... ::slight_smile:

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 :

  1. tagliare via i pin 7 ed 8 in modo che non raggiungano gli equivalenti pin sulla mega
  2. con i ponticelli sulla scheda selezionare, come da istruzioni, la SoftwareSerial
  3. 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)
  4. definire in GPS.h che si sta su una UNO (così viene usata la SoftwareSerial)
  5. 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 ... ::slight_smile:

Guglielmo

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:

https://forum.arduino.cc/index.php?topic=356557.0

gazza_mo:
Prova a vedere se la libreria che usi è la stessa che ho usato io ...

Il problema NON è di SW (librerie) ...
... il problema è proprio come è fatta quella scheda che prevede SOLO due possibilità ... ::slight_smile:

... SoftwareSerial su 7 e 8 (NON compatibile con la MEGA)
... Serial su pin 0 e 1

Guglielmo

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 !

ho provato con quello scritto da te

Praticamente dovresti :

  1. tagliare via i pin 7 ed 8 in modo che non raggiungano gli equivalenti pin sulla mega
  2. con i ponticelli sulla scheda selezionare, come da istruzioni, la SoftwareSerial
  3. 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)
  4. definire in GPS.h che si sta su una UNO (così viene usata la SoftwareSerial)
  5. 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:

  1. 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)

non vedo nessuna comunicazione su serial monitor.

cosa faccio??
simone

... hai sicuramente incasinato i sorgenti ...

Riscarica la libreria originale, cancella quella con cui hai giocato, modifica SOLO ed ESCLUSIVAMENTE, in GSM.cpp, le righe :

#define GSM_TXPIN 2
#define GSM_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 ( ::slight_smile: ) 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).

Guglielmo

se non modifico swserial.h come riporto

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

:o :o :o ... allora non ci capiamo ...

... 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" ... ::slight_smile:

Guglielmo

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).

Fammi sapere se almeno questo ti va ...

Guglielmo

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

simone

inserisco foto 1

dimenticavo quando ho caricato l'esempio GSM_GPRSLibrary_AT non ho avuto nessun errore.
simone

mattia99:
...
il collegamento tra arduino mega è 18->7 19->8
...

NO, non ci siamo, se NON TI SUDI le librerie NON ne esci !!!

E studialo il reference de'sta benedetta SoftwareSerial ... che c'è scritto ? Quali pin puoi usare con la Mega ? Vedi per caso il 18 e il 19 ?

Guglielmo

P.S.: NON a caso ti avevo indicato il 10 e 11 !!!

Grazie Mille Guglielmo,
ho seguito attentamente i passaggi descritti in questo thread ed ho risolto il problema in pochi minuti.

Se volessi cimentarmi sulla modifica della libreria seriale da dove mi consigli di partire?

Grazie, Luca

lucamuscas:
Se volessi cimentarmi sulla modifica della libreria seriale da dove mi consigli di partire?

... emmm ... quale libreria seriale vorresti modificare ? ? ? E per fare cosa ? ? ?

Guglielmo

Praticamente dovresti :

  1. tagliare via i pin 7 ed 8 in modo che non raggiungano gli equivalenti pin sulla mega
  2. con i ponticelli sulla scheda selezionare, come da istruzioni, la SoftwareSerial
  3. 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)
  4. definire in GPS.h che si sta su una UNO (così viene usata la SoftwareSerial)
  5. 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 ... ::slight_smile:

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).

Guglielmo