-         

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 46

Thema: Odometrieproblem!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45

    Odometrieproblem!

    Anzeige

    So ich bin´s mal wieder...
    Hab mich nun an die Odometrie gewagt und leider (wie soll es auch anderst sein) funktioniert sie nicht.
    Im ASURO Band 2, soll man sich langsam an die Odometrie gewöhnen und fängt daher erstmal damit an, den ASURO geradeaus fahren zu lassen.
    Leider fährt mein ASURO eine leichte Rechtskurve!
    Was ist an meinem Programm falsch???

    Code:
    /*Geradeausfahren*/
    #include "asuro.h"
    
    //Schwellwert für die Hell/Dunkel-Unterscheidung
    //Eventuell muss damit etwas variiert werden
    #define TRIGGERLEVEL 600
    #define HYSTERESIS 10
    
    #define LOW 0
    #define HIGH 1
    
    int main(void)
    {
    	unsigned int data [2];
    	signed int status [2]={0,0};
    	signed int difference=0;
    	
    	Init();
    	MotorDir(FWD,FWD);
    	
    	while(1) {
    	
    		//Helligkeitswerte der Lichtschranken auslesen
    		OdometrieData(data);
    		
    		//Wechsel linker Sensor von niedrig auf hoch?
    		if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
    			status[0]=HIGH;
    			difference++; }
    			
    		//Wechsel linker Sensor von hoch auf niedrig?
    		if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
    			status[0]=LOW;
    			difference++; }
    			
    		//Wechsel rechter Sensor von niedrig auf hoch?
    		if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
    			status[1]=HIGH;
    			difference--; }
    			
    		//Wechsel rechter Sensor von hoch auf niedrig?
    		if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
    			status[1]==LOW;
    			difference--; }
    			
    		//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten Wertebereich verlässt
    		if(difference<-255) difference=-255;
    		if(difference>255) difference=255;
    		
    		//StatusLED noch entsprechend der erkannten Segmente aufleuchten lassen, grün für links, rot für rechts
    		StatusLED(status[0]+status[1]*2);
    		
    		//Zähldifferenz passemd auf die Motoren verteilen
    		if(difference>0) MotorSpeed(255-difference,255);
    		else MotorSpeed(255,255+difference);
    	}
    return 0;
    }

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    23
    Beiträge
    98
    Hast du das TRIGGERLEVEL schon angepasst?? Es dauert auch ein bisschen bis es sich einpendelt.

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45
    ich hab das selbe Problem wie NOMIS(Probleme mit Odometrie), ich erhalt nicht wirklich ein TRIGGERLEVEL, also kann ich sie auch nicht anpassen oder?
    und wenn ich doch ein Signal bekomm, wie pass ich das dann an?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    12.09.2007
    Alter
    23
    Beiträge
    98
    vielleich kann man es mal mit zwei probieren?

    mfg liggi
    Lieber am Asuro rumschrauben als alles andere.
    Meine Homepage

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Lass dir doch die Werte mal am Terminal anzeigen:

    Code:
    while(1)
    {
    OdometrieData(data);
    SerWrite("\n\r",2);
    PrintInt(data[0]);
    SerWrite("  ",2);
    PrintInt(data[1]);
    Msleep(500);
    }
    Ohne Ansteuerung der Motoren, dann kannst du die Räder mit der Hand drehen und die Werte austesten. So kannst du auch den Einfluß von Fremdlicht und die Wirkung von axial verschiebbaren Codescheiben auf die Werte sehen.

    Wenn du eine ältere Library (asuro.c) ohne PrintInt() und Msleep()verwendest:
    Code:
    void PrintInt(int wert)
    {
        char text[16]="      ";
        itoa(wert,text,10);
        SerWrite(text,strlen(text));
    }
    
    void Msleep(int dauer)
    {
        int z;
        for(z=0;z<dauer;z++) Sleep(36);
    }
    Triggerlevel sollte nun mindestens um Hysteresse kleiner als der max-Wert und mindestens um Hysteresse größer min-Wert sein. Bei z.B. min=150 zu max=600 wäre 400 ein möglicher Triggerlevel. Eine etwas größere Hysteresse (vielleicht 50-100) verringert Fehlzählungen.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45
    Es geht immer noch nicht
    ich bekomm im Terminal immer nur
    Code:
    LoggingOdometers V1.0 (2006-05-21, Arexx-Henk)
    und weiß nicht warum?
    Kann es sein, dass an meim ASURO was kaputt ist?

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Ich geh mal davon aus, dass dein asuro funktioniert. Fragen zum Odo-Logger kannst du auch direkt im arexx-Forum stellen, dort antwortet dir vermutlich Arexx-Henk selbst.

    Alternativ kannst du auch deinen eigenen "Datenlogger" schreiben, die wesenlichsten Teile dafür habe ich oben schon gepostet. Dann siehst du auch, wie das funktioniert, bei henks Programmen hast du vermutlich nur das Hex-File.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    versuche einfach mal, ohne die motoren einzuschalten, den aktuellen wert der Sensoren immer wieder in hyperterminal zu senden, so wie es radbruch oben schon gesagt hat. wenn du dann die räder langsam (von hand) drehst, sollten sich die werte verändern, je nachdem ob ein schwarzes oder ein weisses feld vor dem sensor ist. nicht verzweifeln, wir sind ja da
    kleinschreibung ist cool!

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.10.2007
    Ort
    Meensen
    Alter
    28
    Beiträge
    77
    hallo radbruch, mit deinem quelltext gibt es ein problem:

    Code:
    test.c: In function `main':
    test.c:20: error: `data' undeclared (first use in this function)
    test.c:20: error: (Each undeclared identifier is reported only once
    test.c:20: error: for each function it appears in.)
    make: *** [test.o] Error 1
    
    > Process Exit Code: 2
    weißt du auf anhieb warum er data nicht kennt? steht das nicht in asuro.h?

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Das ist kein "Quellcode", es sind nur Codeschnippsel die du in ein Programm einsetzen kannst. Die while-Schleife kommt in main(), PrintInt und Msleep in den Vorkopf. Variablen must du selbst anlegen.

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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