-         

Ergebnis 1 bis 10 von 10

Thema: Nach bestimmter Distanz Aktion ausführen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22

    Nach bestimmter Distanz Aktion ausführen

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Wenn du z.B. 20 cm fahren willst:
    move (80, FWD, DIST_MM(200), true);

    Oder habe ich das Problem nicht kapiert?

    Gruß Dirk

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Ich habe jetzt folgendes probiert:

    Code:
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    26.03.2009
    Beiträge
    22
    Achso ok, dann werd ich das morgen mal so testen.

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

    Gruß Lee

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •