Frage

Ich habe den vorhandenen Code von dieses Projekt genommen und sehr glücklich mit ihm so weit.

Ich bin jetzt aber in einer Position, wo ich brauche Verwendung einiger Fremdsensoren zu machen, die ich von HiTechnic , wie ein Beschleunigungssensor, ein Gyroskop und ein Kompass 3D -. einige nennen

Ich bin mir nicht sicher, wo jetzt beginnen, aber was ich tun muss, ist In meiner bestehenden Code-Basis (die auf der diese ) und effektiv meine Rahmen auf die neue Hardware kleben.

Kann mir jemand Punkt mich in die richtige Richtung? Ich kann keine APIs vom Gerätehersteller finden, (aber ich habe sie per E-Mail und fragte - keine Antwort noch) nicht.

Ich habe auch meine Erkenntnisse dokumentieren auf dieser gestartet Seite.

War es hilfreich?

Lösung

Okay, ich habe einen Blick hat. Die analogen Sensoren, wie der Gyro, sind tot einfach ...

ich ziemlich genau wiederverwendet die eines anderen analogen Sensor - der Lichtsensor ...

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

Für Polling, benutzte ich die allgemeine Polling-Verfahren ...

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

... aus dem LegoNXTRemote Code.

Die digitalen Einsen sind nicht so einfach - besonders für jemanden, der Null sw / hw Erfahrung hat. Hier ist der Arbeitsultraschallsensor Code, Einrichtung und für die Abfrage. Ich will nur den Prototyp dieser Methoden schreiben und einen Git-Klon für die Interessenten in dem vollständigen Code am Ende.

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

Beachten Sie, wie es seine eigene spezielle Methode zur Abfrage hat. So, jetzt ist die Frage, wie man für das Beschleunigungsmesser schreiben.

Die Informationen, die Sie erhalten, wenn Sie den Sensor zu kaufen ist eine Tabelle, die Adressen zum Inhalt:

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

... bei dem Ultraschallsensor suche, kann ich Verweis auf 0x42 sehen -. Was ich raten bin, ist, wo die Adresse geht, aber das ist alles, was ich kann Vermutung jetzt

Ich lasse Sie wissen, wenn ich auf diese Fortschritte bekommen.


Okay, hier, wo es mit dem Beschleunigungssensor ist.

ich zuerst das Gerät die folgende Meldung senden ...

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

Was das bedeutet, die jeweils (Ich bin gut falsch sein könnte) ist ...

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

Als nächstes werden wir eine Leseanfrage senden ...

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

Und dass wir eine Antwort bekommen ...

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

... und das endet mit einem Fehler.

Hier ist ein Stück 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

Das ist alles basierend auf dem Beispiel-Code von hier , das ist wie ...

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

}

Awesome! Sieht aus wie es funktioniert jetzt. - Ich muß nur Geige mit dem Ausgang die tatsächlichen X, Y und Z Messwerte zu extrahieren

Wenn es funktioniert, ich werde Sie alle wissen lassen, aber bis ich bewiesen habe, werde ich dieses Ticket offen lassen.


Okay, es sieht aus wie es jetzt funktioniert, aber es ist genug, um Fehler in dem Sensor, und ich habe noch zu beweisen, dass ich wirklich das Problem gelöst habe. Hier ist der Code-Snippet:

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

Wenn jemand daran interessiert ist, lade ich Dich die Quelle zum Herunterladen und probieren Sie es aus. - Ich bin noch wissenschaftlich zu beweisen, dass dies tatsächlich richtig ist, obwohl die erste Blick in Ordnung aussieht


Okay, ich habe einige Tests gemacht - es sieht gut aus. Ich habe den Wert G umgewandelt, gemäß den Anweisungen, die mit dem Gerät geliefert wurden - das besagt, dass 1 G ~ 200 Einheiten (Ich wünsche, sie besser ein wenig tat, als ~ 200, einige Anzeichen des Fehlers schön gewesen wären) <. / 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]];

Wenn Sie das Gerät gemäß der Anbieterseite positionieren, können Sie jeden Zugriff sehen eine Beschleunigung Hit von ~ 1.02f zu lesen.

Ich glaube, ich dieses weg schließen kann jetzt und die Arbeit an den Rahmen aufzuräumen.


Der Code kann auf ausgecheckt werden:

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

Andere Tipps

Ich hörte von HiTechnic heute zurück, und mit ihrer Erlaubnis, ich bin Entsendung ihre Antwort für alle hier.

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

Referenzen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top