Wenn du z.B. 20 cm fahren willst:
move (80, FWD, DIST_MM(200), true);
Oder habe ich das Problem nicht kapiert?
Gruß Dirk
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
Wenn du z.B. 20 cm fahren willst:
move (80, FWD, DIST_MM(200), true);
Oder habe ich das Problem nicht kapiert?
Gruß Dirk
Ne scheinbar nicht
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
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
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
Das sind ja die Variablen mleft_dist und mright_dist, die als uint16_t definiert sind.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.
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
Ich habe jetzt folgendes probiert:
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.Code:uint16_t dist = mleft_dist; clearPosLCD(1,11,4); setCursorPosLCD(0,11); writeIntegerLengthLCD(dist,DEC,5);
Gruß Lee
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
Achso ok, dann werd ich das morgen mal so testen.
Gibts eine schnelle lösung das vernünftig anzeigen zu lassen?
Gruß Lee
Man müßte die Funktion writeIntegerLengthLCD in der RP6ControlLib.c umschreiben bzw. eine neue writeUIntegerLengthLCD:Gibts eine schnelle lösung das vernünftig anzeigen zu lassen?
int16_t würde zu uint16_t
itoa würde zu utoa
Gruß Dirk
Lesezeichen