Oggi vedremo come rilevare, grazie all’accelerometro integrato in ogni dispositivo, il movimento del nostro iPhone. I dati che andremo a leggere sono quelli riferiti ai 3 assi principali x, y e z dell’iPhone, che combinati insieme ci permettono di controllare l’esatto orientamento del nostro dispositivo nello spazio. Questo può tornare utile per un’infinità di diverse applicazioni, ad esempio come metodo di controllo per i videogiochi, alternativo ai classici tasti di un gamepad tradizionale. Potremo in questo modo controllare ad esempio lo sterzo di una macchina tramite gesti naturali o variare l’inclinazione di un piano dove può liberamente muoversi una pallina facendole evitare eventuali ostacoli.
Con questo tutorial ci limiteremo però a mostrare tramite 3 UILabel, i valori letti e a controllare l’attributo “progress” di tre oggetti di tipo “UIProgressView”. Di seguito uno schema degli assi di rotazione dell’iPhone:

Iniziamo con il nostro tutorial. Apriamo Xcode, creiamo un nuovo progetto e dall’elenco dei template disponibili scegliamo “View-based Application”. Diamo un nome alla nostra applicazione, ad esempio “myAccel”, scegliamo dove salvare il progetto e andiamo avanti.
Apriamo il file “myAccelViewController.h” e inseriamo il seguente codice:
#import
@interface myAccelViewController : UIViewController {
IBOutlet UILabel *xLabel;
IBOutlet UILabel *yLabel;
IBOutlet UILabel *zLabel;
IBOutlet UIProgressView *xProgress;
IBOutlet UIProgressView *yProgress;
IBOutlet UIProgressView *zProgress;
}
@property (nonatomic, retain) IBOutlet UILabel *xLabel;
@property (nonatomic, retain) IBOutlet UILabel *yLabel;
@property (nonatomic, retain) IBOutlet UILabel *zLabel;
@property (nonatomic, retain) IBOutlet UIProgressView *xProgress;
@property (nonatomic, retain) IBOutlet UIProgressView *yProgress;
@property (nonatomic, retain) IBOutlet UIProgressView *zProgress;
@end
Come vedete abbiamo innanzitutto aggiunto il protocollo “UIAccelerometerDelegate”, dopodichè abbiamo dichiarato sei oggetti IBOutlet, tre di tipo UILabel e tre di tipo UIProgressView. Collegheremo questi oggetti ai rispettivi che andremo a disegnare tramite Interface Builder. Abbiamo inoltre dichiarato le “property” di questi sei oggetti, in modo da poter utilizzare tranquillamente tutte le proprietà e i metodi dei nostri oggetti nel resto del programma.
Salviamo, apriamo il file “myAccelViewController.m” e iniziamo a scrivere il codice vero e proprio che farà funzionare il nostro programma. Iniziamo a scrivere la seguente riga di codice:
@synthesize xLabel, yLabel, zLabel, xProgress, yProgress, zProgress;
Grazie a questa istruzione potremo usare tutte le “caratteristiche” offerte dagli oggetti dichiarati nel file di intestazione. Togliamo i caratteri che commentano il metodo “viewDidLoad” e modifichiamolo come segue:
- (void)viewDidLoad {
[super viewDidLoad];
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0f/15.0f)];
[[UIAccelerometer sharedAccelerometer] setDelegate:self
}
Così facendo non facciamo altro che impostare l’intervallo di tempo tra una rilevazione di un movimento e un’altra e settare il delegato dell’accelerometro a “self”. Ora non resta che implementare il codice che ad ogni lettura di dati dall’accelerometro, mostri il valore letto nelle etichette x, y e z e imposti inoltre tale valore nella proprietà “progress” delle “UIProgressView” in modo da avere un ritorno visivo del movimento rilevato.
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{
xLabel.text = [[NSString alloc] initWithFormat:@"%f", acceleration.x];
yLabel.text = [[NSString alloc] initWithFormat:@"%f", acceleration.y];
zLabel.text = [[NSString alloc] initWithFormat:@"%f", acceleration.z];
xProgress.progress = ABS(acceleration.x);
yProgress.progress = ABS(acceleration.y);
zProgress.progress = ABS(acceleration.z);
}
Con il codice abbiamo terminato, possiamo quindi salvare e aprire Interface Builder per disegnare l’interfaccia grafica facendo doppio-click sul file “myAccelViewController.xib”. Trasciniamo nella vista 3 UILabel che useremo come etichette, modificando la loro proprietà “Text” in “X:”, “Y:” e “Z:”. Inseriamo quindi nella view altre 3 UILabel e 3 UIProgressView. Clicchiamo su “File’s Owner” e tramite la finestra “My Accel View Controller Connections” effettuiamo i rispettivi collegamenti tra questi ultimi 6 oggetti e i rispettivi creati tramite Xcode.
Dovreste ottenere una vista simile alla seguente:

Potete salvare e chiudere Interface Builder. Da Xcode clicchiamo su “Build and Run” e testiamo la nostra applicazione. Per poter rilevare i movimenti occorrerà installare l’applicazione sul vostro dispositivo in quanto, le ovvie limitazione dell’iPhone Simulator, non permettono la rilevazione di movimenti. In basso uno screenshot dell’applicazione in esecuzione:

7 Responses to “T#011 – Rileviamo i movimenti dell’iPhone”
23 Novembre 2009
Tweets that mention T#011 – Rileviamo i movimenti dell’iPhone | devAPP -- Topsy.com[…] This post was mentioned on Twitter by Rino Picardi, devAPP. devAPP said: Nuovo tutorial online "Rileviamo i movimenti dell’iPhone" http://www.devapp.it/wordpress/t011-rileviamo-i-movimenti-delliphone.html […]
26 Novembre 2009
pippomanbestiale
5 Giugno 2010
Placeboma il simulatore ha l’opzione “gesto Agita” da “Hardware,
solo ke non capisco come si fa la combinazione, in particolare il ^ !
la combo è:
^ (cmd) Z
21 Agosto 2010
FilippoSalve, complimenti per l’ottimo tutorial!
Volevo chiedere se per caso esiste il modo di monitorare lo spostamento relativo del device rispetto ad una posizione di partenza (o di riferimento). Mi spiego meglio, sarebbe possibile, ad esempio, usare l’iphone per descrivere una circonferenza (col gesto) e rilevare tale spostamento (per esempio visualizzando tale circonferenza sul monitor del device)?
Sarei molto felice se qualcuno potesse darmi una mano magari pubblicando uno dei vostri magnifici tutorial.
grazie, Filippo
20 Maggio 2011
sterzosmanettoneciao cortesemente puoi inserire i codici sempre se è possibile grazie
28 Maggio 2011
Bloggo » Blog Archive » Iphone rilevare movimenti con accelerometro[…] Link al tutorial: http://www.devapp.it/wordpress/t011-rileviamo-i-movimenti-delliphone.html […]
27 Agosto 2011
Pier Angelointeressante,
ma qualcuno mi può spiegare come usare l’accelerometro per eseguire dei suoni?
graziePier Angelo