Domanda

ho preso il codice esistente da questo progetto , e molto felice con lui finora.

Sono ora però in una posizione in cui ho bisogno di fare uso di alcuni sensori di terze parti, che ho acquistato da hitechnic , come ad esempio un accelerometro, un giroscopio e una bussola 3D -. per citarne alcuni

Non sono sicuro da dove cominciare ora, ma quello che ho bisogno di fare è aggiungere alla mia base di codice esistente (che si basa sulla questo ), e in modo efficace incollare il mio quadro di riferimento per il nuovo hardware.

Qualcuno mi può punto nella giusta direzione? Non riesco a trovare nessuna API del produttore del dispositivo, (ma li ho inviato via email e ha chiesto - nessuna risposta ancora).

Ho anche iniziato a documentare i miei risultati su questo pagina.

È stato utile?

Soluzione

Va bene, ho avuto uno sguardo. I sensori analogici, come il giroscopio, sono morto facile ...

Ho praticamente appena riutilizzato quello di un altro sensore analogico - il sensore di luce ...

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

Per il polling, ho usato il metodo di polling generic ...

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

... dal codice LegoNXTRemote.

Quelli digitali non sono così facili - specialmente a qualcuno che ha zero sw / hw esperienza. Ecco il lavoro ultrasonico codice sonda, l'installazione e per il polling. Mi limiterò a scrivere il prototipo di questi metodi e un clone git per chi è interessato il codice completo alla fine.

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

Si noti come è ha il proprio metodo dedicato per il polling. Così, ora la domanda è come scrivere uno per l'accelerometro.

Le informazioni che si ottiene quando si acquista il sensore è un polo di mappatura tabella a contenuti:

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

... guardando il sensore a ultrasuoni, posso vedere i riferimenti a 0x42 -. Che sto indovinando è dove l'indirizzo va, ma questo è tutto quello che posso indovinare in questo momento

I farò sapere se ho qualche progresso su questo.


Ok, ecco dove sta con l'accelerometro.

ho mando il dispositivo il seguente messaggio ...

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

Ciò significa, rispettivamente, (sono ben potrebbe essere sbagliato) è ...

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

Avanti inviamo una richiesta di lettura ...

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

E per che otteniamo una risposta ...

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

... e che termina con un errore.

Ecco un pezzo di log ...

           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

Questo è tutto basato sul codice di esempio da qui , che è il seguente ...

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];
    ...

}

Impressionante! Sembra che stia funzionando ora -. Ho solo bisogno di giocherellare con l'uscita per estrarre il X attuale, Y e Z letture

Se funziona, vi svelo tutti sapete, ma fino a quando ho provato, ho Lascerai questo biglietto aperto.


D'accordo, sembra che ora sta lavorando, ma c'è abbastanza errore nel sensore, e non ho ancora dimostrare che ho davvero risolto questo. Ecco il frammento di codice:

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]];

Se qualcuno è interessato a questo, vi invito a scaricare il sorgente e provarlo - Sono ancora dimostrare scientificamente che questo è in realtà corretto, anche se prima vista sembra ok

.

Va bene, ho fatto alcuni test - si guarda bene. Ho convertito i valori di G, secondo le istruzioni fornite con il dispositivo - affermando che 1 g ~ 200 unità (Vorrei che hanno fatto un po 'meglio di ~ 200, qualche indicazione dell'errore sarebbe stato bello) <. / p>

//. 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]];

Se si posiziona il dispositivo come per la pagina di fornitore, è possibile vedere ogni accesso ha colpito una lettura accelerazione del ~ 1.02f.

Credo di poter chiudere questo fuori ora e lavorare sulla pulizia del quadro.


Il codice può essere controllato fuori a:

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

Altri suggerimenti

ho sentito indietro da HiTechnic oggi, e con il loro permesso, sto postando la loro risposta per tutti qui.

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

References:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top