PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nach bestimmter Distanz Aktion ausführen



LeeTheMaster
26.03.2009, 19:00
Hallo erstmal,

Ich habe einen RP6 und möchte mir jetzt eine Art Neigungslogger bauen. Er bekommt also einen Neigungssensor. Soweit so gut. Nun soll nach einer bestimmten Distanz z.B. 20cm der Sensorwert ausgelesen und auf dem EEPROM des M32 gespeichert werden.

Den Teil mit dem speichern hab ich soweit schon, allerdings weiß ich nicht so richtig wie ich alle 20cm die Funktion aufrufen kann.

Ich habe mir mal die mleft_dist und mright_dist angeguckt aber die inkrementieren und nach ner Zeit dekrementieren sie dann. Da steig ich nicht so richtig durch.

Eine andere Idee war mit der aktuellen Geschwindigkeit zu berechnen, wie viel Zeit er benötigt, bis die Distanz abgefahren ist. Das wäre allerdings recht ungenau, falls sich die Geschwindigkeit ändert.

Also bin ich hier gelandet. Vielleicht hat ja einer von euch schonmal sowas ähnliches gemacht. Bin auf Ideen gespannt

Mit freundlichen Grüßen

Lee

Dirk
26.03.2009, 20:25
Wenn du z.B. 20 cm fahren willst:
move (80, FWD, DIST_MM(200), true);

Oder habe ich das Problem nicht kapiert?

Gruß Dirk

LeeTheMaster
26.03.2009, 20:31
Ne scheinbar nicht :D

Der RP6 soll nicht immer 20cm fahren -> messen -> fahren -> messen sondern ich will ihn per RC5 Fernsteuerung bedienen. (entspricht dem TV-Remote Beispiel der Base umgeschrieben auf M32)

Das funktioniert auch wunderbar, nur mein Problem ist jetzt, dass ich nicht weiß, wie ich alle 20cm eine Funktion aufrufen kann, die die Messwerte speichert

/EDIT: Es soll am Ende eine Art Streckenprofil entstehen. Ich fahre also mit dem Roboter gesteuert per Fernbedienung die Strecke ab und dieser zeichnet die Winkel alle 20cm auf.

Gruß Lee

Dirk
26.03.2009, 20:50
Ok, also der RP6 soll nicht anhalten.

Ich würde mal mit den Makros:
getLeftDistance()
getRightDistance()
... experimentieren.

Die lesen die Encoderimpulse direkt aus.

Gruß Dirk

LeeTheMaster
26.03.2009, 20:53
Mh die geben wie schon oben beschrieben nur Werte zurück die bis 26000 oder so ansteigen und dann wieder bis knapp unter 0 sinken. Ich wüsste jetzt nicht auf anhieb wie man das lösen könnte.

Gruß Lee

Dirk
26.03.2009, 21:05
die geben wie schon oben beschrieben nur Werte zurück die bis 26000 oder so ansteigen und dann wieder bis knapp unter 0 sinken. Ich wüsste jetzt nicht auf anhieb wie man das lösen könnte.
Das sind ja die Variablen mleft_dist und mright_dist, die als uint16_t definiert sind.
Wenn du int16_t nimmst, dann kann das so ähnlich aussehen, wie du beschrieben hast.

Ich würde uint16_t nehmen:
var = getLeftDistance();

Dann mit einer 2. Variable vergleichen, die immer um einen festen Betrag hochgezählt wird. Der Betrag entspricht der 20cm Distanz.
Der Überlauf ist kein Problem, weil ja var und deine 2. Variable beide überlaufen.

Gruß Dirk

LeeTheMaster
26.03.2009, 21:16
Ich habe jetzt folgendes probiert:


uint16_t dist = mleft_dist;
clearPosLCD(1,11,4);
setCursorPosLCD(0,11);
writeIntegerLengthLCD(dist,DEC,5);

Das gibt werte aus bis etwa 33000 und dann geht das ganze rückwärts. Ab 10000 steht dann plötzlich ein minus davor (trotz uint16_t). Danach geht es dann auf die 0 zu und wieder von vorn.

Gruß Lee

Dirk
26.03.2009, 21:23
Das liegt an writeIntegerLengthLCD. Die Funktion stellt die uint16_t als Integer dar.
Tatsächlich zählt aber mleft_dist bis 65535 und läuft dann über.
Angezeigt auf dem LCD wird Integer bis 32767, danach negative Werte.

Gruß Dirk

LeeTheMaster
26.03.2009, 21:29
Achso ok, dann werd ich das morgen mal so testen.

Gibts eine schnelle lösung das vernünftig anzeigen zu lassen?

Gruß Lee

Dirk
26.03.2009, 21:44
Gibts eine schnelle lösung das vernünftig anzeigen zu lassen?
Man müßte die Funktion writeIntegerLengthLCD in der RP6ControlLib.c umschreiben bzw. eine neue writeUIntegerLengthLCD:
int16_t würde zu uint16_t
itoa würde zu utoa

Gruß Dirk