SIM800L et Arduino Nano

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?

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é

  1. La la documentation dit au paragraphe 4:

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.

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

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

diode.png

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


[color=purple]..............GPRS Modem OK
Initialisation OK

+CPIN: NOT INSERTED
[/color]

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

[color=purple]
AT+CSQ
Qualité de reception = 21
Code Erreur = 0

OK
[/color]

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

Voici donc le code pour un Arduino MEGA + SIM800L

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

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

:slight_smile:

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

DavidT95:
J'ai commencé à lire ça avait l'air intéressent mais j'ai abandonné...

oui c'était vraiment plus du ping pong sur son projet qu'une discussion générale - mais il y a des bouts de code intéressant dedans :slight_smile:

Merci de votre aide.

Je viens de faire le test. J'obtiens que des points dans mon moniteur série, en mode Nouvelle Ligne a 115200 bauds.

J'ai noté par contre que j'vais du 4.4V à l'entrée du module, mais je n'ai pas trouvé comment baissé de 0.2V, sachant qu'un led me baisse trop la tension.

Juste par acquis de conscience- vous avez bien soudé les pins sur votre module, c’est pas juste enfiché sans être soudé ?

Oui oui elles sont soudées

Voici la photo de mon montage :

Je suppose que le fil blanc de gauche c'est le GND de votre alimentation 5V 2A et le jaune à droite les 5V de cette alimentation. on voit pas bien si le fil jaune passe à l'entrée de la diode qui par le fil rouge court je suppose va à Vcc du module.

Par contre, même si on ne voit pas les N°s de pin, vu la configuration votre fil rouge tendu serait Rx du module et votre fil orange serait le Tx du Module. Comme discuté pour le code, ils dioivent aller vers Serial3. ça à l'air d'être à peu près au bon endroit sur la MEGA, mais comme les fils ne se croisent pas le Orange irait vers la pin 14 et le rouge vers la pin 15... ça ce n'est pas bon. 14 c'est Tx3, vous devez croiser Rx et Tx. --> mettre le rouge en 14 et mettre le Orange en 15 sur la MEGA.

J-M-L:
Je suppose que le fil blanc de gauche c'est le GND de votre alimentation 5V 2A et le jaune à droite les 5V de cette alimentation. on voit pas bien si le fil jaune passe à l'entrée de la diode qui par le fil rouge court je suppose va à Vcc du module.

Par contre, même si on ne voit pas les N°s de pin, vu la configuration votre fil rouge tendu serait Rx du module et votre fil orange serait le Tx du Module. Comme discuté pour le code, ils dioivent aller vers Serial3. ça à l'air d'être à peu près au bon endroit sur la MEGA, mais comme les fils ne se croisent pas le Orange irait vers la pin 14 et le rouge vers la pin 15... ça ce n'est pas bon. 14 c'est Tx3, vous devez croiser Rx et Tx. --> mettre le rouge en 14 et mettre le Orange en 15 sur la MEGA.

Vous avez tout juste, mais même quand j'inverse les fils courts orange et rouge, ca ne change rien. J'obtiens toujours la série de . (point) dans le moniteur série.

Electrof:
Vous avez tout juste, mais même quand j'inverse les fils courts orange et rouge, ca ne change rien. J'obtiens toujours la série de . (point) dans le moniteur série.

Si d'aventure sur un module "cheap" ils n'ont pas protégé Tx contre une entrée à 5V et simplement mis de quoi convertir ce qui rentre sur Rx en 5V vers le 3.3V attendu, vous avez potentiellement à nouveau flingué votre module...

sinon faut être patient, il se peut que l'auto-baud prenne assez longtemps.. avez vous attendu genre une minute?

avez vous essayé avec une autre valeur que 57600 dans mon code ? essayez 1200 , 2400, 4800, 9600, 19200, 38400...

Aussi essayez de charger le programme, ouvrir la console Arduino, couper le jus du module et le remette, fermer la console et la réouvrir. Ça vous assure d’avoir rebooté votre module pendant que les commandes AT sont entrain d’arriver

Tout à l'heure, au bout d'1min30, j'ai eu le message "GPRS Modem OK" et "Initialisation OK".
Mais rien d'autre.

ah ça c'est bon signe... une fois que vous avez cela, tapez "AT+CSQ" par exemple dans la ligne de la console série... vous êtes en prise directe avec le module là... vous pouvez donc envoyer des commandes AT

Sauf que quoi que je tape : AT ou AT+CSQ, ca n'affiche rien du tout...

Après avoir vu initialisation OK?

Oui apres avoir vu Initialisation OK

Si vous décommentez       // Serial.write((uint8_t) c); // si vous voulez voir ce qui arrive est-ce que vous voyez des choses?

Avez vous essayer de changé le paramètre de ligne dans la console.chez moi je suis sur LF et CR je crois.