Go Down

Topic: SIM800L et Arduino Nano (Read 2124 times) previous topic - next topic

Electrof

Bon, ca ne semble pas etre un problème électrique, ni un problème de Baud (j'ai testé sous AT Command Tester et rien ne passe)...

Et j'ai toujours les caractères illisibles qui s'affichent... Et les commandes AT ne sont pas opérationnelles...

J'y comprend plus rien !!

DavidT95

#31
Mar 05, 2019, 02:17 pm Last Edit: Mar 05, 2019, 02:19 pm by DavidT95
Salut,
quelque piste:
est ce que tu as connectés les masses du nano et sim800 ensemble?
La fréquence de ton nano est correctement réglé(16 ou 8)?
A tu essayé de modifier la vitesse de communication des ports série et dans le moniteur ?
Vérifie aussi que tx et rx ne sont pas inversé.(Ça m'est arrivé...)


Electrof

Salut,
quelque piste:
est ce que tu as connectés les masses du nano et sim800 ensemble?
La fréquence de ton nano est correctement réglé(16 ou 8)?
A tu essayé de modifier la vitesse de communication des ports série et dans le moniteur ?
Vérifie aussi que tx et rx ne sont pas inversé.(Ça m'est arrivé...)


Bonjour,

Oui les masses sont connectées ensemble.
J'ai même changé mon nano, par un uno et aussi par un mega, le résultat est le même : des caractères non lisibles défilent dans le moniteur série.
J'ai changé la vitesse de communication, et testé sous AT Command Tester, mais rien...
Tx et Rx ne semblent pas inversés, je les ai aussi relié sur le Rx1 et Tx1 sur le mega.

J'ai aussi revu mon schéma électrique (pièce jointe).

Comment puis-je debugger ? Avez vous un schéma pour me montrer une config qui fonctionne ?

Merci.



J-M-L

#33
Mar 05, 2019, 05:10 pm Last Edit: Mar 05, 2019, 05:14 pm by J-M-L
votre image:



- par acquis de conscience vous avez mesuré la tension après la diode ?
- avez vous essayé tous les débit traditionnels dans la comm avec le module ? (tout en laissant la partie Arduino et la console bien sûr en 115200)
- vous pouvez poster une photo de votre module ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

al1fch

#34
Mar 05, 2019, 05:17 pm Last Edit: Mar 05, 2019, 05:23 pm by al1fch
Bonjour

deux remarques

1)ce schéma n'sest pas  cohérent avec le programme donné au message #1

Code: [Select]
#include <SoftwareSerial.h>
SoftwareSerial sim800l(7, 8); // RX, TX

La broche 7 de l'Arduino est choisie comme entrée  RX... reliée à l'entrée RX du SIM800L >:(
La broche 8 de l'Arduino est choisie comme sortie   TX... reliée à la sortie TX du SIM800L >:(

TX contre TX, RX contre RX, les commandes AT n'ont aucune chance de passer

2) Le module SIM800 a pu souffrir de la forte surtension subie (cf message #15)








Electrof

Bonjour, merci de vos retours.

- par acquis de conscience vous avez mesuré la tension après la diode ? 4.30V
- avez vous essayé tous les débit traditionnels dans la comm avec le module ? (tout en laissant la partie Arduino et la console bien sûr en 115200) ?
Oui j'ai essayé aujourd'hui, ca n'affiche rien du tout.

- vous pouvez poster une photo de votre module ?


- ce schéma n'sest pas  cohérent avec le programme donné au message #1
Oui, j'ai fais quelques modifications depuis. Désormais j'ai remis correctement le Tx et Rx afin de respecter le code SoftwareSerial sim800l(7,8)

- Le module SIM800 a pu souffrir de la forte surtension subie
Oui, j'ai suivi votre retour et j'ai pris une nouvelle carte sim800l qui n'a pas souffert de surtension. J'ai même changé de carte en prenant une carte MEGA.

Merci beaucoup de votre aide.

al1fch

Voilà la photo du module

J-M-L

pouvez vous poster le nouveau code ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Electrof

pouvez vous poster le nouveau code ?
C'est le même que le post #1.

J-M-L

j'ai un module comme cela dans un coin, je regarderai dès que j'ai 5 min
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

DavidT95

A tu essayé un pont diviseur sur Rx du sim800l?j'ai lu que le sim800l n'était pas 5v tolérant..
Une résistance de 10k et 20k?

J-M-L

#41
Mar 05, 2019, 10:48 pm Last Edit: Mar 05, 2019, 11:11 pm by J-M-L
bon j'ai ressorti mon module, j'ai relu mes notes et mon code de test.

1. Le module supporte par défaut l'auto-bauding. Ce qui veut dire qu'il s'adapte automatiquement à la vitesse du module qui discute avec lui. Dans mes notes j'ai marqué que l'autobauding ne supportait pas toutes les vitesses mais seulement de 1200 à 57600 bauds (1200 , 2400, 4800, 9600, 19200, 38400, 57600) alors que le module peut monter après un AT+IPR à 115200 bauds.

--> ça veut dire qu'il faut régler par défaut la communication à 57600 par exemple mais pas au dessus si on n'est pas sûr de comment le module est configuré


2.  La la documentation dit au paragraphe 4:

Quote
SIM800 series is designed in autobauding mode by default. Autobauding allows SIM800 series to automatically detect the baud rate of the host device. In application, host device must to synchronize the baud rate with SIM800 series. Host device must firstly send character "AT" or "at" to synchronize the baud rate. It is recommended to send "AT" until host device receives the "OK" response, which means host device and SIM800 series are correctly synchronized.
En français dans le texte ça veut dire que on doit envoyer AT pour que l'AutoBaud fonctionne et qu'il est recommandé d'envoyer AT jusqu'à ce que l'on ait eu la bonne réponse OK.


3. Le module supporte bien la communication UART sur Tx et Rx à 5V mais doit être alimenté entre 3,7V et 4.2V. Une diode 1N4007 peut être utilisée pour créer la chute de tension depuis 5V


4. attention la diode 1N4007 ne supporte pas plus d'1A en continu. En pic elle tient plus mais il se peut que votre module tire plus et longtemps suivant l'usage. --> ce n'est pas forcément donc la méthode recommandable.

Travaux pratiques:

j'ai donc sorti une 1N4007 comme vous de mon tiroir. Pour mémoire une diode ça se branche dans ce sens (histoire d'être sûr hein.. je ne dis pas que vous n'avez pas vérifié...)



et donc mon montage ressemble à cela:

GND Alim <--> GND SIM800L <-->  GND Arduino Mega
5V 2.1A + <----> 1N4007 <----> Vcc SIM800L
Rx SIM800L <----> Tx3 Arduino Mega D14
Tx SIM800L <----> Rx3 Arduino Mega D15
RST SIM800L reste en l'air ainsi que toutes les autres pins

je n'ai pas mis de carte SIM dans le module.



Enfin, J'ai ressorti un vieux code qui permet d'envoyer des commandes "proprement" et de lire la réponse pour potentiellement l'analyser. Je mets le code dans le post suivant car je dépasse les 9000 caractères sinon

Dans ce code je montre comment analyser par exemple la réponse à AT+CSQ qui donne la qualité du signal. Si le code ne trouve rien qui correspond à ce qu'il attend, il imprime simplement le message de réponse du module.


en faisant tourner ce code et en ouvrant ma console à 115200 bauds et en m'assurant d'envoyer CR+LF comme fin de ligne je vois ceci


..............GPRS Modem OK
Initialisation OK

+CPIN: NOT INSERTED


les points sont la phase d'attente que le module réponde bien en AUTOBAUD à ma commande AT. Faut donc essayer plusieurs fois (chaque point est un essai à 1 seconde d'intervalle). A noté que je ne me suis pas ennuyé à mettre une carte SIM donc j'ai le message d'erreur +CPIN: NOT INSERTED


Ensuite je tape AT et la console me dit bien OK


et si je tape une commande qui est analysée dans le code, juste AT+CSQ ici alors la console me répond bien

AT+CSQ
Qualité de reception = 21
Code Erreur = 0

OK


Voilà



Vous nous avez dit avoir un MEGA,  essayez en copiant mon code et mon montage (et en enlevant votre carte SIM au cas où elle ait un défaut) dites nous ce que vous voyez...


PS/ J'ai aussi rajouté une petite LED dans mon montage qui tire un peu de jus sur mon alimentation car j'étais un peu au dessus des 4.2V réglementaires et mon module SIM800L se plaignait
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

#42
Mar 05, 2019, 10:49 pm Last Edit: Mar 05, 2019, 11:19 pm by J-M-L
Voici donc le code pour un Arduino MEGA + SIM800L

Code: [Select]
#define gsm Serial3

const char * ATString = "AT";
const char * OKString = "\r\nOK\r\n";

const uint32_t oneSecond = 1000ul;

const byte maxMessageSize = 200;
char GSM_MessageLine[maxMessageSize + 1]; // +1 as we want to be able to store the trailing '\0'

// --------------------------------------
// gsmPrintlnATCommand executes an AT commmand by adding at the end a CR LF
// then it checks if endMarker string is receivedon the GSM Serial port
// for max duration ms returns a boolean stating if the marker was found
// with the verbose option, the output from the GSM is also printed to Serial
// --------------------------------------

boolean gsmPrintlnATCommand(const char * command, const char * endMarker, unsigned long duration, boolean verbose)
{
  gsm.println(command);
  return waitForString(endMarker, duration, verbose);
}

// --------------------------------------
// gsmPrintATCommand or gsmpWriteATCommand is used when you don't want to send the CR LF
// at the end of the commmand line; use it to build up a multi part command
// same syntax as print as they are Variadic Macros using print or write
// --------------------------------------
#define gsmPrintATCommand(...) gsm.print(__VA_ARGS__)
#define gsmWriteATCommand(...) gsm.write(__VA_ARGS__)


// --------------------------------------
// read a line from gsm, ignore '\r' and returns true if '\n' is found
// --------------------------------------

boolean getGSMLine()
{
  static byte indexMessage = 0;
  boolean incomingMessage = true;

  while (gsm.available() && incomingMessage) {
    int c = gsm.read();
    if (c != -1) {
      // Serial.write((uint8_t) c); // si vous voulez voir ce qui arrive
      switch (c) {
        case '\n':
          GSM_MessageLine[indexMessage] = '\0'; // trailing NULL char for a correct c-string
          indexMessage = 0; // get ready for next time
          incomingMessage = false;
          break;
        case '\r': // don't care about this one
          break;
        default:
          if (indexMessage <= maxMessageSize - 1) GSM_MessageLine[indexMessage++] = (char) c; // else ignore it..
          break;
      }
    }
  }
  return !incomingMessage;
}

// --------------------------------------
// waitForString wait max for duration ms whilst checking if endMarker string is received
// on the GSM Serial port returns a boolean stating if the marker was found
// --------------------------------------

boolean waitForString(const char * endMarker, unsigned long duration, boolean verbose)
{
  int localBufferSize = strlen(endMarker);
  char localBuffer[localBufferSize];
  int index = 0;
  boolean endMarkerFound = false;
  unsigned long currentTime;

  memset(localBuffer, '\0', localBufferSize); // clear buffer

  currentTime = millis();
  while (millis() - currentTime <= duration) {
    if (gsm.available() > 0) {
      if (index == localBufferSize) index = 0;
      localBuffer[index] = (uint8_t) gsm.read();
      if (verbose) Serial.print((char) localBuffer[index]);
      endMarkerFound = true;
      for (int i = 0; i < localBufferSize; i++) {
        if (localBuffer[(index + 1 + i) % localBufferSize] != endMarker[i]) {
          endMarkerFound = false;
          break;
        }
      }
      index++;
    }
    if (endMarkerFound) break;
  }
  return endMarkerFound;
}


void setup()
{
  Serial.begin(115200);
  gsm.begin(57600);  // test 1200 , 2400, 4800, 9600, 19200, 38400, 57600, 115200.
  // for SIM800L and autobauding Serial and gsm should have the same baud rate and max is 57600

  // prévoir éventuellement AT+CPIN=1234 pour rentrer le PIN

  // we wait until the module answers to AT command with an OK
  bool waitForBoot = true;
  while (waitForBoot) {
    if (gsmPrintlnATCommand(ATString, OKString, oneSecond, false)) {
      Serial.println(F("GPRS Modem OK"));
      waitForBoot = false;
    } else {
      Serial.write('.');
      delay(oneSecond);
    }
  }
  Serial.println("Initialisation OK");
}


void loop()
{
  // on lit une commande AT que l'utilisateur tape sur la console série et on l'envoie au gsm
  while (Serial.available()) {
    int r = Serial.read();
    if (r != -1) {
      gsm.write((uint8_t) r);
    }
  }

  if (getGSMLine()) {
    // ici on peut tester si la réponse est quelque chose d'intéressant

    // ********************************************
    // par exemple analyse de la réponse à AT+CSQ
    if (!strncmp(GSM_MessageLine, "+CSQ:", 5)) { // 5 parce que "+CSQ:" c'est 5 caractères, on compare le début de la chaîne
      int rssi, ber;
      if ( sscanf(GSM_MessageLine, "+CSQ: %d,%d", &rssi, &ber) == 2) {
        Serial.print(F("Qualité de reception = ")); Serial.println(rssi);
        Serial.print(F("Code Erreur = ")); Serial.println(ber);
      }
    }

    // ********************************************
    // Autres test...
    else if (!strncmp(GSM_MessageLine, "+TOTO:", 6)) {


    } else {
      Serial.println(GSM_MessageLine); // sinon on imprime simplement la réponse
    }
  }
}


pour la petite histoire j'ai d'autres modules SIM800 et ils supportent le 5V directement, vaut mieux pas s'ennuyer et acheter ceux là...
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

#43
Mar 05, 2019, 11:03 pm Last Edit: Mar 05, 2019, 11:04 pm by J-M-L
PS - je savais que j'avais déjà posté ce code quelque part ici, c'est dans la longue discussion pour le projet d'AquaBoun's sur la partie SMS de son code

:)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

DavidT95

Quote
dans la longue discussion
J'ai commencé à lire ça avait l'air intéressent mais j'ai abandonné...
+1 pour le module sim800l c plus simple



Go Up