DevCorner: leggere i valori dell'accelerometro

Giuseppe Tripodi
Giuseppe Tripodi Tech Master
DevCorner: leggere i valori dell'accelerometro

Anche il nostro robottino con chiave inglese e martello è tornato dalle vacanze natalizie (a proposito, lo trovate ingrassato?) e questo martedì è qui per proporvi un tutorial semplice ma che prima o poi vi tornerà utile nella vostra vita da sviluppatore: oggi vediamo infatti come leggere i dati forniti dall'accelerometro.

Dopo aver creato la canonica nuova app, creiamo una semplicissima interfaccia in cui non c'è nient'altro che tre TetxtView che hanno i seguenti ID: asseX, asseY e asseZ.

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<textview android:id="@+id/asseY" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:text="Asse Y:" android:textappearance="?android:attr/textAppearanceLarge"></textview>

<textview android:id="@+id/asseX" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/asseY" android:layout_alignleft="@+id/asseY" android:layout_marginbottom="80dp" android:text="Asse X:" android:textappearance="?android:attr/textAppearanceLarge"></textview>

<textview android:id="@+id/asseZ" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/asseY" android:layout_centerhorizontal="true" android:layout_margintop="80dp" android:text="Asse Z:" android:textappearance="?android:attr/textAppearanceLarge"></textview>


</relativelayout>

Come avrete probabilmente intuito, tutto il divertimento questa volta è nel codice Java: apriamo la nostra MainActivity.java e, dopo aver implementato l'interfaccia SensorEventListener (e aver fatto l'Override dei metodi suggeriti), dichiariamo tre TextView, tre float associati all'ultimo valore di ogni asse più uno che definirà il "rumore" da ignorare, un boolean per capire se è la prima volta che l'app viene utilizzata e i due oggetti di tipo SensorManager e Sensor.

public class MainActivity extends Activity implements SensorEventListener {

	private boolean inizializzato;
	private SensorManager sensorManager;
	private Sensor accelerometro;
	private final float rumore = (float) 1.0;
	TextView asseX;
	TextView asseY;
	TextView asseZ;
	private float ultimaX, ultimaY, ultimaZ;

Nell'onCreate definiamo il SensorManager che, come avrete intuito, è un oggetto che utilizziamo per gestire i sensori e grazie ad esso otteniamo il nostro accelerometro. Avviamo dunque il metodo registerListener del SensorManager, che ci consente di rimanere "in ascolto" dei sensori.

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		inizializzato = false;
		sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		accelerometro = sensorManager
				.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		sensorManager.registerListener(this, accelerometro,
				SensorManager.SENSOR_DELAY_NORMAL);
		asseX = (TextView) findViewById(R.id.asseX);
		asseY = (TextView) findViewById(R.id.asseY);
		asseZ = (TextView) findViewById(R.id.asseZ);
	}

A questo punto, il più dell'applicazione va scritto all'interno di OnSensorChanged che, come il nome suggerisce, è ciò che viene lanciato quando lo smartphone percepisce una variazione comunicata dal sensore (nel nostro caso l'Accelerometro).

Qui, per prima cosa definiamo tre valori float a cui associamo i valori provenienti dall'Array values, che contiene, rispettivamente, la variazione degli assi X, Y e Z. A questo punto, se il nostro booleano inizializzato è ancora impostato a false, assegniamo all'ultimo valore dei tre assi quello appena ottenuto e facciamo in modo che venga stampato sulla TextView corrispondente.

Se, invece, non è la prima volta che il metodo OnSensorChanged viene lanciato, creiamo altri tre valori float che rappresentano il "delta" per ogni asse, ossia la differenza tra l'ultimo valore e quello appena ottenuto con il movimento e assegniamoli alle corrispondenti TextView, ma solo dopo aver controllato che la variazione non sia inferiore alla cifra che abbiamo impostato come "rumore" (ossia valore trascurabile), nel nostro caso 1.

	@Override
	public void onSensorChanged(SensorEvent event) {
		// TODO Auto-generated method stub

		float x = event.values[0];
		float y = event.values[1];
		float z = event.values[2];
		if (!inizializzato) {
			ultimaX = x;
			ultimaY = y;
			ultimaZ = z;
			asseX.setText("Asse X: 0.0");
			asseY.setText("Asse Y: 0.0");
			asseZ.setText("Asse Z: 0.0");
			inizializzato = true;
		} else {
			float deltaX = Math.abs(ultimaX - x);
			float deltaY = Math.abs(ultimaY - y);
			float deltaZ = Math.abs(ultimaZ - z);
			if (deltaX

Il risultato finale di questa semplice app prevede tre TextView che cambiano valore allo "scuotere" del dispositivo: come avrete potuto notare, leggere i valori dell'accelerometro è davvero semplice e ci vuole davvero poco per realizzare un software che si accorga dei movimenti del nostro device.

Anche per questo martedì è tutto, come sempre se avete bisogno di assistenza vi rimandiamo alle pagine del nostro forum: buon sviluppo a tutti!

 
Fonte: DevCorner