2012-05-28 9 views
28

¿Es posible configurar el acelerómetro iPhone para recibir datos en el rango de ± 8g? (por lo que yo sé ST LIS331DLH acelerómetro instalado en el iPhone es compatible con este modo)Configurar el acelerómetro iPhone en el modo ± 8g

Buscamos no sólo en la API estándar, pero también

  • funciones no documentadas
  • posibles cortes iOS
  • retoques de hardware

De todos modos para extender el rango del acelerómetro más allá del estándar ± 2g

+4

Para más informaciones: http://www.iphonedevsdk.com/forum/iphone-sdk- desarrollo/4822-maximum-accelerometer-reading.html. 'No puede cambiar el modo con ninguna característica publicada de las APIs.' Supongo que necesitará un dispositivo con jailbreak y una forma de cambiar el modo del acelerómetro ANTES de cualquier llamada a las funciones del SDK. –

+0

¿No sabes qué sensor de movimiento se usa en Apple Watch? Como veo, tienen un límite de + -16g –

Respuesta

2

Desafortunadamente, no hay una forma nativa de hacerlo. Por otro lado, si estás dispuesto a Jailbreak, hay un ajuste de Cydia que puedes obtener (no recuerdo el nombre) que reduce la sensibilidad del acelerómetro. Si tiene la sensibilidad al 25%, debería poder detectar ± 8g. Para su información, si está leyendo el resultado de su aplicación, seguirá siendo de ± 2g pero con el ajuste, debe recordar que las lecturas se reducirán en 1/4. (Significado 2g en la aplicación = 8g en el espacio real).

+0

Estoy de acuerdo con el dispositivo jailbreak y tweaking. ¿Cuál es el nombre de este ajuste y dónde puedo obtener más información al respecto? –

+0

@EvgenyVinnik Lo siento, no puedo recordar. Lo tenía en mi iPhone porque la orientación cambió muy fácilmente. Ahora bien, si esta es su propia aplicación, también puede escalar la salida del acelerómetro en su propio código. es decir, accelOutput.x * 4 = X g fuerzas que van desde -8 a +8. Lo siento, no puedo ayudarte más. –

6

Mi "respuesta" no contiene con respuesta directa a la pregunta de Evgeny. Sin embargo, encontré un montón de funciones no documentadas que probablemente puedan ayudar.

He buscado en iOS SDK para funciones relacionadas con el acelerómetro. Parece que todo se reduce a uno de dos marcos (otros marcos se basan en uno de estos): SpringBoardServices (Private) y CoreMotion.

SpingBoardServices API es relativamente simple: Ver también: SBSAccelerometer description

objetivo-C API:

@interface SBSAccelerometer : XXUnknownSuperclass { 
    id<SBSAccelerometerDelegate> _delegate; 
    CFRunLoopSourceRef _accelerometerEventsSource; 
    CFRunLoopRef _accelerometerEventsRunLoop; 
    double _interval; 
    NSLock* _lock; 
    BOOL _orientationEventsEnabled; 
    int _orientationEventsToken; 
    NSThread* _orientationEventsThread; 
    float _xThreshold; 
    float _yThreshold; 
    float _zThreshold; 
} 
@property(assign, nonatomic) id<SBSAccelerometerDelegate> delegate; 
@property(assign, nonatomic) BOOL orientationEventsEnabled; 
@property(assign, nonatomic) float zThreshold; 
@property(assign, nonatomic) float yThreshold; 
@property(assign, nonatomic) float xThreshold; 
@property(assign, nonatomic) double updateInterval; 
@property(assign, nonatomic) BOOL accelerometerEventsEnabled; 
-(id)init; 
-(void)dealloc; 
-(void)_checkIn; 
-(void)_checkOut; 
-(void)_serverWasRestarted; 
-(int)currentDeviceOrientation; 
-(id)_orientationEventsThread; 
-(void)_orientationDidChange; 
@end 

C-API (firmas métodos son desconocidos):

int SBAccelerometer_server(struct unknown *in, struct unknown *out); //returns 1 on success, 0 otherwise 
int SBAccelerometer_server_routine(struct unknown *in); // retuns 0 on error; 
(?) SBSetAccelerometerClientEventsEnabled(...); 
(?) SBSetAccelerometerDeviceOrientationChangedEventsEnabled(...); 
(?) SBSetAccelerometerRawEventsInterval(...); 
(?) SBXXDeliverAccelerometerEvent(...); 
(NSString* or char*) _SBXXSBAccelerometer_subsystem; 

CoreMotion marco bajo API es C++ API. No publicaré toda la API (que es mucho más grande que SpingBoardServices'), pero hay partes más prometedores:

CLSensorFusionAccelerometerOnly::reset(float) 
CLSensorNetworkProtocol::isAccelerometerPacket(__CFData const*) 
CLSensorNetworkProtocol::serializeAccelerometerPacket(CLAccelerometer::Sample const&) 
CLSensorNetworkProtocol::deserializeAccelerometerPacket(__CFData const*) 
CLSensorInterface::setAccelerometerCallbackAndInfo(void (*)(void*, CLMotionTypeVector3 const&, double const&), void*) 
Cuestiones relacionadas