Pregunta

Me he tomado el código existente de este proyecto, y muy contento con ella hasta ahora.

Estoy ahora en una posición en la que necesito para hacer uso de algunos terceros sensores que he comprado de hitechnic, como un acelerómetro, un giroscopio y una brújula 3D - para mencionar algunos.

No estoy seguro de por dónde empezar ahora, pero lo que necesita hacer es agregar a mi existentes de la base de código (que se basa en la este), y efectivamente pegamento mi marco para el nuevo hardware.

Puede alguien me apunte en la dirección correcta?No puedo encontrar ninguna Api del fabricante del dispositivo, (pero me han enviado por correo electrónico y le preguntó - no hay respuesta todavía).

También he empezado a documentar mis conclusiones en este página.

¿Fue útil?

Solución

Bueno, he tenido un vistazo.Los sensores analógicos, tales como el Giroscopio, están muertos fácil...

Yo prácticamente sólo se reutiliza que de otro sensor analógico - el sensor de Luz...

- (void)setupGyroscopicSensor:(UInt8)port {
    [self setInputMode:port
                  type:kNXTGyroscope
                  mode:kNXTRawMode];
}

Para el sondeo, he utilizado el genérico de votación método...

- (void)pollSensor:(UInt8)port interval:(NSTimeInterval)seconds;

...de la LegoNXTRemote código.

Los digitales no son tan fácil - especialmente para alguien que tiene cero sw/hw experiencia.Aquí está el trabajo del sensor ultrasónico código, el programa de instalación, y para la votación.Sólo voy a escribir el prototipo de estos métodos y un git clone para aquellos interesados en el código completo en la final.

- (void)setupUltrasoundSensor:(UInt8)port continuous:(BOOL)continuous;
- (void)getUltrasoundByte:(UInt8)port byte:(UInt8)byte;
- (void)pollUltrasoundSensor:(UInt8)port interval:(NSTimeInterval)seconds;

Nota cómo se ha dedicado método de votación.Por lo tanto, ahora la pregunta es cómo escribir uno para el acelerómetro.

La información que se obtiene al comprar el sensor es una tabla de asignación de direcciones a los contenidos:

42H (byte) -> X-axis upper 8 bits
43H (byte) -> X-axis upper 8 bits
44H (byte) -> X-axis upper 8 bits
45H (byte) -> X-axis lower 8 bits
46H (byte) -> X-axis lower 8 bits
47H (byte) -> X-axis lower 8 bits

...mirando el sensor de ultrasonidos, puedo ver las referencias a 0x42 - que supongo que es donde la dirección va, pero eso es todo lo que puedo supongo ahora.

Te dejaré saber si puedo obtener algún progreso.


Bien, aquí es donde en con el Acelerómetro.

Primero me envíe el dispositivo el siguiente mensaje...

0x07, 0x00, 0x00, 0x0f, 0x03, 0x02, 0x08, 0x02, 0x42

Lo que significa, respectivamente, (estoy bien podría estar equivocado) es...

kNXTRawMode
kNXTGetInputValues
kNXTRet     //. Meaning we expect a return value
kNXTLSWrite //. As opposed to read
port        //. Port 0x03 --> Port 4
txLength
rxLength
//. message...
0x02 //. Set the I2C slave address
0x42 //. Set the register we're interested in

Lo siguiente es enviar una solicitud de lectura...

0x03, 0x00, 0x00, 0x0e, 0x03

Y para que tengamos una respuesta...

0x03, 0x00, 0x02, 0x0f, 0xe0

...y que termina con un error.

He aquí un fragmento de registro de...

           libNXT[0x02]: Attempting to connect to NXT...
           libNXT[0x02]: Open sequence initiating...
           libNXT[0x02]: Channel Opening Completed
           libNXT[0x08]: >>> :0x06, 0x00, 0x80, 0x03, 0x0b, 0x02, 0xf4, 0x01, 
           libNXT[0x08]: >>> :0x02, 0x00, 0x00, 0x0b, 
           libNXT[0x08]: <<< :0x05, 0x00, 0x02, 0x0b, 0x00, 0x82, 0x1e, 
           libNXT[0x08]: @selector does NOT respond to NXTOperationError:operation:status:
           libNXT[0x08]: @selector responds to NXTBatteryLevel:batteryLevel:
 startPollingSensor: setup sensor
 startPollingSensor: start polling
           libNXT[0x02]: Polling Port 3
           libNXT[0x08]: >>> :0x07, 0x00, 0x00, 0x0f, 0x03, 0x02, 0x08, 0x02, 0x42, 
           libNXT[0x08]: >>> :0x03, 0x00, 0x00, 0x0e, 0x03, 
           libNXT[0x08]: <<< :0x03, 0x00, 0x02, 0x0f, 0xe0, 
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xf status=0xe0
           libNXT[0x08]: <<< :0x04, 0x00, 0x02, 0x0e, 0xe0, 0x00, 
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xe status=0xe0
           libNXT[0x08]: @selector does NOT respond to NXTOperationError:operation:status:
           libNXT[0x02]: Polling Port 3
           libNXT[0x08]: >>> :0x07, 0x00, 0x00, 0x0f, 0x03, 0x02, 0x08, 0x02, 0x42, 
           libNXT[0x08]: >>> :0x03, 0x00, 0x00, 0x0e, 0x03, 
           libNXT[0x08]: <<< :0x03, 0x00, 0x02, 0x0f, 0xe0, 
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xf status=0xe0
           libNXT[0x08]: <<< :0x04, 0x00, 0x02, 0x0e, 0xe0, 0x00, 
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xe status=0xe0
           libNXT[0x08]: @selector does NOT respond to NXTOperationError:operation:status:
           libNXT[0x02]: Polling Port 3
           libNXT[0x08]: >>> :0x07, 0x00, 0x00, 0x0f, 0x03, 0x02, 0x08, 0x02, 0x42, 
           libNXT[0x08]: >>> :0x03, 0x00, 0x00, 0x0e, 0x03, 
           libNXT[0x08]: <<< :0x03, 0x00, 0x02, 0x0f, 0xe0, 
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xf status=0xe0
           libNXT[0x08]: <<< :0x04, 0x00, 0x02, 0x0e, 0xe0, 0x00, 
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xe status=0xe0
           libNXT[0x08]: @selector does NOT respond to NXTOperationError:operation:status:
Error while running hook_stop:
           libNXT[0x08]: >>> :0x03, 0x00, 0x00, 0x0e, 0x03,
           libNXT[0x08]: <<< :0x03, 0x00, 0x02, 0x0f, 0xe0,
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xf status=0xe0
           libNXT[0x08]: <<< :0x04, 0x00, 0x02, 0x0e, 0xe0, 0x00,
           libNXT[0x08]: @selector responds to NXTOperationError:operation:status:
 nxt error: operation=0xe status=0xe0

Todo esto está basado en el código de ejemplo de la aquí, que es el siguiente...

SetSensorLowspeed(IN_1);
int count;

int xval;
int yval;
int zval;

byte inI2Ccmd[];
byte outbuf[];
while (TRUE) {
    ArrayInit(inI2Ccmd, 0, 2); // set the buffer to hold 10 values (initially all are zero)
    inI2Ccmd[0] = 0x02; // set values in the array
    inI2Ccmd[1] = 0x42;
    count=8;                                  //read count set to 8 bytes
    I2CBytes(IN_1, inI2Ccmd, count, outbuf);  //read the acceleration sensor on port 1
    xval=outbuf[0];                           //load x axis upper 8 bits
    yval=outbuf[1];                           //load Y axis upper 8 bits
    zval=outbuf[2];                           //load z axis upper 8 bits
    if (xval > 127) xval-=256;                //convert x to 10 bit value
    xval=xval*4 + outbuf[3];
    if (yval > 127) yval-=256;                //convert y to 10 bit value
    yval=yval*4 + outbuf[4];
    if (zval > 127) zval-=256;                //convert z to 10 bit value
    zval=zval*4 + outbuf[5];
    ...

}

Impresionante!Parece que está trabajando ahora - sólo tengo que pelearme con la salida para extraer los reales X, Y y Z lecturas.

Si funciona, voy a dejar que usted sabe, pero hasta que lo he probado, voy a dejar este billete abierto.


Bueno, parece que ahora es el trabajo, pero no hay suficiente de error en el sensor, y aún tengo que probar que realmente he resuelto este.He aquí el fragmento de código:

SInt8 *outbuf = malloc(48);
[data getBytes:outbuf length:6];
SInt16 x = outbuf[0]; x <<= 2; x += outbuf[3];
SInt16 y = outbuf[1]; y <<= 2; y += outbuf[4];
SInt16 z = outbuf[2]; z <<= 2; z += outbuf[5];
free(outbuf);
[self setSensorTextField:port
                   value:[NSString stringWithFormat:@"<%d, %d, %d>",
                          x, y, z]];

Si alguien está interesado en esto, los invito a descargar el código fuente y probarlo - que aún tengo que probar científicamente que esto es realmente correcta, aunque a primera vista se ve bien.


Bueno, he hecho algunas pruebas - se ve bien.Me he convertido los valores de G, como por las instrucciones que vienen con el dispositivo indica que 1 G ~ 200 unidades (me gustaría que lo hizo un poco mejor que ~200, algunos indicios de que el error hubiera sido bueno).

//. Acceleration in G's
SInt8 *outbuf = malloc(48);
[data getBytes:outbuf length:6];
SInt16 x = outbuf[0]; x <<= 2; x += outbuf[3]; float gX = x/200.f;
SInt16 y = outbuf[1]; y <<= 2; y += outbuf[4]; float gY = y/200.f;
SInt16 z = outbuf[2]; z <<= 2; z += outbuf[5]; float gZ = z/200.f;
free(outbuf);
[self setSensorTextField:port
                   value:[NSString stringWithFormat:@"%0.2f, %0.2f, %0.2f",
                          gX, gY, gZ]];

Si la posición de los dispositivos como por el proveedor de la página, puede ver cada acceso golpeó a una aceleración de la lectura de ~ 1.02 f.

Creo que puedo cerrar esta ahora y trabajar en la limpieza del marco.


El código se puede comprobar a cabo en:

git clone git://git.autonomy.net.au/nimachine Nimachine

Otros consejos

oí detrás de HiTechnic hoy, y con su permiso, voy a publicar su respuesta para todos aquí.

Hi Nima,

There are two types of sensors, digital and analog.  The Analog sensors you
can basically read like you would the LEGO light sensor.  If you have that
working then you can read the HiTechnic analog sensors.  These include the
EOPD, Gyro as well as the Touch Multiplexer.

For the TMUX there is [sample NXC code][1] on the product info page.
You should be able to use that as a basis if you want to support this device.

The other sensors are digital I2C sensors.  Most of these sensors have I2C
register information on their respective product information page and/or it
was included on a sheet that came with the sensor.  First of all, to make
these sensors work with your framework you need to have I2C communications
working.  After that it will be a matter of creating your own API that uses
the I2C interface with the sensors.  I recommend that you download and look
at Xander Soldaat's RobotC driver suite for the HiTechnic sensors.  You will
find this near the bottom of the HiTechnic downloads page.

Regards,
Gus
HiTechnic Support

Referencias:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top