GSM : Carte Siemens TC35

1°) Matériel :
* Une carte Arduino Leonardo,
* Une carte GSM Siemens TC 35 (http://www.sainsmart.com/arduino-compatibles-1/gps-gprs-gsm-module/siemens-tc35-sms-gsm-module-voice-adapter.html)
* Un bloc transformateur 5v DC

2°) Branchements : Il est nécessaire de raccorder la masse (GND) de la carte TC35 à la masse de la carte Arduino (fil jaune). Puis de raccorder le port TX de la TC35 (fil vert) à un port digital de la carte Arduino (ici le port 9) et de raccorder le port RX de la TC35 (fil bleu) au port digital (ici 10) de la carte Arduino. ATTENTION : pour la carte Leonardo pour le port RX seules les broches 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI) peuvent être utilisées. L’alimentation de la TC35 doit être de 5v DC, point central positif. Il est nécessaire d’allumer la carte TC35 en appuyant sur le bouton à gauche du port RS232, la led rouge clignotera alors lentement dans le cas où tout est ok (carte SIM valide). Colombes-20130606-00039

2°) Test d’envoi de SMS :
Remarques : le débit doit être de 9600 bauds entre la carte Arduino et la TC35, les commandes AT tapées sans espace. Le programme ci-dessous permet la saisie d’un message dans le moniteur série puis l’envoie.
 #include <SoftwareSerial.h>   
 #define rxPin 10  
 #define txPin 9  
 // set up a new serial port for Leonardo  
 SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);  
 char recu[150];   // Array for entering message  
 String message="";  //string we're sending  
 int i;   
 void setup()  
 {//--For Leonardo  
  Serial.begin(9600);  
  while (!Serial){   
    }  
 // set the data rate for the SoftwareSerial port  
  mySerial.begin(9600);  
   delay(5000);  
   Serial.println("Hello, tapez votre SMS en terminant par un point");  
 }  
 void loop()       
 {   
    i = 0 ;   
    while ( Serial.available()>0 )     
    {recu[i] = Serial.read();   
     message += recu[i];   
     i++;   
     //-- 46 is the Ascii code for "."   
     if (recu[i-1]==46)  
     {  
     Serial.println("Envoi du SMS...");  
     SendTextMessage();  
     ShowSerialData();  
     delay(1000);   
     Serial.println("\r"); //-- Carriage return  
     Serial.println("SMS parti !");   
     message="";  
     i=0;  
     }  
    }         
 }  
 ///SendTextMessage()  
 ///this function is to send a sms message  
 void SendTextMessage()  
 { mySerial.print("AT+CMGF=1\r");  //Because we want to send the SMS in text mode  
  delay(1000);  
  mySerial.print("AT+CMGS=\"+336xxxxxxxx\"\r");  
  delay(1000);  
  mySerial.println(message);  
  mySerial.print("\r");  
  delay(1000);  
  mySerial.println((char)26);//the ASCII code of the ctrl+z is 26  
  mySerial.println();  
 }  
 void ShowSerialData()  
 {  
  while(mySerial.available()!=0)  
   Serial.write(mySerial.read());  
 }  
Attention, pour la lecture des informations en provenance de la carte, il est nécessaire de modifier la taille du buffer de réception dans le ficher SoftwareSerial.h à la ligne #define _SS_MAX_RX_BUFF 1024 // RX buffer size (ici nous avons augmenté le buffer à 1k).
Exemple d’envoi de commandes AT à la carte et de lecture du résultat.
 #include <SoftwareSerial.h>  
 SoftwareSerial mySerial(10, 9);  
 char recu[150];   // Array for entering message  
 int i;   
 String message="";  
 void setup()  
 {//--For Leonardo  
  Serial.begin(9600);  
  while (!Serial){   
    }  
  mySerial.begin(9600);    
  delay(5000);  
  Serial.println("Started!");  
  Serial.println("Hello, tapez votre commande en terminant par un point");  
  //-- Choose SIM memory and show the SMS in MEMORY  
  //-> AT+CPMS="SM". //mySerial.println( "AT+CPMS=\"SM\"" );  
  //-- Ask for all the SMS  
  //-> AT+CMGL="ALL".// mySerial.println( "AT+CMGL=\"ALL\"" );  
  //-> AT+CMGR=2. // Read the 2nd message  
  //-> AT+CMGD=2. // Delete the 2nd message  
  //-> AT+CNMI=?. //-- Test received message  
 }  
 void loop()  
 {    
   i = 0 ;   
    while ( Serial.available()>0 )     
    {recu[i] = Serial.read();   
     if ((recu[i]!=46)&&(recu[i]!=13)&&(recu[i]!=10))  
       message += char(recu[i]);   
     i++;   
     if (recu[i-1]==46)  
     {  
     Serial.println("Envoi de la commande ["+message+"]");  
     SendCmdMessage();   
     ShowSerialData();  
     Serial.println("Commande finie,tapez votre commande en terminant par un point");   
     message="";  
     i=0;  
     }  
    }   
 }  
 void ShowSerialData()  
 {  
  while(mySerial.available()!=0)  
  {  
   Serial.print(char(mySerial.read()));  
  }  
 }  
 void SendCmdMessage()  
 { mySerial.println(message);  
  delay(1000);  
 }  
Test_Env_Cmd_AT
Allumage d’une LED dès réception d’un SMS puis effaçage du SMS :
 #include <SoftwareSerial.h>  
 SoftwareSerial mySerial(10, 9);  
 char recu[150];   // Array for entering message  
 int i;   
 int dp=0;  
 char c;  
 String message="";  
 String cmd="";  
 String cReturn="";  
 int nReturn=0;  
 int nPremier=0;  
 //--Pin of the LED to turn ON and OFF   
 int ledPin = 5;  
 void setup()  
 {//--For Leonardo  
  Serial.begin(9600);  
  while (!Serial){   
    }  
  mySerial.begin(9600);    
  delay(5000);  
  Serial.println("Started!");  
  Serial.println("Hello, Pour commencer taper Envoyer");  
  message="AT+CPMS=\"SM\"";  
     Serial.println("Envoi de la commande ["+message+"]");  
     SendCmdMessage();   
     ShowSerialData();   
     Serial.println(nReturn);   
     nPremier=nReturn;  
      pinMode( ledPin, OUTPUT );   
  digitalWrite( ledPin, LOW);  
  //-- Choose SIM memory and show the SMS in MEMORY  
  //-> AT+CPMS="SM". //mySerial.println( "AT+CPMS=\"SM\"" );  
  //-- Ask for all the SMS  
  //-> AT+CMGL="ALL".// mySerial.println( "AT+CMGL=\"ALL\"" );  
  //-> AT+CMGR=2. // Read the 2nd message  
  //-> AT+CMGD=2. // Delete the 2nd message  
  //-> AT+CNMI=?. //-- Test received message  
 }  
 void loop()  
 {    
    while ( Serial.available()>0 )     
    { message="AT+CPMS=\"SM\"";  
     SendCmdMessage();   
     ShowSerialData();  
     Serial.print("Nombre de SMS : ");  
     Serial.println(char(nReturn+48));  
     if (nReturn>nPremier)  
       {Serial.println("Nouveau SMS !");  
        //nPremier=nReturn-1;  
        Serial.print(nReturn);  
        Serial.print(" ");  
        Serial.println(nPremier);  
        digitalWrite( ledPin, HIGH);   
        delay(1000);  
        //--Read the nReturn message  
        message="";  
        message=nReturn+message;  
        message="AT+CMGR="+message;  
        Serial.println("Envoi de la commande ["+message+"]");  
        SendCmdMessage();   
        ShowSmsData();  
        delay(1000);  
        //--Delete the nReturn message  
        message="";  
        message=nReturn+message;  
        message="AT+CMGD="+message;   
        Serial.println("Envoi de la commande ["+message+"]");  
        SendCmdMessage();   
        ShowSmsData();  
        message="";  
       delay(1000);  
       digitalWrite( ledPin, LOW);  
       }  
     }  
 }  
 void ShowSerialData()  
 { cReturn="";  
  while(mySerial.available()!=0)  
  {  
   //Serial.print(char(mySerial.read()));  
   c=char(mySerial.read());  
   switch(dp){  
   case 1 :  
       if (c==44)///-- Acii code for Comma  
          dp=2;  
       else  
          cmd+=c;  
       break;  
   case 2 :  
       if (cmd!="")  
        { cmd.trim();  
         //Serial.println("Mem SMS ["+cmd+"]");  
         cReturn=cmd;  
         if (cReturn.length()==1)  
           {c=cReturn.charAt(0);  
           nReturn=c-0;  
           nReturn=nReturn-48;}  
          else  
           nReturn=0;  
        }  
       dp=0;  
       cmd="";  
       break;  
   default :  
       if (c==58) //-- Acii code for :  
        dp=1;  
       break;  
  }  
  }  
 }  
 void ShowSmsData()  
 {  
  while(mySerial.available()!=0)  
  {  
   //Serial.print(char(mySerial.read()));  
   c=char(mySerial.read());  
   switch(dp){  
   case 1 :  
       if (c==13)///-- Acii code for Return  
          dp=2;  
       else  
          cmd+=c;  
       break;  
   case 2 :  
       if (cmd!="")  
        Serial.println("Mem SMS ["+cmd+"]");  
       dp=0;  
       cmd="";  
       break;  
   default :  
       if (c==58) //-- Acii code for :  
        dp=1;  
       break;  
  }  
  }  
 }  
 void SendCmdMessage()  
 { mySerial.println(message);  
  delay(1000);  
 }   
Même programme mais exécutable sans PC, branchement carte Arduino et carte GSM sur le secteur après avoir déversé le programme dans la carte Arduino :
  //////////////////////////////////////////////////////  
  // Delete all SMS in SIM Memory then :  
  // Wait for SMS, if SMS=OK Light PIN 5  
  // if SMS=OFF light off PIN 5  
  // if SMS=? give a status (ON or OFF) of PIN 5  
  // Otherwise return to the SMS sender a message  
  // If the AT command as an error light PIN 3  
  // If the AT command is ok light PIN 4  
  ///////////////////////////////////////////////////////  
  #include <SoftwareSerial.h>   
  SoftwareSerial mySerial(10, 9);   
  int dp=0;   
  int i=0;  
  int dpLed=0;   
  char c;   
  String message="";   
  String Res="";   
  String TxtSms="";  
  String NumSms="";  
  String cReturn="";   
  int nReturn=0;   
  int nPremier=0;   
  //--Pin of the LEDs    
  int ledPinRel = 5; //-- Led Action Or Relay  
  int ledPinOk = 4; //-- Led OK  
  int ledPinErr = 3; //-- Led Error  
  void setup()   
  {  
  mySerial.begin(9600);    
  delay(5000);   
  //-- SMS in text mode  
  message="AT+CMGF=1";  
  SendCmdMessage();  
  ShowSerialData();   
  //-- Print storage status  
  message="AT+CPMS=\"SM\"";   
  SendCmdMessage();    
  ExtractSmsNumber();    
  //--Delete all the SMS  
  for (i=nReturn; i>0; i--)   
    { message="";   
     message=i+message;   
     message="AT+CMGD="+message;     
     SendCmdMessage();   
     ShowSerialData();  
    }  
  //-- Print storage status  
  message="AT+CPMS=\"SM\"";   
  SendCmdMessage();    
  ExtractSmsNumber();   
  nPremier=nReturn;   
  //-- Initialize LED PIN  
  pinMode( ledPinRel, OUTPUT );    
  digitalWrite( ledPinRel, LOW);   
  pinMode( ledPinErr, OUTPUT );    
  digitalWrite( ledPinErr, LOW);   
  pinMode( ledPinOk, OUTPUT );    
  digitalWrite( ledPinOk, HIGH);   
  }  
  void loop()   
  {    
   message="AT+CPMS=\"SM\"";   
   SendCmdMessage();  
   ExtractSmsNumber();    
   dp=0;   
   if (nReturn>nPremier)   
     {//--Read the nReturn message   
     message="";   
     message=nReturn+message;   
     message="AT+CMGR="+message;   
     SendCmdMessage();    
     ShowSmsData();  
     if (TxtSms=="ON")   
       dp=1;  
     if (TxtSms=="OFF")  
       dp=2;  
     if (TxtSms=="?")  
       dp=3;        
     switch (dp) {  
      case 1 :  
          {digitalWrite( ledPinRel, HIGH);    
          dpLed=1;  
          break;}  
      case 2 :  
          {digitalWrite( ledPinRel, LOW);    
          dpLed=0;  
          break;}  
      case 3 :  
          {if (dpLed==1)  
             message="La LED est ON";  
             else  
             message="La LED est OFF";          
           SendSms();   
           message="AT+CMGD=1";     
           SendCmdMessage();    
           ShowSerialData();   
           break;   
           }   
       default :      
         {message="Erreur, tapez ON, OFF ou ?, merci !";  
          SendSms();  
          message="AT+CMGD=1";     
          SendCmdMessage();    
          ShowSerialData();  
          break;}  
     }  
     //--Delete the nReturn message  
     message="";   
     message=nReturn+message;   
     message="AT+CMGD="+message;     
     SendCmdMessage();    
     ShowSerialData();   
     delay(1000);  
     }    
  }   
  void ExtractSmsNumber()   
  {cReturn="";  
  Res="";  
  nReturn=1;  
  dp=0;   
  while(mySerial.available()!=0)   
  {   
   c=char(mySerial.read());   
   //if ((c!=13) && (c!=10))  
   //  Res+=c;  
   switch(dp){   
   case 1 :   
     if (c==44)///-- Acii code for Comma   
      dp=2;   
     else   
      Res+=c;   
     break;   
   case 2 :   
     if (Res!="")   
     { Res.trim();    
      cReturn=Res;   
      if (cReturn.length()==1)   
       {c=cReturn.charAt(0);   
       nReturn=c-0;   
       nReturn=nReturn-48;}   
      else   
       nReturn=0;   
     }   
     dp=0;   
     Res="";   
     break;   
   default :   
     if (c==58) //-- Acii code for :   
     dp=1;   
     break;   
  }   
  }  
  Res.toUpperCase();  
  if (Res.indexOf("OK")>0)  
      {digitalWrite( ledPinOk, HIGH);   
       digitalWrite( ledPinErr, LOW);  
      }  
  if (Res.indexOf("ERROR")>0)  
      {digitalWrite( ledPinOk, LOW);   
       digitalWrite( ledPinErr, HIGH);   
      }  
  }    
 void ShowSmsData()   
 //-- Read the sender number (NumSms) and the text message (TxtSms)   
 //-- The return code format is : [+CMGR: "REC READ","+336xxxxxxxx",,"13/06/10,22:18:35+08"<CR><LF>Message<CR>]  
 {dp=0;  
  TxtSms="";   
  NumSms="";  
  Res="";  
  while(mySerial.available()!=0)   
  {   
   c=char(mySerial.read());  
   if ((c!=13) && (c!=10))  
    Res+=c;  
   if ((c==44) && (dp==0))///-- 44 Ascii code for ','   
    {//-- Entering Phone Number  
     c=char(mySerial.read()); //-- Reading '"'  
     c=char(mySerial.read());  
     dp=1;}  
   if ((c==34) && (dp==1))///-- 34 Ascii code for '"'   
    {//-- Leaving Phone Number  
     dp=2;}      
   if ((c==13) && (dp==2))///-- 13 Ascii code for <CR>   
    {//-- Entering Message zone  
     c=char(mySerial.read()); //-- Reading <LF>  
     dp=3;}  
   if ((c==13) && (dp==3))///-- 13 Ascii code for <CR>   
    {//-- Leaving Message zone  
     dp=4;}  
   switch(dp){   
   case 1 :  
       NumSms+=c;   
       break;   
   case 3 :   
       TxtSms+=c;  
       break;  
      }  
  }  
 TxtSms.toUpperCase();  
 TxtSms.trim();  
 Res.toUpperCase();  
 if (Res.indexOf("OK")>0)  
      {digitalWrite( ledPinOk, HIGH);   
       digitalWrite( ledPinErr, LOW);  
      }  
 if (Res.indexOf("ERROR")>0)  
      {digitalWrite( ledPinOk, LOW);   
       digitalWrite( ledPinErr, HIGH);   
      }  
 }   
 void SendSms()  
  {   
  mySerial.println("AT+CMGS="+NumSms);   
  delay(1000);   
  mySerial.println(message);   
  delay(1000);   
  mySerial.println((char)26);//the ASCII code of the ctrl+z is 26   
  delay(1000);   
  ShowSerialData();   
  delay(1000);   
  }  
  void SendCmdMessage()   
  {  
  mySerial.println(message);   
  delay(1000);   
  }   
  void ShowSerialData()   
  {Res="";  
  while(mySerial.available()!=0)  
  {c=char(mySerial.read());   
   if ((c!=13) && (c!=10))  
    Res+=c;  
  }  
   Res.toUpperCase();   
   if (Res.indexOf("OK")>0)  
      {digitalWrite( ledPinOk, HIGH);   
       digitalWrite( ledPinErr, LOW);  
      }  
   if (Res.indexOf("ERROR")>0)  
      {digitalWrite( ledPinOk, LOW);   
       digitalWrite( ledPinErr, HIGH);   
      }  
  }   
18 comments on “GSM : Carte Siemens TC35
  1. Stéphane dit :

    Merci pour ce tuto il va m’aider à exploiter mon TC35.
    As-tu une astuce pour commander le micro-switch "d’allumage" logiciellement? A priori c’est un contact masse sur IGT (voir JP3) qui déclenche l’initialisation ?
    On doit aussi pouvoir récupérer la réception d’un appel ? RING0 sur ce même JP3.

  2. Marc Fleury dit :

    Peut on alimenter la carte TC35 par la carte Arduino Uno ?

  3. Stéphane dit :

    Non mais tu peux faire l’inverse, alimenter L’arduino via les sorties disponibles sur la TC35

  4. Marc Fleury dit :

    Je tiens à remercier l’auteur de ce tuto et signaler :

    1) qu’il vaut mieux utiliser un adapteur de niveaux logiques car le HIGH de l’arduino est à 5V et celui de la TC35 à 2V8. La TC35 risque de ne pas aimer sans ce petit circuit.

    2) J’ai traversé pas mal de galères de néophytes avant d’atteindre le succès; il n’est peut-être pas inutile de faire partager aux béotiens de mon acabit quelques évidences qui ne le sont devenues pour moi qu’après bien des errances :
    a) bien raccorder TX à TX et RX à RX, sans croiser
    b) désactiver le PIN de la SIM, sinon la TC35 ne clignote pas comme il faut (flash brefs, longues pauses) et ne marche pas
    c) s’il a plus de 9 messages sur la SIM, il faut modifier le code ci-dessus pour qu’il parvienne à vider la carte.

  5. cyril dit :

    J’ai moi même cette carte mais j’ai une question: Si on envoi a cette carte AT ou ATI est ce qu’elle répond "OK" comme indiqué dans la doc? Quel est le débit du port serie par defaut?

    En gros je n’arrive pas a lui faire dire autre chose que error au bout d’un moment, lorsque j’envois les commandes pour envoyer un sms directement depuis mon terminal.

    Lorsque la sim est en place j’ai au démarrage un clignotement regulier toutes les secondes puis un clignotement bref mais plus lent.

    J’ai evidement enlevé la demande du code sim (depuis un autre portable) mais rien n’y fait, une idée?

  6. cyril dit :

    Ma carte ne répond pas ok, donc déja un souci à ce niveau, est ce qu’elle répond ok si la carte sim n’est pas présente? Je suspecte peut etre ma carte sim free. Enfin je sais pas trop…

  7. cyril dit :

    J’ai un peu avancé, je reçoit bien les ok lorsque j’envois les commande AT, j’ai testé votre 1er programme mais je n’obtiens pas d’envoi de sms, malgré le message suivant dans le terminal série :

    Hello, tapez votre SMS en terminant par un point
    Envoi du SMS…
    AT+CMGF=1

    OK
    AT+CMGS="06myphone"

    > test
    test.

    SMS parti !
    Envoi du SMS…

    Une idée?

  8. cyril dit :

    Apparemment ça ne fonctionne pas avec les sim de chez free mais ok chez virgin mobile.

    Curieux

  9. Stéphane dit :

    Je n’ai pas de problème avec la carte SIM Free pour envoyer des SMS.
    As-tu supprimé le code pin?
    Il faut respecter l’ordre des commandes AT
    et le format du numéro de téléphone "+336XXXXXXXX"
    Tu retrouveras le pendant de cet article ici

    http://www.sainsmart.com/siemens-tc35-sms-gsm-module-voice-adapter.html

  10. AdminDroid dit :

    Comme le précise Stéphane, cela fonctionne bien avec une sim Free et la commande d’envoi doit être "AT+CMGS=\"+336xxxxxxxx\"\r"

  11. cyril dit :

    Pour ceux qui serais intéressée le problème venait du numéro de centre de message qui n’était pas le bon sur 2 cartes sim free dont je disposais, une fois modifié c’est ok.

    Personnellement j’utilise le logiciel sscom32e que le vendeur m’a proposé qui gére bien la liaison ce qui ne semble pas être le cas de l’hyperterminal de windows, ou du terminal fournis dans le compileur ccs et même le terminal du logiciel arduino ne permet pas d’envoyer le code de fin en hexa 1A qui permet de valider la fin du message.

    Je suis assez étonné de ne pas pouvoir utiliser l’hyperterminal, je n’obtiens pas de retour lorsque j’envoi at

  12. cyril dit :

    Stéphane> Merci je viens de lire ton lien, et effectivement les problèmes que j’ai rencontré avec mon terminal sont décrit…En gros personne ne semble utiliser l’hyperterminal qui semble buggé.

  13. Marc Fleury dit :

    J’ai un problème de microphone:
    lorsque je décroche (avec la commande ATA) un appel entrant, j’ai le son sur le jack AUD du "voice adapter", mais le microphone ne fonctionne pas. J’ai essayé sans succès de brancher un microphone sur le jack MIC, et également d’utiliser un kit piéton avec un jack 4 pôles branché sur la prise AUD. J’ai essayé aussi de bidouiller avec des commandes AT^SNFS et AT^SAIC, toujours en vain.
    Quelqu’un a-t-il une solution?

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Articles récents
Commentaires récents
There are no public comments available to display.
Archives
Catégories
Suivre

Recevez les nouvelles publications par mail.

%d bloggers like this: