Conectando Arduino con un telefono móvil

Una de las principales motivaciones para la adición de código asincrónico apoyo del CDC para rev.2.0 de la Biblioteca Host USB iba a ser capaz de utilizar teléfonos celulares en los proyectos de Arduino – establecer un intercambio de datos simple a través de SMS, tomar fotos o conectarse a Internet. Los teléfonos de segunda mano son baratas pero muy capaz. Además, M2M (máquina a máquina) tarjetas SIM comienzan en $ 4 – $ 6/mes, algunos incluso permiten gratis SMS entrantes. Todo lo que hace que un teléfono celular es una opción atractiva para los proyectos de comunicación aficionados. En este post, voy a estar hablando de fundamentos de la telefonía celular con puerto de datos y comandos AT. También voy a presentar un bosquejo simple emulador de terminal – para usar el código que se necesita una placa Arduino, USB Host Shield, así como USB Host Shield 2.0 biblioteca.
Modernos (<10 años) teléfonos han interface estándar de chips GSM implementado y accesible a través de la llamada «puerto de datos». La más antigua de teléfonos implementar nivel TTL interfaz serie asíncrono por medio de la «costumbre» cable de datos USB, que es sólo conector propietario en un extremo, un conector estándar USB en el otro extremo, y USB-to-serial chip convertidor (casi siempre Prolific PL2303) entre ellos. Entrada más reciente teléfonos celulares tienen USB a serie convertidor integrado. Motorola teléfonos por lo general terminará puerto de datos estándar mini-USB, otros, como Samsung y Sony Ericsson, utilice cable de propiedad. El convertidor de USB a serie en estos teléfonos es casi siempre de tipo estándar CDC ACM.Muchas de las funciones del teléfono que se puede acceder por los comandos AT, similares a los comandos usados para controlar módems Hayes teléfono. Comandos estándar GSM están definidos en 3GPP TS 07.07 (busque la última versión, que es 7.8.0). Fabricantes de teléfonos celulares también definir sus propios comandos AT. En la documentación de los comandos AT generalmente se presentan en mayúsculas, sin embargo, la mayoría de los teléfonos aceptar minúsculas igual de bien. Un comando irá seguida de CR, LF (generalmente la tecla Enter). Si un comando es aceptado, bien sea devuelto, junto con la respuesta. Si el comando no es reconocido, se devuelve un error. Algunas órdenes serán aceptadas en ciertos estados teléfono y rechazado en otros.

 

Hay varias variantes de la invocación de cada comando:

Ejecute Esta variante se utiliza para los comandos que no requieren parámetros. El formato es ATcommand. Por ejemplo, el comando siguiente devuelve fuente de energía y el nivel de carga de la batería:

AT + CBC
+ CBC: 2,66

Aceptar

La respuesta significa que un teléfono se alimenta de la fuente de alimentación externa (2) y el nivel de la batería es 66 por ciento.

Prueba Esta variante se utiliza para parámetros de consulta y sus valores para el comando. El formato es ATcommand =?.

AT + CIND =?
+ CIND: («Voice
Aceptar

Este comando muestra todos los indicadores disponibles en la pantalla del teléfono, y sus posibles valores.

Obtenga Esta variante se utiliza para consultar la configuración actual para el comando. El formato es ATcommand?.

AT + CIND?
+ CIND: 0,1,0,0,4,0,0
Aceptar

En comparación con la producción de la anterior «Test» variante de la misma orden, podemos ver que el «Servicio» indicador en la pantalla del teléfono está encendido y «señal» se encuentra en el nivel 4.

Set Esta variante se utiliza para cambiar la configuración para el comando. El formato es ATcommand = param param ….

AT + CKPD = «1»
Aceptar

Este comando simula pulsar una tecla en el teclado del teléfono. La tecla pulsada es el número «1».
Respuesta no solicitada es la salida de algún otro evento de resultado del comando. El formato es COMANDO +: resultado. Es el mismo que sans comando de respuesta propio comando. Echa un vistazo al siguiente ejemplo:
Un comando + CMER activa o desactiva el envío de códigos de resultado no solicitados en el caso de piezas prensadas clave, cambios de pantalla, y los cambios indicador de estado. Los parámetros para este comando son los siguientes:

AT + CMER =?
CMER +: (0,3), (0,1,2), (0), (0,1,2), (0)
Aceptar

El primer parámetro establece el modo de salida, tres parámetros siguientes activar la salida o encender el teclado, la pantalla y los indicadores. Último parámetro controla el almacenamiento en búfer. El Motorola RAZR, el estado por defecto de este comando es la siguiente:

AT + CMER?
+ CMER: 0,0,0,0,0
Aceptar

lo que significa que todas las respuestas apagado. Ahora bien, si nos volvemos informar y establecer teclado para el:

AT + CMER = 3,1,0,0,0
Aceptar

y empezar a presionar botones en el teléfono, vamos a ver lo siguiente:

+ CKEV: «E», 1
+ CKEV: «E», 0
+ CKEV: «1», 1
+ CKEV: «1», 0
+ CKEV: «2», 1
+ CKEV: «2», 0
+ CKEV: «3», 1
+ CKEV: «3», 0
+ CKEV: «E», 1
+ CKEV: «E», 0

Aquí, «E» significa «rojo» botón (el que se utiliza para encender teléfono encendido / apagado, terminar una llamada, cancelar una acción y muchas otras cosas), «1», «2» y «3» son botones numéricos, y el número después de la coma significa «prensa» si 1 y «liberación» si 0. Ahora es evidente que por primera vez pulsado «Red» para encender la pantalla, entonces pulsa «123» y luego presionar «Red» de nuevo para borrar los dígitos.

El siguiente esquema es un programa de terminal simple. Sólo bucle principal se muestra el texto completo está disponible en el directorio examples en Github. Compilar, De carga, conecte el teléfono al escudo de host USB y abra la ventana de terminal. Si un teléfono es detectado correctamente, croquis salidas descriptor de configuración y espera a la entrada del teclado.

void loop()
{
    Usb.Task();

if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
{
uint8_t rcode;/* reading the keyboard */
if(Serial.available()) {
uint8_t data= Serial.read();
/* sending to the phone */
rcode = Acm.SndData(1, &data);
if (rcode)
ErrorMessage(PSTR(«SndData»), rcode);
}//if(Serial.available()…delay(50);/* reading the phone */
/* buffer size must be equal to max.packet size */
uint8_t buf[32];
uint16_t rcvd = 32;
rcode = Acm.RcvData(&rcvd, buf);
if (rcode && rcode != hrNAK)
ErrorMessage(PSTR(«Ret»), rcode);if( rcvd ) { //more than zero bytes received
for(uint16_t i=0; i < rcvd; i++ ) {
Serial.print(buf[i]); //printing on the screen
}
}
delay(10);
}//if( Usb.getUsbTaskState() == USB_STATE_RUNNING..
}

Cuando un host USB envía en la solicitud de transferencia en el teléfono, no sabe cuánto se reciben los datos. Podría ser un byte o podría ser un paquete grande. Es por eso que el búfer asignado en la línea 22 debe ser igual a la cantidad máxima posible de datos, tamaño de punto final, es decir de Max.packet. La mayoría de los teléfonos tienen Max.packet tamaño de 32 bytes, una notable excepción de Samsung (64 bytes). Si usted ve símbolos extraños y ocasional restablece Arduino mientras se emite grandes cantidades de datos, compruebe Max.packet tamaños de puntos finales a granel y aumentar el tamaño del búfer en consecuencia.Líneas 10-16 contienen el envío de parte de la terminal. Búfer del teclado y se comprueba si no está vacío, un carácter se lee y envía al teléfono (línea 13, Acm.SndData ()). El resto del bucle () está leyendo el teléfono y es un poco más complicada.

La solicitud se envía en línea 24. Una propiedad importante de Acm.RcvData () es que devuelve el número real de bytes recibidos del punto final. El bucle en líneas 28-32 usos rcvd como un contador de bucle, de esta manera, sólo una parte de la memoria intermedia llena durante la transferencia será impreso.

Ahora vamos a empezar nuestro terminal. Una vez que una sesión de terminal está abierto, los comandos se pueden introducir desde el teclado. Para comprobar si la conexión es de tipo directo, en y pulse Intro. Si el teléfono está vivo, usted debe ver que responder con OK. El comando siguiente para intentar es AT + CLAC. Este comando muestra todos los comandos admitidos. Otros comandos pueden ser juzgados «a mano»; también, es posible obtener códigos de clave con AT + CMER, como se ha descrito anteriormente.

Tan fresco como puede parecer, la introducción de comandos desde el teclado no es muy útil para la automatización. Es deseable contar con funciones para llamar a números, enviar y recibir mensajes SMS y navegar por Internet. Por suerte para nosotros, este software ya se están desarrollando. Hay varios escudos GSM en el mercado, y GSM / GPRS módulos de estos escudos se basan en son casi idénticos a los teléfonos GSM. Por ejemplo, yo era capaz de seguir la mayor parte de este tutorial utilizando teléfono Motorola RAZR. Algunos comandos son diferentes, pero la mayoría del trabajo. Muchos de los comandos descritos en esta página también funcionan. Finalmente, está muy bien escrita GSM Zona de juegos Arduino Library, que puede ser fácilmente modificado para utilizar métodos USB para enviar / recibir datos al teléfono. Estoy pensando en buscar en él después de la finalización de la nueva biblioteca de host USB.

Por último, quiero hablar un poco acerca de la compatibilidad. Revisé este boceto con Motorola RAZR, Motorola y Samsung V220 A-777. Teléfonos Motorola trabajar fuera de la caja, Samsung necesita cambiar el tamaño buffer. También traté de Sony Ericsson TM-506 y TM 717– el descriptor de configuración en estos teléfonos es muy complejo y el método Init () no les inicializar correctamente. Este problema se solucionará en el futuro. También tengo curiosidad acerca de otros teléfonos – por favor, hágamelo saber si su teléfono trabajado con este sketch.

fuente original : https://www.circuitsathome.com/mcu/programming/interfacing-arduino-to-a-cellular-phone

Deja una respuesta