4

このプロジェクトから既存のコードを取得しましたが、これまでのところ非常に満足しています。

しかし、私は今、加速度計、ジャイロスコープ、3D コンパスなど、hitechnicから購入したサードパーティ製センサーを利用する必要がある立場にあります。

どこから始めればよいかわかりませんが、既存のコード ベース ( thisに基づく) に追加し、フレームワークを新しいハードウェアに効果的に接着する必要があります。

誰かが私を正しい方向に向けることができますか? デバイスの製造元からの API が見つかりません (ただし、電子メールで問い合わせましたが、まだ返信がありません)。

また、このページで調査結果を文書化し始めました。

4

2 に答える 2

3

さて、私は見てきた。ジャイロなどのアナログセンサーはとても簡単です...

私はほとんど別のアナログセンサーのそれを再利用しました-光センサー...

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

ポーリングには、一般的なポーリング方法を使用しました...

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

...LegoNXTRemote コードから。

デジタルのものはそれほど簡単ではありません-特に、ソフトウェア/ハードウェアの経験がまったくない人にとっては. これは、超音波センサーのコード、セットアップ、およびポーリング用です。最後に、これらのメソッドのプロトタイプと、完全なコードに関心のある人向けの git clone のみを記述します。

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

ポーリングのための独自の専用メソッドがあることに注意してください。さて、問題は加速度計用にどのように書くかです。

センサーの購入時に得られる情報は、アドレスとコンテンツをマッピングするテーブルです。

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

...超音波センサーを見ると、への参照が見えます0x42- アドレスがどこにあると推測していますが、今推測できるのはそれだけです。

これについて進展があればお知らせします。


さて、これが加速度計の場所です。

最初にデバイスに次のメッセージを送信します...

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

それがそれぞれ何を意味するか(私は間違っている可能性があります)は...

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

次に、読み取りリクエストを送信します...

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

そして、それに対して私たちは応答を得る...

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

...そして、それはエラーで終了します。

ここにログのチャンクがあります...

           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

これはすべて、次のhereのサンプル コードに基づいています...

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

}

素晴らしい!現在は機能しているようです。出力をいじって、実際の X、Y、Z の読み取り値を抽出するだけです。

それが機能する場合は、皆さんにお知らせしますが、それを証明するまで、このチケットはオープンのままにします.


わかりました、今は動いているようですが、センサーには十分なエラーがあり、これを本当に解決したことをまだ証明していません. コード スニペットは次のとおりです。

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

これに興味のある人は、ソースをダウンロードして試してみることをお勧めします。一見問題ないように見えますが、これが実際に正しいことを科学的に証明することはまだできていません。


わかりました、いくつかのテストを行いました - 良さそうです。デバイスに付属の説明書に従って、値を G に変換しました - 1 G ~ 200 単位と述べています (~200 よりも少し良くなればいいのですが、エラーの表示があれば良かったです)。

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

ベンダーのページに従ってデバイスを配置すると、各アクセスが ~ 1.02f の加速度の読み取り値にヒットすることがわかります。

これでこれを閉じて、フレームワークのクリーンアップに取り組むことができると思います。


コードは次の場所でチェックアウトできます。

git clone git://git.autonomy.net.au/nimachine Nimachine
于 2009-12-29T06:54:38.040 に答える
2

今日、HiTechnic から返事がありました。彼らの許可を得て、ここに全員への回答を掲載します。

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

参考文献:

于 2009-12-29T02:45:17.280 に答える