Préparation d'une librairie pour le GSM/GPRS de GOF

Cela fait quelques-mois que le GSM/GPRS shield de GeekOnFire (GOF pour les intimes) est disponible chez MC Hobby.
GSM/GPRS shield de GOF pour Arduino
Disponible chez MC Hobby

Même s'il est bien documenté (voir notre wiki) et les exemples parfaitement fonctionnels, l'utilisation d'un tel module dans des projets peut réclame un effort de programmation non négligeable.

Partant de ce constat, et ayant nous même des projets (localisation par SMS, contrôle de température et activation d'une chaudière à distance, ouverture de porte à distance, etc), nous avons décidé d'essayer de mettre en place une librairie.

Le projet GoGprs
Actuellement en cours d'écriture, GoGprs est une classe (et futur libraire) qui permettra de contrôler le GPRS de GOF.
Dans l'état actuel de nos travaux, la librairie est capable:
  • De détecter si le shield est disponible (isReady)
  • De se connecter sur le Réseaux GSM (en fournissant automatiquement le code PIN à module SIM900)
  • De savoir si l'on est connecté sur le réseau mobile (isCallReady)
  • De redémarrer le programme Arduino à chaud.
    Après un "reset" du programme Arduino, la fonction isCallReady sait vérifier l'état du Réseau mobile. Le programme se rendra alors compte que le GPRS était déjà connecté et il ne sera donc pas nécessaire de l'éteindre et le rallumer :-)
  • De lire le numéro IMEI (identification)
  • D'envoyer des SMS
  • De recevoir des SMS
    - Sur base de notification spontanée.
    - Texte limité à 40 caractères, suffisant pour envoyer un ordre par téléphone.
Quelques exemples
Nos efforts commencent à porter leurs fruits, voici le temps de partager quelques exemples... et d'avoir un premier retour d'impressions.

Ce premier exemple attend simplement la réception d'un SMS et en envoi le contenu vers le moniteur série

/* ------------------------------
       Main Routines
   ------------------------------ */
GoGprs gsm = GoGprs();

void setup() {
  Serial.begin(19200); // Establish conection with IDE's Serial Monitor
  
  // Init communication with GSM/GPRS shield (on pin 7 and 8)
  gsm.begin("1234");// Sim card pinCode
}   

void loop() {
  gsm.execute();
  if( gsm.isCallReady() ) {
    
    if( gsm.hasSms() ){
      Serial.println( gsm.smsText() );
      Serial.println( gsm.smsCallee() );
      gsm.clearSms(); // reset the reception of the last SMS
    }
    else
      Serial.println( "no SMS" );
  }
  delay(500);
}

Simple non?
Ce second exemple envoi un message SMS (puis arrête l'exécution du programme)

/* ------------------------------
       Main Routines
   ------------------------------ */
GoGprs gsm = GoGprs();

void setup() {
  Serial.begin(19200); // Establish conection with IDE's Serial Monitor
  
  // Init communication with GSM/GPRS shield (on pin 7 and 8)
  gsm.begin("1234");// Sim card pinCode
}   

void loop() {
  gsm.execute();
  /* Send a SMS */
  if( gsm.isCallReady() ){
    if( gsm.sendSms( "+32477665544", "GOF GPRS Shield is Great!" ) ) {
      Serial.println( "SMS Send" );
    }
    else {
      Serial.println( "SMS not sent!" );
    }
    // Avoids the scketch to continuously send sms.
    Serial.println( "execution stopped" );
    while( true ) ;
  } 
  delay(500);
}


Ce dernier exemple, issus de notre développement en cours montre comment:
  1. Créer la classe
  2. Fournir le code PIN
  3. Détecter l'activation/disponibilité du réseau
  4. Attendre l'arrivée d'un SMS
  5. Renvoyer un SMS automatiquement (avec un message)

/* ------------------------------
       Main Routines
   ------------------------------ */
GoGprs gsm = GoGprs();

void setup() {
  Serial.begin(19200); // Establish conection with IDE's Serial Monitor
  
  // Init communication with GSM/GPRS shield (on pin 7 and 8)
  gsm.begin("1234");// Sim card pinCode
}   

void loop() {
  gsm.execute();
  /* Receive SMS and resend message to callee (with additionnal text) */
  if( gsm.isCallReady() ){
    if( gsm.hasSms() ) {
      String phoneNr = String( gsm.smsCallee() );
      String msg = String( "You said "+gsm.smsText() );
      gsm.clearSms();
      if( gsm.sendSms( phoneNr, msg ) )
        Serial.println( "Successfully replied "+msg+" to "+phoneNr );
      else 
        Serial.println( "Reply "+msg+" to "+phoneNr+ "did failed!" );
    }
  }
  
  delay(500);
}


19 commentaires:

  1. Bonjour

    J'ai reçu le shield gprs de chez seedstudio, il est légèrement différent de celui que vous avez en photo, l'antenne n'est pas placé au même endroit, et 2/3 autre modif...
    J'ai essayé de tester votre programme de commande SMS (l'ancien post) mais sans succès... il ne se connecte même pas au shield...
    Avec un arduino UNO >1.0 et librairie softwareserial.h

    Avez vous une idée d'ou cela peut provenir??
    Avez vous un lien vers votre librairie GSM pour que je puisse la tester sur ce shield pour voir si cela fonctionne mieux??

    Merci!
    Cordialement

    RépondreSupprimer
    Réponses
    1. Est-ce que votre shield Seedstudio utilise un SIM-900?
      Utilise t'il une connexion série pour communiquer avec Arduino?
      Est-ce qu'il utilise les broche 7 & 8 pour communiquer? (car c'est celles utilisées par notre shield et celle utilisée par nos programmes de démo).
      Quel est le débit utilisé par votre shield SeedStudio? (notre shield utilise une communication à 19200 bauds... votre shield ne serait-il pas à 9600 bauds?)
      La librairie est toujours en cours d'élaboration, elle est basée sur nos codes d'exemples.
      Si nos codes d'exemple ne fonctionne pas, il n'y absolument aucune chance que notre librairie le fasse.

      Je vous propose de faire fonctionner le programme de démo "Serial Relay".
      Si vous arrivé à le mettre sur les rails et a utiliser quelques-unes des commandes AT que nous avons décris... alors vous serez sur la bonne voie :-)
      Le plus important à ce stade est d'établir la communication avec votre shield Seedstudio.

      Bien à vous
      Dominique

      Supprimer
  2. Bonjour merci tout d'abord pour votre réponse rapide...
    Pour répondre..
    Le shield de chez seeestudio est quasiment le même... voir wiki ici : http://www.seeedstudio.com/wiki/index.php?title=GPRS_Shield_v0.9b
    Il utilise bien une liaison série la même que le votre, et il accepte bien un débit à 19200, car dans le wiki il y a bien des exemples avec ce débit...
    Il utilise bien les broche 7,8 par défaut via le jumper...

    En effet il faut que j'essaye d'abord d'établir une connexion avec le shield...
    Cordialement

    RépondreSupprimer
  3. Sinon ou est ce que l'on peut télécharger votre librairie, le projet est super intéressant !

    RépondreSupprimer
  4. Bon... même en essayant juste la démo Serial Relay, il ne se passe rien...
    Est ce du au fait que j'alimente le shield gsm via l'arduino et une connexion USB..??

    RépondreSupprimer
  5. OULA ! lorsque j'ai éteint j'ai eu un NORMAL POWER DOWN
    étrange cela ne me l'a fait qu'une fois, je n'arrive pas à le reproduire...

    RépondreSupprimer
  6. En fait cela le fait lorsque j'envoi des commandes AT du style AT+IPR=?
    lorsque je ne fait rien il ne le marque pas
    deplus, je n'ai pas de réponse aux commandes AT, faut /r à la fin???
    merci

    RépondreSupprimer
  7. OUF !! c'est bon j'ai bien un retour du shield gsm !!!
    il fallait que je coche l'option retour chariot sur le moniteur série..
    donc j'arrive bien à parler au shield gsm avec le moniteur série, mais pas encore dans un programme, est du à ce retour chariot???

    RépondreSupprimer
  8. Voila en mettant println je peut parler au module GSM correctement...
    Par contre au démarrage tant que je ne lui passe pas une commande AT, il ne se passe rien, pas de RDY, mais les commandes AT passe bien ensuite, on dirait qu'il ne connait pas le débit au début, puis une fois que je lui ai envoyé une commande avec un débit fixe, là il le reconnait et s'adapte..
    ce qui fait qu'au débt au démarrage j'ai l'absence du RDY et je n'ai que des caractères spéciaux...

    Si vous avez la librairie de dispo, je serais curieux de la tester...
    cordialement

    RépondreSupprimer
    Réponses
    1. Super content de voir que les choses ont bien avancées pour vous.

      Sur notre SIM900, le module à été pre-configurer par GOF pour le débit choisit (il existe des commandes AT pour sauver le débit sélectionné). J'ai lu au détour d'une "App Note" sur le SIM900 qu'il était préférable de fixer le débit plutôt que de le laisser en mode AUTO. Si vous fixez le débit ne dépassez surtout pas 19200 bauds! Seul un PC pourrait suivre un tel débit et pourrait vous permettre de rectifier le tir.

      Pour avoir le RDY et les autres messages du genre, il faut aussi configurer le module pour qu'il produise ces messages dit "non sollicités". GOF a configuré le SIM900 en ce sens.
      Je vous propose de vous renseigner sur la commande AT+CREG=1 , il me semble qu'elle concerne la configuration des notifications spontanées (à vérifier).

      Supprimer
  9. Merci pour votre compliment sur le code proposé, cela fait toujours plaisir.

    Concernant la librairie, elle est toujours à l'état de coding (de quoi construire la librairie mais pas encore une librairie).
    Elle n'est pas encore en état livrable (même pour une Beta vilaine et méchante).

    Je ne vais malheureusement pas pouvoir beaucoup y travailler cette semaine car je dois préparer la réception des Raspberry Pi pour MC Hobby (www.mchobby.be) ainsi qu'un module relais 220V/300 watt.

    Par contre, je n'hésiterais pas à annoncer la sortie de la Beta dès qu'elle est prête.

    NB: Au fait, je trouve que vous vous êtes super bien sorti. J'ai été impressionné par la quantité des commentaires que vous avez posté :-).
    N'hésitez pas à partager vos découvertes.

    RépondreSupprimer
    Réponses
    1. Ok merci pour toutes ces infos... !
      Je vais donc essayer de configurer en mode AUTO, et également pour les messages non sollicités, avez vous une idée des commandes? ou un site sur lequel c'est bien expliqué...?
      Une fois ceci fait logiquement cela doit bien se déroulé...
      Je vais quand même continuer mes tests, mais cette fois ci avec une carte SIM pour voir les commandes AT pour la connexion au réseau mobile.

      J'attends donc votre Beta avec impatiente

      Merci pour votre compliment! j'ai un petit peu spammé vos commentaires... :)
      Je prépare en fait une passerelle SMS pour ma domotique, avec un shield Ethernet, que j'ai d'ailleurs fini de configurer, et je m'attaque donc à la partie SMS...
      J'ai d'ailleurs remarqué qu'en connectant les 2 shield, le shield Ethernet n'a pas assez de tension lorsqu'il est alimenté via l'USB, il faudra que je prévois une alimentation externe...

      A voir sur :
      http://ma-maison-domotique.blogspot.fr/

      PS: Je mettrais un lien vers votre blog lorsque j'écrirais l'article concernant les SMS pour vous remercier de votre aide !

      A bientôt! Entre blogger ! :)
      Cordialement

      Supprimer
    2. === Commande AT ===
      Accessible via la fiche produit du shield GSM/GPRS GOF dispo chez MC Hobby.
      Voir section tutoriel du lien:
      http://mchobby.be/PrestaShop/product.php?id_product=63

      Supprimer
  10. === Auto Baud ===
    Je crains m'être mal fait comprendre.
    Le shield NE DOIT PAS ETRE EN MODE AUTO BAUD... c'est pour cela qu'il ne répond pas bien au début... il essaye de détecter la vitesse de communication.
    Il est préférable de fixer la vitesse (en ne dépassant surtout pas 19200 bauds).

    === Lien vers le Blog ===
    Merci.
    Un lien vers MCHobby serait vraiment sympa aussi.

    === Alimentation ===
    Au moment de la connexion sur réseau mobile, et dépendant de la position des antennes les plus proches, SIM900 peu avoir besoin d'un point de courant jusqu'à 2 ampères. S'il a une capacité pour accumuler le besoin d'énergie, le régulateur d'Arduino (250mA) est trop limité et n'est pas capable de "recharger" assez vite.
    Symptome: Le Shield se déconnecte du réseau mobile juste avant ou juste après le "Call Ready".
    Une alimentation externe (1A en 9 ou 12v) est vivement recommandée.

    RépondreSupprimer
  11. Merci

    pour l'auto baud c'est moi qui me suis mal exprimé, j'ai dit le contraire de ce que je voulais dire...

    Pour le lien pas de soucis!

    Je te tiens au courant!

    RépondreSupprimer
  12. Salut!
    C'est bon tout fonction, envoi et réception de SMS...avec gestion de l'ordre venant d'un SMS...
    J'ai du un peu modifier le code, mais rien de bien méchant, je le publierais sur l'article dans mon blog...
    Merci pour ton aide!
    Tiens nous au courant pour tas librairie ! j'en ferais part sur mon blog
    A++

    RépondreSupprimer
  13. Voila ce qu'on appelle un VRAI service client :-)
    Le matos ne viens pas de chez MC Hobby.
    Le fournisseur (SeeedStudio) non plus.
    Mais il y a quand même du support :-)

    Algeroth:
    Merci de préserver l'entête d'origine du code en le dupliquant et republiant.
    Je me demande aussi quels ont étés les modifs nécessaires (je suis joignable via l'icone e-mail de mchobby).

    Bonne continuation

    RépondreSupprimer
  14. En fait le module n'envoi pas de commande non sollicité, du coup c'est à nous de le sollicité, du coup le code change un peu..
    J'ai également fait quelques adaptation au besoin
    Pas de soucis pour l'entête

    A sinon sur une de vos doc vous mettez que le SMS est envoyé par GPRS et entraine un surcout..?? avec un forfait sms illimité mais sans internet, ça marchera quand même???

    RépondreSupprimer
  15. Concernant le cout: je serais bien en peine de vous répondre.
    Il n'y a pas de connexion internet car les commandes AT correspondantes ne sont pas utilisées... donc l'envoi de SMS devrait passer par le "reseau normal".
    Par contre j'ai noté un surcout de facturation de mes SMS envoyé par notre GPRS. Cela dépend de l'abonnement mais aussi du fournisseur de service.
    Le mieux est encore d'essayer.

    RépondreSupprimer