PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe: NXT + CMPS03



Franzel
09.01.2008, 18:23
Hi,
Ich soll von meinem Lehrer aus den NXT für die Schule testen, da wir jedes Jahr am Robocupjunior teilnehmen. Nun will ich diesen auch gleich mal beim nächsten Tunier mitspielen lassen, aber habe noch kein Geld um erweiterungen zu kaufen. Hat schon jemand Erfahrungen damit? Hat jemand schon etwas gekauft? oder besser Selbst gebaut? Lichtsensoren, habe ich bereits geschafft anzuschließen und zu nutzen, allerdingz fände ich eine I²C-porterweiterung gut, und dringend wäre es, den CMPS03 anzuschließen und zu nutzen. habe ihn bereits hier liegen, aber ich bekomme ihn nicht zum laufen. Kann mir jemand helfen? am besten auch mti kleinem test-programm. bis jetzt arbeite ich mit NXC, hätte aber kein problem damit auf NBC oder RobotC umzusteigen. Hat jemand sonst noch sensoren für den NXT selbstgebaut? oder die sharpsensoren schon eingesetzt? Ich danke euch für eure Hilfe.

Ceos
10.01.2008, 09:59
was ist das problem bei deinem cmps03 ??
NXT konnt ich auf die schnelle nicht alle schnittstellen herausfinden, aber wenn I2C geht nimm das, sonst versuch doch über pulsweitenmodulation, so hab ichs mit meinem asuro gemacht...

https://www.roboternetz.de/phpBB2/viewtopic.php?t=36847

die beschaltung der kleinen platine da oben kann cih dir gern geben wenn du magst (auch wenns eigentlich total trivial ist :p)

Franzel
10.01.2008, 16:17
der NXT hat leider keinen PWM, nur I²C. dürfte ja aber trotzdem funktionieren. ich habe dazu auch diese Anleitung im Internet gefunden:
http://www.stud.uni-karlsruhe.de/~uqbdx/lego/nxt.html
leider funktioniert es nach Anleitung nicht.
falls es jemanden hilft, hier das datenblaat des sensors:
http://www.robot-electronics.co.uk/htm/cmps3doc.shtml
Pinbelegung des NXT:
1: Analog Input
2: GND
3: GND
4: IPOWERA (4,3V output)
5: DIGIAI/0 Digital input 1
6: DIGIAII Digital Input 2
vllt passt das auf der webseite doch, aber der sensor gibt mir nunmal keine werte aus.

Franzel
14.01.2008, 21:25
spannung des ding funzt wunderbar, mit dem aufbau, wie auf der oben erwähnten seite. man darf nur die pullups nicht vergessen, da die auf dem schaltplan ned eingezeichnet sind. werde mich jetzt mal an den pcf8591p ranmachen und hoffen das es funzt. dann könnte man insgesamt schon einiges mit dem nxt anstellen, und bis jetzt war das eigtl auch alles ganz einfach. ob das ganze in iener relation zum preis steht, weiß ich nicht. aber ich finde es trotzdem intresant.

RoboPunk
27.01.2008, 20:05
Hallo,

ich hab mal ein Programm geschrieben, es funktioniert aber leider nicht, sondern liefert nur "190" als Wert auf das Display. Ich vermute, dass die I2C-Kommunikation nicht funktioniert. Kann sich die mal jemand anschauen, jetzt unabhängig davon, ob man einen NXT hat oder nicht. Vor allem bei dem Startbit bin ich mir nicht ganz sicher. Und ob ich nach jedem Lesen das Stoppbit setzten muss und dann wieder ganz von Anfang anfangen muss. Hier ist mal das Programm, über jeden Hinweis bin ich dankbar!


# define cmps03 S1

int wert;

task main()
{
SetSensorLowspeed (cmps03); // I2C an Port 1
ClearScreen ();

I2CWrite (cmps03, 0, 1); // Startbit setzten
I2CWrite (cmps03, 0, 192); // Adresse des Compass
I2CWrite (cmps03, 0, 1); // Registeradresse des Compass, 1 = Werte ausgeben von 0-255
I2CWrite (cmps03, 0, 193); // Erneutes Startbit setzen
while(true)
{
I2CRead (cmps03, 1, wert) // Wert des Registers 2 einlesen

TextOut(15,LCD_LINE1,"erd:", true); // Und auf Display ausgeben
NumOut(60,10, wert);
Wait(100);
}
}

Dirk
27.01.2008, 21:39
Hallo RoboPunk,

ganz egal ist es nicht, ob man NXTs I2C-Routinen kennt. Hier 'mal der CMPS03-Lesecode für den RP6. Es wird nur 1 Byte (Datareg) gesendet, dann werden entweder 1 oder 2 Bytes vom CMPS03 gelesen.
Vielleicht kannst du das ja auf deine I2C-Routinen anpassen.
Die Geschichte mit "Startbit" verstehe ich bei dir gar nicht,- evtl. ganz weglassen.

Gruß Dirk


// The I2C slave address of the compass module CMPS03 is 0xC0:
#define CMPS03_ADR 0xC0

// CMPS03 Data Registers:
#define GET_VERSION 0 // Software version
#define MEASURE_8_BIT 1 // 8-bit compass value
#define MEASURE_16_BIT 2 // 16-bit compass value
#define CALIBRATE 15 // Calibration (write only)

/**
* READ CMPS03 DATA REGISTERS
*
* This function reads the data registers of the CMPS03.
*
* datareg = 0 : Get the CMPS03 software version
* datareg = 1 : Read 8-bit compass value [0..254]
* datareg = 2 : Read 16-bit compass value [0..3599]
*
*/
uint16_t readCMPS03(uint8_t datareg)
{uint16_t result = 0xffff; uint8_t results[3];
I2CTWI_transmitByte(CMPS03_ADR, datareg);
if (datareg == MEASURE_16_BIT) {
I2CTWI_readBytes(CMPS03_ADR, results, 2);
result = (results[0] << 8) + results[1];
}
else {
result = I2CTWI_readByte(CMPS03_ADR);
}
return result;
}

RoboPunk
28.01.2008, 15:07
Was ist bei dir genau das "Datareg"?
Wenn ich beim NXT I2CWrite verwende, dann brauch ich noch drei Parameter:

- Den Port an dem er benutzt wird(das ist wahrscheinlich eine Besonderheit des NXT, weil sonst gibt es ja nur SCL und SDA)
- Die Anzahl der Bytes, die als Antwort erwartet wird
- Einen "inbuffer", das ist glaub ich dass was man senden will.

Was mich aber wundert, es gibt nichts wie "I2C_Start" oder "I2C-Stop" oder so. Eigentlich muss man dass doch zu Beginn einer Kommunikation schreiben, oder? Und was hat es mit dem "Repeated Startbit 0xC1" auf sich?

Im Moment bin ich etwas verwirrt.

Also jetzt hab ichs mal so probiert dass ich bloß die Kompassadresse sende und danach das Register 1 lese:
I2CWrite (cmps03, 1, 192);
I2CRead (cmps03, 1, wert);

Aber das gibt auch wieder nur den Wert 0 auf dem Display aus.

Dirk
28.01.2008, 19:30
Im Moment bin ich etwas verwirrt.

Kann ich verstehen. Leider kenne ich nicht die I2C-Funktionen, die du benutzt.
Vielleicht hilft da jemand, der sich damit auskennt oder du kannst eine Doku darüber finden.

Datareg ist ein Wert von 0..2.
0 -> Lesen der CMPS03-Firmwareversion
1 -> Lesen des 8-Bit Werts
2 -> Lesen des 16-Bit Werts

Gruß Dirk