-
        

Ergebnis 1 bis 6 von 6

Thema: 3 Sensoren zum Verfolgen der Linie?

  1. #1

    3 Sensoren zum Verfolgen der Linie?

    Anzeige

    Hallo;

    Ich bin noch kein Experte mit dem Asuro, aber habe mich trotzdem schon mal daran versucht ihn etwas umzubauen. Mein Ziel ist es 3 Sensoren zum Verfolgen der Linie zu haben (fordert zwar mehr den Prozessor, finde ich aber einfach besser).

    Die Liniensensoren werden ja über den A/D Wandler ausgelesen und da ich die Odometrie überhaupt nicht brauche, dachte ich mir, ich benutze einen A/D Port der Odometrie (mir ist klar, dass da die BackLEDs mit dranhängen und die nicht mehr funktionieren wenn man da was ändert).


    Hir mal der Schaltplan für den A/D Port ADC0 (Pin 23), da hängt normalerweise die rechte Odometrie dran, die ich netfernt habe. Ich habe einfach die Schaltung für die Liniensensoren eins zu eins kopiert und natürlich die selben Bauteile verwendet.
    Code:
     
                                      U+
                                      | 
                              Fototransistor
                                      |
                                      |
              A/DC 0 (Pin23) ---------
                                      |
                                      |
                               Widerstand (20 kOhm)
                                      |
                                    GND
    In der asuro.c habe ich die Funktion für das auslesen der Fototransistoren wie folgt umgeschrieben:

    Code:
    void LineData(unsigned int *data)
    {
    	ADMUX = (1 << REFS0) | IR_LEFT;	// AVCC reference with external capacitor
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[0] = ADCL + (ADCH << 8);
    	
    	ADMUX = (1 << REFS0) | IR_RIGHT;	// AVCC reference with external capacitor
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[1] = ADCL + (ADCH << 8);
    	
    	ADMUX = (1 << REFS0) | WHEEL_RIGHT; // AVCC reference with external capacitor
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	data[2] = ADCL + (ADCH << 8);	
    }
    Nun zu meinem Problem, grundsätzlich funktioniert es, ich sehe hell/dunkel Unterschiede, allerdings werden nur Werte zwischen 0 und 8 zurückgegeben.
    Ich verstehe das nicht ganz, da ich die selben Bauteile wie für die Liniensensoren verwendet habe und zum Auslesen ja auch die selbe Referenzspannung benutzt wird.

    Hat jemand eine Idee, woran das liegen könnte?

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    was ist WHEEL_RIGHT? was wurde hier definiert?

    ansonsten kannst du mal die widerstände nachmessen... ich denke zum schutz der backleds ist noch ein zusätzlicher widerstand auf der strecke, oder?
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    @GrimReaper
    Hat jemand eine Idee, woran das liegen könnte?
    Ich kann kein C, daher kann ich es nicht aus deinem Code auslesen.
    Könnte es sein, dass bei den AD-Eingängen an denen die Phototransistoren angeschlossen sind die internen Pullups aktiviert sind?

  4. #4
    @dalmator:

    "WHEEL_RIGHT" definiert ursprünglich den Sensor für die rechte Odometrie, sprich über welchen Pin am Prozessor die rechte Odometrie ausgelesen werden soll. Das ist im einzelnen in der asuro.h definiert. Da ich die rechte Odometrie runtergelötet habe und stattdessen einen dritten Liniensensor angeschlossen habe, habe ich einfach "WHEEL_RIGHT" angegeben, um anzugeben über welcher Pin mein eigener Schaltkreis abgefragt werden soll. Habe das mit Hilfe das Datenblatts des Prozessors nachgeprüft, die Definition stimmt soweit (ich bekomme grundsätzlich ja auch Werte, nur halt keine verwertbaren).

    Der ursprüngliche Schaltkreis für die Odometrie/rechte BackLED auf der rechten Seite ist komplett lahmgelegt und die rechte BackLED funktioniert nicht mehr. Habe einen komplett neuen Schaltkreis gemacht und diesen an die selben Spannungsquellen wie die Liniensensoren angeschlossen und halt an den A/D Pin der rechten Odometrie, um Werte auslesen zu können.


    @recycle

    In dem Code steht nur, wie die Liniensensoren ausgelesen werden sollen, also die genauen Angaben, was der A/D-Wandler machen soll. Die ersten beiden Blöcke geben an, wie die beiden original Liniensensoren ausgelesen werden sollen (der Teil wurde nicht verändert und liefert auch korrekte Werte). Der dritte Block ist einfach eine Kopie der ersten, nur mit der Änderung, dass der Pin, über den ursprünglich die rechte Odometrie ausgelesen wurde, auch noch ausgelsen werden soll. Da ich für diesen dritten Liniensensor bzw. seinen Schaltkreis die selben Bauteile wie für die original Liniensensoren verwendet habe und auchndie selben Parameter zum Auslesen angegeben habe wundert es mich halt, dass keine verwertbaren Werte rauskommen (0-8 statt 0-1023).


    Interne Pullups sagt mir grade nichts, werde das nochmal nachlesen, aber eigentlich werden alle 3 Pins gleich ausgelsen, insofern komisch, dass nur einer schlechte Werte liefert.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    welche fototransistoren werden hier verwendet?

    mfg

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    die internen pullups (eingebaute widerstände an den ports) werden folgendermaßen deaktiviert:

    als beispiel nehme ich den pin 1 am port b, du musst das programm an den fettgedruckten stellen entsprechend anpassen.

    DDRB |= 0x02; // hier den entsprechenden hex wert eintragen. pin0 = 0x01, pin 1 = 0x02, pin 2 = 0x04, pin 3 = 0x08, pin 4 = 0x10, pin 5 = 0x20, pin 6 = 0x40, pin 7 = 0x80.
    PORTB &= ~(0x02);

    dann das auslesen nochmal ausprobieren.
    kleinschreibung ist cool!

Berechtigungen

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