Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

domingo, 27 de mayo de 2012

Acelerometro

¿Qué es un acelerómetro?
El acelerómetro es un sensor capaz de medir la fuerza de aceleración, ya sea causada por la gravedad de la tierra o el movimiento.

¿Para que son utilizados?
 El acelerómetro a pesar de parecer que tiene escazos usos, es en realidad utilizado para una gran variedad de aplicaciones y cada vez mas en los dispositivos móviles, algunos ejemplos de esto son:
  • Analizar problemas en la ingeniera de un carro
  • IBM y Apple los han utilizado para proteger los discos duros de una caída, accionando un sistema de seguridad si la laptops cae este se acciona.
  • Para detectar choques y desplegar las bolsas de aire en los autos.
  • En construcción o renovaciones para asegurar que la vibración del edificio no conlleve a grandes problemas en caso de un sismo.
  • Es utilizado como control en vídeo juegos.  
  • En móviles para detectar la posición de la pantalla.



[Imagen obtenida de: http://www.missphones.co.uk/blog/wp-content/uploads/2009/03/accelerometer-facilitates-image-rotation.png]

¿Cómo funciona?

Dentro del acelerómetro se encuentran diminutas estructuras que produce una corriente eléctrica si el sensor experimenta cualquier clase de movimiento. El acelerómetro necesita ser puesto sobre la superficie del objeto al cual se desea medir su aceleración puesto que el sensor no es capaz de trabajar sin estar sobre el objeto.

Tipos de acelerometro

  1. Acelerómetro mecánico:
    Se construye uniendo una masa a un dinamómetro cuyo eje está en la misma dirección que la aceleración que se desea medir.

  2. Acelerómetro piezoeléctric:
    Este se basa en que, cuando se comprime un retículo cristalino piezoeléctrico, se produce una carga eléctrica proporcional a la fuerza aplicada. Los elementos piezoeléctricos se encuentran comprimidos por una masa, sujeta al otro lado por un muelle y todo el conjunto dentro de una caja metálica. Cuando el conjunto es sometido a vibración, el disco piezoeléctrico se ve sometido a una fuerza variable, proporcional a la aceleración de la masa.

[Imagen obtenida de:http://www.techfuels.com/attachments/general-internet-terms/9006d1229408682-accelerometer-accelerometer.jpg]
Añadiendo  funcionalidad del acelerómetro al Ajedrez

Para ejemplo de este tema añadí una funcionalidad donde se utiliza el acelerómetro. Esta consiste en seleccionar una pieza del juego, una vez seleccionada, si se agita el dispositivo se mostraran los posibles movimientos de esa pieza, cambiando de color de las celdas, verde si es un posible movimiento, rojo si es posible comer esa pieza y azul si es posible realizar un movimiento especial del ajedrez. El código esta basado en el ejemplo del ultimo vinculo de las referencias que me pareció bastante bueno.

Lo primero que hago es agregar una clase abstracta como padre de la clase "Partida" para que pueda recibír los valores del sensor. Ya con esto declaro un atributo para manejar el sensor.

public class Partida extends Activity implements SensorEventListener {
 private SensorManager sensorManager;
        long tiempo; 
          


Después se obtiene el sensor, se declara a si misma como una clase que va a escuchar el sensor y en una variable atributo se guarda el tiempo actual.

  sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  sensorManager.registerListener(this,
    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
    SensorManager.SENSOR_DELAY_NORMAL);
  tiempo = System.currentTimeMillis();

Ahora declaramos las clases necesarias para la interfaz implementada, también se agrega y se elimina el sensor de la variable que lo maneja en los métodos correspondientes de la actividad y por ultimo se obtienen los valores y en caso de percibir movimiento se pasa a una parte lógica que obtiene los posibles movimientos si se encuentra seleccionada una pieza.

 public void onSensorChanged(SensorEvent event) {
  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
   getAccelerometer(event);
  }

 }

 private void getAccelerometer(SensorEvent event) {
  float[] values = event.values;
  // Movement
  float x = values[0];
  float y = values[1];
  float z = values[2];

  float accelationSquareRoot = (x * x + y * y + z * z)
    / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);
  long tiempoActual = System.currentTimeMillis();
  if (accelationSquareRoot >= 2.5) //
  {
   if (tiempoActual - tiempo < 200) {
    return;
   }
   tiempo = tiempoActual;
   
   if( estado == 1){
    if(movimientosMostrados == 0){
           this.mostrarMovimientos(ajedrez.verMovimientos(this.origen[0], this.origen[1]) );
           movimientosMostrados = 1;
    }else{
     this.tableroInicial();
     seleccionarPieza(this.origen[0], this.origen[1]);
     movimientosMostrados = 0;
    }
   }    
  }
 }

 @Override
 public void onAccuracyChanged(Sensor sensor, int accuracy) {

 }

 @Override
 protected void onResume() {
  super.onResume();
  sensorManager.registerListener(this,
    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
    SensorManager.SENSOR_DELAY_NORMAL);
 }

 @Override
 protected void onPause() {
  super.onPause();
  sensorManager.unregisterListener(this);
 }

Resultado:


 Video:


Fuentes de referencia:
http://www.omega.com/prodinfo/accelerometers.html
http://es.wikipedia.org/wiki/Aceler%C3%B3metro
http://www.dimensionengineering.com/info/accelerometers
http://www.wisegeek.com/what-is-an-accelerometer.htm
http://ezinearticles.com/?How-does-an-Accelerometer-Work?&id=285604
http://www.vogella.com/articles/AndroidSensor/article.html

1 comentario: