- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: In den Anfängen der Odomedrieauslesung

  1. #1
    Neuer Benutzer
    Registriert seit
    20.11.2006
    Alter
    36
    Beiträge
    4

    In den Anfängen der Odomedrieauslesung

    Anzeige

    Powerstation Test
    Hallo zusammen
    Ich habe mich mal an die berühmt berüchtigte Odometrie gewagt. Und will einfach mal den Zustand der linken Schranke mit den LED's ausgeben.
    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	unsigned int data[2];		// Speicher breitstellen
    	Init();
    	while(1)
    		{
    		OdometrieData(data);		// Auslesen
    		if(data[0]>512)			//Wenn links dunkel
    			{
    			BackLED(ON,OFF);	//Linke LED on
    			}
    		else
    			{
    			BackLED(OFF,ON);  //Wenn links hell , dann Rechte LED ON
    			}
    		}
    	while(1);
    	return 0;
    }
    Leider passiert überhaupt nichts....

    Achja, schalten sich die Dioden D13 und 14 von selbst ein, oder muss ich die auch noch rumkommandieren.

    Danke, im Voraus.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    23.12.2005
    Alter
    94
    Beiträge
    86
    nix da.... die backleds und die odo liegen auf einem pin
    lass die backLEDs aus
    und
    Encoder_Init();
    Encoder_Set(0,0);
    sollte noch an den anfang nach Init();
    um die encoder zu initalisieren

    ach ja und Die encoder daten geben doch die ticks aus und nicht den helligkeitswert aus!? (ich weis bei der lib-doc stehts anders drin)

  3. #3
    Neuer Benutzer
    Registriert seit
    20.11.2006
    Alter
    36
    Beiträge
    4
    Cool, danke. Das mit den Back LED's wusste icht nicht.

    Öhm kann es sein, dass das mit den Encoder Daten nur bei einer erweitertern "Asuro.h" funzt, beziehungsweise, dass er dann die Ticks direkt augibt?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    23.12.2005
    Alter
    94
    Beiträge
    86
    ja... bei odometrie arbeitest du besser mit der erweiterten lib... obwohls bei mir auch nich richtig klappen will

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

    Ich habe mich mal an die berühmt berüchtigte Odometrie gewagt.
    Sehr mutig. *lob*

    Ich verwende die verschiedenen Farben der StatusLED zur Anzeige der Odometrie-Ergebnisse. Die BackLEDs werden nicht nur mit den selben Pins angesteuert, sie stören auch die Odometrie:

    Code:
    unsigned int data1[2], data2[2];
    
    BackLED(OFF,OFF);
    Sleep(200);
    
    LineData(data1);
    LineData(data2);
    
    SerWrite("\n\r",2);
    PrintInt(data1[0];
    Serwrite(" - ",3);
    PrintInt(data1[1];
    SerWrite("\n\r",2);
    PrintInt(data2[0];
    Serwrite(" - ",3);
    PrintInt(data2[1];
    
    BackLED(ON,ON);
    Sleep(200);
    
    LineData(data1);
    LineData(data2);
    
    SerWrite("\n\r",2);
    PrintInt(data1[0];
    Serwrite(" - ",3);
    PrintInt(data1[1];
    SerWrite("\n\r",2);
    PrintInt(data2[0];
    Serwrite(" - ",3);
    PrintInt(data2[1];
    Um die Odometrie zu verstehen, sollte man nicht mit den Funktionen der erweiterten Libs beginnen. *tippgibt*

    Gruß

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

  6. #6
    Neuer Benutzer
    Registriert seit
    20.11.2006
    Alter
    36
    Beiträge
    4
    Hey, habe gerade mal dein Programm studiert. Damit willst du beweisen, dass die Back LED's die Resultate verfälschen? Bzw. dass dann nicht zweimal der gleiche Wert herauskommt?

    Öhm, hast du LineData mit OdometrieData verwechelt oder klemmts bei mir?

    Und noch eine Frage, warum lässt du den Asuro schlafen vor dem Auslesen der Daten?

    Ich versuche mal mein Asuro ein paar Ticks weit fahren zu lassen, vorerst ohne die erweiterte LIB
    Mein Ansatz: Wenn die Differenz zwischen einem alten Wert und dem aktuell ausgelesenen Wert genügend gross (denke so 200) , dann ist der wechsel passiert.

    @ m1ch15inner
    Ich habe mir trotztem einmal die erweiterte Lib heruntergeladen. Bin aber noch nicht ganz schlau geworden was ich mit den Funktionen alles Anfangen kann.
    Habe mir mal die Go() und die Turn() Funktion angeschaut in deinem Thread

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    oder klemmts bei mir?
    Ne, bei mir klemmts, ich bin noch voll im Liniensuchwahn. Es soll selbstverständlich OdometrieData() heisen, alles andere hat hier keinen echten Sinn. Sowas passiert, wenn man den Code ungetestet auf die Reise schickt...

    Also ich habe bei meinen Odo-Spielereien unter anderem festgestellt, dass wenn man die BackLEDs anhat und dann mehrfach den Odo-Wert ausliest, sich bei der ersten Lesung Fehler ergeben. Ich weis nicht, ob das Licht der LED oder das automatische Umschalten der BackLEDs auf die ODO-LEDs den Effekt verursacht. Der Sleep() wartet bis die LED richtig brennt bzw. aus ist. Hier nun der bearbeitete Code:

    Code:
    #include "../inc/asuro.h"
    #include "../inc/asuro.c"
    
    int main(void) {
    unsigned int data1[2], data2[2], data3[2];
    
    Init();
    do{
    
    BackLED(OFF,OFF);
    Sleep(200);
    
    OdometrieData(data1);
    OdometrieData(data2);
    
    SerWrite("\n\n\rBackLEDs(OFF,OFF)",20);
    SerWrite("\n\rErste Messung:  ",18);
    PrintInt(data1[0]);
    SerWrite(" - ",3);
    PrintInt(data1[1]);
    SerWrite("\n\rZweite Messung: ",18);
    PrintInt(data2[0]);
    SerWrite(" - ",3);
    PrintInt(data2[1]);
    
    BackLED(ON,ON);
    Sleep(200);
    
    OdometrieData(data1);
    OdometrieData(data2);
    OdometrieData(data3);
    
    SerWrite("\n\rBackLEDs(ON,ON)",17);
    SerWrite("\n\rErste Messung:  ",18);
    PrintInt(data1[0]);
    SerWrite(" - ",3);
    PrintInt(data1[1]);
    SerWrite("\n\rZweite Messung: ",18);
    PrintInt(data2[0]);
    SerWrite(" - ",3);
    PrintInt(data2[1]);
    SerWrite("\n\rDritte Messung: ",18);
    PrintInt(data3[0]);
    SerWrite(" - ",3);
    PrintInt(data3[1]);
    
    }while (1);
    return 0;
    }
    Entschuldigung nochmals für den schludrigen ersten Code.

    Der "Fehler" tritt offensichtlich nur bei der ersten linken Lesung auf. Rechts ist der Effekt fast nicht zu erkennen (wenn man davon absieht, dass sich die Pegel insgesamt erhöhen!):

    BackLEDs(OFF,OFF)
    Erste Messung: 494 - 219
    Zweite Messung: 494 - 219
    BackLEDs(ON,ON)
    Erste Messung: 783 - 366
    Zweite Messung: 558 - 363
    Dritte Messung: 558 - 363
    Unerwarteterweise erhalte ich direkt nach dem Einschalten folgende Ausgabe:

    BackLEDs(OFF,OFF)
    Erste Messung: 267 - 663
    Zweite Messung: 505 - 668
    BackLEDs(ON,ON)
    Erste Messung: 750 - 713
    Zweite Messung: 569 - 712
    Dritte Messung: 569 - 712

    BackLEDs(OFF,OFF)
    Erste Messung: 509 - 670
    Zweite Messung: 509 - 670
    BackLEDs(ON,ON)
    Erste Messung: 751 - 713
    Zweite Messung: 569 - 712
    Dritte Messung: 569 - 712

    BackLEDs(OFF,OFF)
    Erste Messung: 508 - 670
    Zweite Messung: 508 - 670
    BackLEDs(ON,ON)
    Erste Messung: 751 - 713
    Zweite Messung: 570 - 712
    Dritte Messung: 570 - 712
    Wenn die Wertänderung größer als z.b. 200 ist sollte funktionieren solange keine "Ausrutscher" auftauchen.

    Schönes Ostern-WE noch

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

  8. #8
    Neuer Benutzer
    Registriert seit
    20.11.2006
    Alter
    36
    Beiträge
    4
    Cool, danke für deinen Code.

    Meine Tickzählung will noch nicht so recht funktionieren...

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Ein kleines Beispiel, hier wird die StatusLED mit der Raddrehung geschaltet:

    Code:
    #include "../inc/asuro.h"
    #include "../inc/asuro.c"
    
    /* Pegel fuer low und high */
    /* (mein asuro hat grad keine Abdeckungen ueber den Sensoren) */
    #define schwelle0 400
    #define schwelle1 600
    
    int main(void) {
    unsigned int odo_data[2];
    unsigned char odo_status[2];
    
    
    Init();
    /* Vorsichtshalber erst eine Dummy-Messung */
    OdometrieData(odo_data);
    OdometrieData(odo_data);
    /* Startwerte setzen*/
    odo_status[0] = odo_data[0] > (schwelle0+schwelle1)/2;
    odo_status[1] = odo_data[1] > (schwelle0+schwelle1)/2;
    
    do{
    	OdometrieData(odo_data);
    	if ((odo_status[0]) && (odo_data[0] < schwelle0)) {
    		odo_status[0] = !odo_status[0];
    		StatusLED(OFF);
    	}
    	if ((!odo_status[0]) && (odo_data[0] > schwelle1)) {
    		odo_status[0] = !odo_status[0];
    		StatusLED(RED);
    	}
    	if ((odo_status[1]) && (odo_data[1] < schwelle0)) {
    		odo_status[1] = !odo_status[1];
    		StatusLED(OFF);
    	}
    	if ((!odo_status[1]) && (odo_data[1] > schwelle1)) {
    		odo_status[1] = !odo_status[1];
    		StatusLED(YELLOW);
    	}
    
    }while (1);
    return 0;
    }
    Nur als Anregung, viele Wege führen hier zum Ziel. Ich hoffe, diesmal funzt es auf Anhieb...

    Gruß

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

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.066
    warum includierst du die .c? die .h sollte reichen
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen