Hacer llamada de voz

Este programa conecta una llamada de voz de su escudo y Arduino GSM o Genuino a un número de teléfono a distancia introducido a través del monitor del puerto serie. Tendrá que conectar un altavoz y un micrófono para escuchar el teléfono conectado y transmitir su voz.

Hardware necesitado

Placa Arduino o Genuino
Escudo GSM/GPRS  Telefonica + Arduino
Micrófono y altavoz conectados al escudo GSM
Tarjeta SIM

Circuito


Código

En primer lugar, importar la biblioteca de GSM

#include <GSM.h>

Las tarjetas SIM pueden tener un número PIN que desbloquea su funcionalidad. Definir el PIN de su tarjeta SIM. Si su tarjeta SIM no tiene PIN, puede dejarlo en blanco:

#define PINNUMBER ""

 Inicializar instancias de las clases que va a utilizar. Va a necesitar las  clases GSM y GSMVoiceCall.

GSM gsmAccess;
GSMVoiceCall vcs;

Crear algunas variables para almacenar el número de teléfono al que desea llamar:

String remoteNumber = "";
char charbuffer[20];

En setup, abra una conexión serie al ordenador. Vamos a usar esto para enviar un número de teléfono para el Arduino. Después de abrir la conexión, enviar un mensaje al monitor serie que indica que el programa ha comenzado .: 

void setup(){
   Serial.begin(9600);
   Serial.println("Hacer una llamada de voz");

Crear una variable local para realizar un seguimiento del estado de la conexión. Vamos a usar esto para mantener el programa funcinando hasta que la tarjeta SIM esté conectada a la red:

boolean notConnected = true;


Conectarse a la red llamando a gsmAccess.begin (). Se necesita el PIN de la tarjeta SIM como argumento. Al colocar esto dentro de un bucle while (), se puede comprobar continuamente el estado de la conexión. Cuando el módem se conecte, gsmAccess () devolverá GSM_READY. Use esto como una bandera para establecer la variable notConnected a true o false. Una vez conectado, se ejecutará el resto de la configuración .

while(notConnected)
   {
     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
       notConnected = false;
     else
     {
       Serial.println("Not connected");
       delay(1000);
     }
   }

Finalizar la configuración con un poco de información por el monitor serie.

Serial.println("GSM inicializado.");
   Serial.println("Introduzca el numero de telefono a llamar.");
 }

loop aceptará bytes entrantes desde el monitor serie y conectará la llamada de voz.

En primer lugar, comprobar la memoria intermedia serie para ver si hay alguna información esperando a ser leída. Si la hay, almacenarla en una variable local:

void loop()
 {
   while (Serial.available() > 0)
   {
     char inChar = Serial.read();

Si el búfer contiene un carácter de nueva línea, comprobar para ver si el número introducido tiene menos de 20 dígitos de longitud (en teoría, nunca será capaz de marcar un número con más dígitos que eso).

if (inChar == '\n')
     {
       if (remoteNumber.length() < 20)
       {

Imprimir el número al que está llamando en el monitor serie.

Serial.print("Llamando a : ");
         Serial.println(remoteNumber);
         Serial.println();


El número a llamar se ha almacenado en la cadena denominada remoteNumber. La función voiceCall () necesita una matriz de caracteres. Copiar la cadena a la matriz denominada charBuffer.

remoteNumber.toCharArray(charbuffer, 20);


Para realizar la llamada, utilizar vcs.voiceCall (), pasándole el número al que desea llamar. VoiceCall () devuelve el estado de la llamada; un 1 significa que está conectado. Puede comprobar el estado de la conexión con getvoiceCallStatus ().Para desconectar la llamada, enviar un carácter de nueva línea para disparar hangCall ().

if(vcs.voiceCall(charbuffer))
         {
           Serial.println("Call Established. Enter line to end");
           while(Serial.read()!='\n' && (vcs.getvoiceCallStatus()==TALKING));        
           vcs.hangCall();
         }

Una vez que se ha completado la llamada, borrar la variable que almacena el número de teléfono:

Serial.println("Llamada finalizada");
         remoteNumber="";
         Serial.println("Introduzca el numero de telefono a llamarl.");
       }

Si el número que ha introducido en el monitor serie es más de 20 dígitos, borrar la cadena remoteNumber a distancia y empezar de nuevo:

else
       {
         Serial.println("Demasiado largo para un número de teléfono. Me olvido de el");
         remoteNumber = "";
       }
     }

Al leer la información desde el monitor  seerie, si el carácter entrante no es un retorno de carro o salto de línea, añadirlo a la cadena remoteNumber y cerrar el bucle.


else
    {
      // añade el último carácter para enviar el mensaje:
      if(inChar!='\r')
        remoteNumber += inChar;
    }
  } 
}

Una vez que se carga el código, abrir el monitor serie. Cuando aparezca el mensaje "Introducir número de teléfono a llamar", 
escriba un número de teléfono y pulse "return". Asegúrese de que el monitor serie está configurado para enviar solamente un 
carácter de retorno como nueva línea.
El programa completo se encuentra a continuación.


// Hacer llamada de voz

 //Este programa, para el escudo Arduino GSM, pone una llamada de voz
 //con un número de teléfono remoto que se introduce a través del 
 //monitor del puerto serie. 

 //Para hacerlo funcionar, abrir el monitor serie, y cuando vea el mensaje
 //READY, escriba un número de teléfono. Asegúrese de que el monitor serie 
 //está configurado para enviar una nueva línea en el momento en que se pulsa return. 

 //Circuito: 
 //* Escudo GSM 
 //* Circuito de voz. 

 //Sin circuito de voz de la llamada enviará ni recibirá ningún sonido 

 //creado en Marzo de 2012 por Javier Zorzano 

 //Este ejemplo es de dominio público. 

 // bibliotecas

 #include <GSM.h>

 // Numero de PIN 
 #define PINNUMBER ""

 // initializa la instancia biblioteca
 GSM gsmAccess; // incluye un parametro 'true' para permitir la depuracion
 GSMVoiceCall vcs;

 String remoteNumber = "";  // el numero al que desea llamar
 char charbuffer[20];

 void setup() {
  // initializa la comunicacion serie y espera a que el puerto se abra:
  Serial.begin(9600);

  while (!Serial) {
     ; // espera a que el puerto serie se conecte. Solo necadario para USB nativo

  }

  Serial.println("Hacer llamada de voz");

  // estado de la conexion
  boolean notConnected = true;

  // Inicia el escudo GSM 
  // Si su tarjeta SIM tiene PIN, pasarlo como parametro de begin() entre comillas
  while (notConnected) {

     if (gsmAccess.begin(PINNUMBER) == GSM_READY) 
       notConnected = false;
     } else {
       Serial.println("No conectado");
       delay(1000);
     }
  }

  Serial.println("GSM inicializado.");
  Serial.println("Introduzca el numero de telefono a llamar.");
 }

 void loop() {
  // añadir cualquier caracter entrante a la Casena:
  while (Serial.available() > 0) {
     char inChar = Serial.read();

     // si se trata de una nueva línea, significa que usted debe hacer la llamada:
     if (inChar == '\n') {

       //asegurese de que el numero no es demasiado largo:
       if (remoteNumber.length() < 20) {

         //conozca a que usuario está llamando:
         Serial.print("Llamando a : ");
         Serial.println(remoteNumber);
         Serial.println();

         // Llamada al numero remoto
         remoteNumber.toCharArray(charbuffer, 20);

         // Compruebe si el receptor ha recogido la llamada
         if (vcs.voiceCall(charbuffer)) {
           Serial.println("Llamada establecida. Introduzca línea para terminar");

           //Esperar a alguna entrada de la línea
           while (Serial.read() != '\n' && (vcs.getvoiceCallStatus() == TALKING));
           // Y colgar
           vcs.hangCall();
         }

         Serial.println("Llamada finalizada");
         remoteNumber = "";
         Serial.println("Introduzca el numero de telefono a llamar.");
       } else {
         Serial.println("Demasiado largo para un número de teléfono. Me olvido de el");
         remoteNumber = "";
       }

     } else {
       // añada el último carácter al mensaje que desea enviar:
       if (inChar != '\r') {
         remoteNumber += inChar;
       }
     }
  }
 }

 

1 comentario:

  1. ¿Como puedo implementar un archivo de audio en el circuito de llamada??

    ResponderEliminar