2009-04-06 5 views

Répondre

5

De iphonedevsdk.com:

Les accéléromètres utilisés dans le premier et les iPhones de deuxième génération (et I supposent également les touches iPod) fonctionnent en deux modes: +/- 2 g, et +/- 8 g. (En fait, comme vous avez observé, ils rapport accélérations un peu en dehors la plage nominale. La précision est pas dehors de cette plage doté de caractéristiques techniques, cependant.)

Apple les exploite dans le +/- 2 g en mode . Il ya un compromis: La résolution actuelle est nominalement 0,018 g, selon la fiche technique (bien que mon iPhone de première génération utilise 0.018168604, selon une version modifiée de AccelerometerGraph). Dans le mode +/- 8 g, la résolution serait quatre fois plus grossière. Je suppose que Apple a décidé que la résolution plus fine serait plus utile que la gamme plus large. (Je préfère voir plus fine résolution que 0,018 g. Donc, ni de nous est pleinement satisfait.)

Vous ne pouvez pas changer le mode avec une fonction publié des API. Depuis ils passent l'accélération en tant que double, ils pourraient théoriquement permettre un changement de mode, et simplement regarder le mode lors de la remise à l'échelle de la valeur A/D, avant de reporter l'accélération. (Le endroit évident pour définir le mode serait dans l'appel qui met en place l'application pour recevoir des informations accéléromètre .) Cependant, pour la compatibilité ascendante , le système d'exploitation devrait définir le mode accéléromètre à +/- 2 g au début de l'application. Et aucun des processus d'arrière-plan pourrait être autorisé à définir le mode accéléromètre .

1

J'ai créé l'application suivante pour essayer de tester les gammes ...

UIAccelerometer *objAccelerometer; 
UILabel *lblxmin, *lblxmax, *lblymin, *lblymax, *lblzmin, *lblzmax; 
UILabel *lblxnow, *lblynow, *lblznow; 

float xmin = 0.0, xmax = 0.0, ymin = 0.0, ymax = 0.0, zmin = 0.0, zmax = 0.0, xnow = 0.0, ynow = 0.0, znow = 0.0; 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    //NSLog (@"%f, %f, %f", acceleration.x, acceleration.y, acceleration.z); 
    xnow = acceleration.x; 
    ynow = acceleration.y; 
    znow = acceleration.z; 
    if (xnow < xmin) { xmin = xnow; } 
    if (ynow < ymin) { ymin = ynow; } 
    if (znow < zmin) { zmin = znow; } 

    if (xnow > xmax) { xmax = xnow; } 
    if (ynow > ymax) { ymax = ynow; } 
    if (znow > zmax) { zmax = znow; } 

    lblxmin.text = [NSString stringWithFormat:@"%f", xmin]; 
    lblymin.text = [NSString stringWithFormat:@"%f", ymin]; 
    lblzmin.text = [NSString stringWithFormat:@"%f", zmin]; 

    lblxmax.text = [NSString stringWithFormat:@"%f", xmax]; 
    lblymax.text = [NSString stringWithFormat:@"%f", ymax]; 
    lblzmax.text = [NSString stringWithFormat:@"%f", zmax]; 

    lblxnow.text = [NSString stringWithFormat:@"%f", xnow]; 
    lblynow.text = [NSString stringWithFormat:@"%f", ynow]; 
    lblznow.text = [NSString stringWithFormat:@"%f", znow]; 

} 

-(void) invokeAccelerometer { 
    objAccelerometer = [UIAccelerometer sharedAccelerometer]; 
    objAccelerometer.delegate = self; 
    objAccelerometer.updateInterval = (1.0/10.0); 
} 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    lblxmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 40)]; 
    lblxnow = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 100, 40)]; 
    lblxmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 10, 100, 40)]; 

    lblymin = [[UILabel alloc] initWithFrame:CGRectMake(10, 60, 100, 40)]; 
    lblynow = [[UILabel alloc] initWithFrame:CGRectMake(100, 60, 100, 40)]; 
    lblymax = [[UILabel alloc] initWithFrame:CGRectMake(200, 60, 100, 40)]; 

    lblzmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 110, 100, 40)]; 
    lblznow = [[UILabel alloc] initWithFrame:CGRectMake(100, 110, 100, 40)]; 
    lblzmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 110, 100, 40)]; 

    [self.view addSubview:lblxmin]; 
    [self.view addSubview:lblxnow]; 
    [self.view addSubview:lblxmax]; 

    [self.view addSubview:lblymin]; 
    [self.view addSubview:lblynow]; 
    [self.view addSubview:lblymax]; 

    [self.view addSubview:lblzmin]; 
    [self.view addSubview:lblznow]; 
    [self.view addSubview:lblzmax]; 

    [self invokeAccelerometer]; 

    [super viewDidLoad]; 
} 

Le problème est, quand je tourne mon iPod le long des axes horizontal/vertical, puis retournez-le, je obtenir des valeurs telles que:

xmin -1,271802

Xmax 1,180959

ymin -1,344477

ymax 1,108285

zmin -2,30713

zmax 2,325581

Si je prends l'iPod et secouer le diable hors de lui, je reçois ...

x -2,325581 à 2,307413

y -2,325581 à 2,307413

z -2,307413 à 2,325581

Toutes les idées ce qu'il mesure?

Le meilleur que je suis venu avec est:

axe vertical

x = -1 si incliné vers la gauche (< |)

x = 1 si incliné sur toute la vers la droite (|>)

  • où < est la façon dont l'écran est confronté, et | est le fond de l'iPod

y ~ -1 si l'écran est face à vous, perpendiculaire au sol ("debout")

y ~ 1 si éloigné de vous (et à l'envers)

+0

Cela devrait être dans une autre question –

2

L'application aGauge affiche ces données brutes provenant de l'accéléromètre lorsque vous déplacez l'appareil. Il peut également vous aider à trouver le seuil "flip" pour votre appareil.

Questions connexes