Revista 100% Verde

Comunicacion con un smartphone usando el magnetometro

Por Soloelectronicos @soloelectronico
Una forma barata y sencilla de comunicación entre un microcontrolador (por ejemplo, Arduinoo Netduino +) y un dispositivo Android es sorprendentemente difícil de lograr siendo e l medio más práctico para lograrlo es utilizar un módulo Bluetooth o WiFi que aumente significativamente el costo de un proyecto (del orden de $ 30 - $ 60). En este post veremos un pequeño hack que permite comunicaciones de ancho de banda muy bajo en una dirección y prácticamente sin costo alguno. No es práctico para la mayoría de las aplicaciones, pero la idea era suficientemente interesante para explorarla

Se puede utiliza el magnetómetro de cualquier dispositivo para realizar una comunicación inalámbrica. El truco reside en crear una pequeña bobina a modo de antena y variar el campo magnético de la brújula del teléfono: de esta forma mediante esas pequeñas variaciones, podemos enviar datos al teléfono de una forma muy sencilla (la conexión de datos no es rápida ya que tan sólo permite un refresco de unos 40Hz pero es interesante ver cómo funciona).

Paraa probar el montaje necesitará lo siguiente:

  • Un teléfono o dispositivo Android que cuente con un magnetómetro (brújula electrónica). A dia de hoy no se conoce e ningún dispositivo sin uno.
  • Aproximadamente 1 metro de alambre de cobre esmaltado (alambre del imán), aunque cualquier alambre aislado fino hará.
  • La aplicacion android ' Tricorder ' (disponible gratuitamente en la tienda de aplicaciones de Android)
  • Resistencia de 120 ohmios
  • Un diodo (opcional)

Haga una bobina envolviendo el 1 metro de hilo magnético alrededor de algo cilíndrico (por ejemplo, una pila AAA) con un diámetro de aproximadamente 1 cm. Usted debe obtener alrededor de 30 vueltas de 1 metro. El diámetro o el número de vueltas no es importante mientras estén en bien erolladas para lo cual puede e nvolver un hilo ligero alrededor de la bobina para ayudar a mantener su forma.

Comunicacion con un smartphone usando el magnetometro

Conecte ahora a bobina como se ilustra en el esquema anterior. La resistencia de 120 ohmios limita el consumo de corriente a aproximadamente 40mA, que es el máximo permitido

El propósito del diodo es proteger el Arduino de un golpe de disparo de EMF cuando el pasador 13 está bajo. Esto se conoce como un diodo de retorno . Con sólo 30 vueltas y un núcleo de aire, es probable que salga sin usarlo,p ero es una buena práctica incluirlo.

Ahora toca localizar el magnetómetro delterminal pues s u ubicación variará de un dispositivo a otro. Aquí es donde el tricorder sera muy útil pues la ap licación Tricorder mostrara el campo magnético.

Comunicacion con un smartphone usando el magnetometro

Para el HTC Desire la señal es más fuerte en la parte inferior . A la izquierda de la pantalla LCD es donde se encuentra el magnetómetro pero e sto es probable que varíe de un dispositivo a otro.

Ahora cargue este skretch en su placa Arduino antes de conectar la bobina.

  Unesdoc.unesco.org unesdoc.unesco.org
  * Generar una onda cuadrada de 1 Hz en el pin 13
  * /
 Void setup () {
   PinMode (13, OUTPUT);
 }

 Void loop () {
     DigitalWrite (13,1);
     Retardo (500);
     DigitalWrite (13,0);
     Retardo (500);
 }

Cuando la bobina está desconectada, debería ver el LED del Arduino parpadeando.

Ahora conecte la bobina. El LED debe dejar de parpadear en este punto porque la bobina pone en cortocircuito el LED ,lo cual es lo esperado.

Inicie la aplicación Tricorder y cambie al modo MAG e inicie la exploración.

Escanee metódicamente la bobina a través de la superficie del teléfono Android hasta que empiece a ver una fuerte onda cuadrada:d onde vea la amplitud de este pico de señales es donde se encuentra el magnetómetro.

Debería ver una onda cuadrada similar si coloca la bobina en la misma ubicación en la superficie inferior del dispositivo. Utilice un poco de cinta para mantenerlo colocado allí.

Ahora tenemos una forma de detectar en Android ,por lo que l a tentación es conectar la bobina al Arduino UART y comenzar a enviar datos a 9600bps , pero d esafortunadamente esto no va a suceder porque stamos limitados por la tasa de muestreo del magnetómetro disponible para nosotros por el sistema operativo Android. e

Aquí está un histograma de time-between-samples de un HTC Desire ejecutando Froyo (Anrdoi 2.2) a una velocidad de muestreo máxima:

Comunicacion con un smartphone usando el magnetometro

Podemos ver aquí que casi todas las muestras vienen en entre 18ms y 25ms. Hay algunos picos qeu van todo el camino hasta 45ms pero son tan pocos que podemos ignorarlos. Esto significa que estamos limitados a un máximo de una tasa de muestreo de 40 Hz. Si manejamos la bobina con una línea de E / S digital que inmediatamente tapa nuestro ancho de banda máximo a 40bps.

Este otro sketch para Arduino energiza la bobina con una onda cuadrada de inicio a 500Hz y disminuye a aproximadamente 1Hz durante unos segundos.

  Int i;
 Int d = 1;
 Void setup () {
   PinMode (13, OUTPUT);
 }

 Void loop () {
   Para (i = 1; i <500; i + = d) {
    
     // Aumenta el incremento a medida que disminuye la frecuencia
     D = (i ^ {6}) + 1;
   
     DigitalWrite (13,1);
     Retraso (i);
     DigitalWrite (13,0);
     Retraso (i);
   }
 }


Aquí están los datos del magnetómetro:
Comunicacion con un smartphone usando el magnetometro

Como se esperaba, no se detectan altas frecuencias (a la izquierda). Parece que sólo obtener buena recogida cuando la frecuencia baja a alrededor de 6Hz!

Para la codificación utilizamos NRZ (no retorno a cero) similar a la utilizada en RS232 con un período de bit de 140ms (aproximadamente 7 bps). E l límite inferior UART de Arduino es de 300bps, así que no podemos usarlo para generar la señal.

Del mismo modo, en el terminal Android vamosa tener que decodificar en el software también.

#define BIT_DELAY 140

int i;
char *text = "Hello World! ";

void setup() {
  pinMode(13,OUTPUT);
}

void loop() {
 
  char *s;
  s = text;
  while (*s != 0) {
    transmitByte(*s++);
  }
  
  delay (BIT_DELAY*10); 
}
/**
 * Bit bang a byte
 */
void transmitByte (byte c) {
  
  // Start bit
  digitalWrite (13,1);
  delay(BIT_DELAY);
  
  // Data bits
  for (i = 0; i < 8; i++) {
      digitalWrite (13, ( (c&0x80)!=0 ? 1 : 0) );
      delay(BIT_DELAY);
      c <<= 1;
  }
  
  // Stop bit
  digitalWrite (13, 0);
  delay(BIT_DELAY);
}

Aquí vemos el ejemplo en acción:

Nota :la aplicación Tricorder no esa disponible temporalmente en Google Play ,pero en su lugar hay algunas apps similares como Magentic Filed measure

Via jdesbonnet


Volver a la Portada de Logo Paperblog