-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Nibobee Liniensensoren kalibrieren

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    61
    Beiträge
    30

    Nibobee Liniensensoren kalibrieren

    Anzeige

    Zitat Zitat von workwind
    Die Kalibrierung wird mit schwarzem und mit weissem Untergrund durchgeführt, die Messung wird moduliert durchgeführt. Als Ergebnis erhält man 0 für schwarz und 1024 für weiss.
    Diese Anmerkung ist zwar nun schon ein Vierteljahr alt, hab sie aber erst heute gelesen.
    Deshalb meine Frage: Ist das wirklich so? 1024 (400h) nach dem Weissabgleich bei weissem Untergrund? Bei mir sieht das nach dem Kalibrieren so aus, wenn die Bee auf einem weißen Blatt steht - auf genau dem Blatt, mit dem auch kalibriert wurde!


    Auf dem schwarzen Blatt, mit dem kalibriert wurde, sind alle Werte 0 - reproduzierbar!
    Sind bei Dir die Weiß-Werte nach dem Kalibrieren tatsächlich alle 400h??? Dann wäre bei meiner Bee irgendwas noch nicht in Ordnung Für ganz unmöglich halte ich das nicht, da ich bisher noch keine wirklich vernünftige Linienverfolgung hinbekommen habe
    Mir scheint (aufgeschrieben habe ich es leider nicht), daß die Weiß-Werte etwas besser und gleichmäßiger geworden sind, nach dem ich kürzlich die Fototransistoren mit etwas Schrumpfschlauch versehen hatte.

    Kann aber auch Einbildung sein.

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Probier doch mal das von workwind gepostete Programm (weiter oben hier) aus, das funktioniert auf nem "normalen" Parcours wirklich gut.
    Schafft keine allzu engen Kurven oder ähnliches, aber z.b. die hier im Forum herumschwirrende Testunterlage dürfte kein Problem darstellen (wobei es bei der 8 innen natürlich an Logik fehlt).

    Allerdings hatte auch ich mitunter etwas, nun, merkwürdige Ergebnisse, ich habe den Eindruck, da gibt es irgendwo eine Art "Drift", ab und an zeigen die Sensoren Werte, die sie nicht haben können (ich hab meine Nase auch abgeschirmt).
    Leider hat meine Biene (noch...) kein Display, und mir die Werte mittels der vier LED`s ausgeben zu lassen würde doch in echte Forschungsarbeit ausarten..

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    61
    Beiträge
    30
    Zitat Zitat von Rabenauge
    Probier doch mal das von workwind gepostete Programm (weiter oben hier) aus, das funktioniert auf nem "normalen" Parcours wirklich gut.
    Schafft keine allzu engen Kurven oder ähnliches, aber z.b. die hier im Forum herumschwirrende Testunterlage dürfte kein Problem darstellen ...
    Genau das habe ich getan - sowohl in der völlig unveränderten Fassung von "workwind" als auch mit eigenen Experimenten und zusätzlichen Ausgaben auf das Display - der Effekt ist immer gleich: nach der ersten Kurve (egal ob links oder rechts) haut die Biene ab Ich verwende die originale "Test-Arena", die hier irgendwo zum Download angeboten wurde. Die Kurven sind freilich etwas eng und die Bee ist ganz schön schnell unterwegs, aber wenn das bei allen anderen Leuten klappt, dann sollte meine das auch auch können, oder? Vielleicht sind die Linien der "Arena" auch etwas schmal - bei mir sind das 6mm. Wie breit sind die Linien bei Euch?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Meine Linien sind zwischen 2mm (nur ein kurzes, relativ gerades Stück) und ca. 12mm breit.

    Ich hab eben mal das Isolierband, was _ich_ hier habe (k.A ob es unterschiedliche Breiten gibt?) gemessen, das ist sogar 17mm breit.
    Da man damit eh keine allzu engen Kurven kleben kann, ist das dann relativ leicht zu packen.

    Besser klappt workwind`s Programm übrigens, wenn man das Tempo etwas drosselt, dann können die Kurvenradien auch ein bisschen enger werden oder die Linien etwas schmaler.

    Ich denke aber, wenn es richtig gut werden soll, wird man um ein nachkalibrieren zur Laufzeit nicht drumherum kommen, es sei denn, man probiert es im dunklen Keller bei immer den selben Lichtverhältnissen.
    Die Methode habe ich schon beim RCx vor Jahren benutzt, damit kriegt man dann auch schonmal rote Linien auf blauem Untergrund noch gelöst..

    Wollen wir mal für die Geschichte nen extra Thread aufmachen?

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    So, _ein_ Mysterium dürfte geklärt sein:

    Ich habe eben ein wenig mit den Lichtsensoren gespielt.
    Zustand Biene: Akku eher leer als voll (ich hatte vorher die Motoren für Tests etwas gequält), Maske drauf, wie immer.
    Herumprobiert habe ich mit dem Liniensensoren-Programm aus dem Tutorial zur Biene, es zeigt Helligkeitsschwankungen durch aufleuchten verschiedener LED`s an.
    Ich habe dort eine Weile mit den Werten gespielt, und auf einmal fiel mir auf, dass ich die Werte plötzlich immer weiter herunterdrehen musste, bis die Biene noch "wenigstens etwas hell" registriert, obwohl sie auf weissem Zeichenkarton stand.
    Wie kann das denn sein??
    Als mir einfiel, dass ich vorher mit den Motoren gespielt hatte, hab ich mal eben die Biene ein Weilchen (wenige Minuten) zum laden geschickt und oh Wunder, alle LED`s fanden wieder Helligkeit.
    Also das unveränderte Program wieder laufen lassen und einfach mal nen Kaffe getrunken und zugesehen.
    Schwupps, fing die erste LED an zu blinken, ging aus, ein Weilchen später die nächste...
    Das war vor ca. 10 Minuten, inzwischen leuchtet noch eine, die erst bei einem Wert UNTER 70 "dunkel" anzeigen wird.

    Während ich weiter getippt habe, ist nun auch die letzte LED aus, das heisst, die Lichtsensoren liefern nur noch Werte unter 70, und das auf weissem Zeichenkarton.

    Alles klar, wenn ich jetzt die Biene wieder auflade, weiss ich, was passieren wird.
    Die Sensoren liefern abhängig von der Bordspannung unterschiedliche Werte....damit ist auch das Kalibrieren etwas tricky: wenn ich das bei halbvollen Akkus mache, stimmen die Werte bei richtig geladenen nicht mehr und umgedreht.
    Morgen probiere ich mal, wie lange man das Spiel mit vollen Akkus treiben kann, ehe sich spürbar was ändert, man kann es dann ja bei der Programmierung berücksichtigen.

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

    Nein, bei einem weisen Blatt wird nicht auf 1023 kallibriert. Wie das genau funktioniert habe ich aber auch noch nicht durchschaut und wohl deshalb den Nutzen auch noch nicht erkannt. Meine bee "schielt" mit dem linken Sensor etwas, deshalb ist sein Wert auch immer geringer. Von Links nach Rechts: Von der Linienlib berechneter Wert, Wert ohne IR-LED, Wert mit IR-LED:



    Direkt nach dem Kalibrieren wird bei allen Sensoren weis mit ca. 900 angezeigt, schwarz mit Werten <10, aber sobald ich die bee etwas drehe ist alles vorbei :(

    Die Idee mit den drei Sensoren ist ja recht nett, aber mässig gut umgesetzt. Viel besser wären drei LEDs (warum eigentlich IR-LEDs?) gewesen, in Fahrtrichtung jeweils vor dem Sensor angeordnet.

    Code:
     // nibobee: LCD 20x4 (LMC-SSC4A20) an Port C                   28.12.2009  mic
    
    #include <nibobee/iodefs.h>
    #include <nibobee/base.h>
    #include <nibobee/analog.h>
    #include <nibobee/motpwm.h>
    #include <nibobee/line.h>
    #include <nibobee/delay.h>
    #include <nibobee/led.h>
    #include <stdlib.h>
    #include "lcd_lib.h"
    
    void Msleep(uint16_t pause_ms) // für LCD-LIB
    {
    	delay(pause_ms);
    }
    
    void do_blink(uint8_t mask)
    {
      uint8_t i;
      for (i=0; i<5; ++i)
      {
        led_set(LED_L_RD, mask&0x01);
        led_set(LED_R_RD, mask&0x01);
        led_set(LED_L_YE, mask&0x02);
        led_set(LED_R_YE, mask&0x02);
        delay(200);
        led_set(LED_L_RD, 0);
        led_set(LED_R_RD, 0);
        led_set(LED_L_YE, 0);
        led_set(LED_R_YE, 0);
        delay(200);
      }
    }
    void liniensensoren_kalibrieren(void)
    {
       lcd_cls();                    // lcd Inhalt löschen
       lcd_locate(2,0);
       lcd_writeString("Kalibrieren");
       lcd_locate(2,3);
       lcd_writeString("Abbruch Sav sw ws");
    	line_readPersistent();
    
    	while(lcd_getkeys()<7)
    	{
    		if (lcd_getkeys()==1)
    		{
    			while (lcd_getkeys()==1) delay(1);
    			line_calibrateWhite();
    			do_blink(2);
    		}
    		if (lcd_getkeys()==2)
    		{
    			while (lcd_getkeys()==2) delay(1);
    			line_calibrateBlack();
    			do_blink(1);
    		}
    
    		set_output_groupbitval(IO_LEDS, L_YE, line_get(LINE_L)>160);
    		set_output_groupbitval(IO_LEDS, L_RD, line_get(LINE_L)>240);
    		set_output_groupbitval(IO_LEDS, R_YE, line_get(LINE_R)>160);
    		set_output_groupbitval(IO_LEDS, R_RD, line_get(LINE_R)>240);
    
    		if (lcd_getkeys()==4)
    		{
    			while (lcd_getkeys()==4)
    			{
    				delay(1);
    			}
    			line_writePersistent();
    			do_blink(3);
    		}
    		while(lcd_getkeys());
    		delay(100);
    	}
    }
    // http://www.roboternetz.de/phpBB2/viewtopic.php?t=51863
    int Batterie(void)
    {
    	unsigned char temp1,temp2;
    	uint16_t ADCresult;
    
    	while ((ADMUX & 0x07) != 0x04);
    
    	cli();
    
    	while (!(ADCSRA & (1 << ADIF)));   // wait for conversion complete
    	ADCSRA |= (1 << ADIF);              // clear ADCIF
    
    	//Registerinhalte retten
    	temp1 = ADCSRA;
    	temp2 = ADMUX;
    
    	ADMUX = (1 << REFS0) | (1 << REFS1) | ANALOG_VOLT;   //internal 2.56V reference with external capacitor
    
    	//ADCSRA löschen und neu setzen
    	ADCSRA = 0;
    	ADCSRA |= ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));   //ADC clock = Clock/128
    	ADCSRA |= (1 << ADEN);         //Enable ADC (das aktiviert die 2.56V Referenz)
    
    	//Warten bis Kondensator an ARef = 2.56V hat
    	//Messung an ARef ergab 1,2msec
    	delay(6);  // = ca. 5*Tau
    
    	//1. ADC Wandlung starten und Ergebnis ignorieren
    	ADCSRA |= (1 << ADSC);         // Start conversion
    	while (!(ADCSRA & (1 << ADIF)));  // wait for conversion complete
    	ADCSRA |= (1 << ADIF);              // clear ADCIF
    
    	//2. ADC Wandlung starten und Ergebnis übernehmen
    	ADCSRA |= (1 << ADSC);         // Start conversion
    	while (!(ADCSRA & (1 << ADIF)));  // wait for conversion complete
    	ADCSRA |= (1 << ADIF);              // clear ADCIF
    
    	ADCresult = ADCL + (ADCH << 8);
    
    	//Registerinhalte wiederherstellen
    	ADMUX = temp2;
    	ADCSRA = temp1 & ~(1 << ADSC);
    
    	//Warten bis Kondensator an ARef = AVcc hat
    	//Messung ergab sehr steile Flanke
    	delay(2);  //nicht notwendig, nur zur Sicherheit
    
    	ADCSRA |= (1 << ADSC);         // Start conversion
    
    	sei();
    
    	return ADCresult;
    }
    
    int main(void)
    {
    	uint8_t i=0;                  // Hilfsvariable
       analog_init();                // ist ätzend die Libteile einzubinden...
       line_init();
       motpwm_init();
    	enable_interrupts();
       led_init();
    
    	lcd_init();                   // lcd initialisieren
       lcd_cls();                    // lcd Inhalt löschen
       lcd_locate(2,0);
       lcd_writeString("NIBOBee mit LCD");
       lcd_locate(4,2);
       lcd_writeString("28.12.09 mic");
       led_set(0,1);
       delay(2000);
       led_set(0,0);
       lcd_locate(0,2);
       lcd_writeString("Bitte Taste druecken");
       while(!lcd_getkeys());
       i=16;
       
       while(1)
       {
          if(i & 8) led_set(0,1); else led_set(0,0);
          if(i & 4) led_set(1,1); else led_set(1,0);
          if(i & 2) led_set(2,1); else led_set(2,0);
          if(i & 1) led_set(3,1); else led_set(3,0);
          if(i & 16)
    		{
    			lcd_init();
    			while(lcd_getkeys());
    			delay(100);
    			while(!lcd_getkeys());
    			if(lcd_getkeys() & 8) liniensensoren_kalibrieren();
    			lcd_cls();
    			lcd_writeString("Liniensensoren");
    			while(lcd_getkeys());
    			lcd_locate(0,1);
       		lcd_writeString("L:");
       		lcd_locate(0,2);
       		lcd_writeString("C:");
       		lcd_locate(0,3);
       		lcd_writeString("R:");
       		i=0;
    		}
    
    		if(i & 1)
    		{
    		   motpwm_setLeft(-1000);
    		   motpwm_setRight(-1000);
    		}
    		else if(i & 2)
    		{
    		   motpwm_setLeft(1000);
    		   motpwm_setRight(1000);
    		}
    		else if(i & 4)
    		{
    		   motpwm_setLeft(0);
    		   motpwm_setRight(1000);
    		}
    		else if(i & 8)
    		{
    		   motpwm_setLeft(1000);
    		   motpwm_setRight(0);
    		}
    		else
    		{
    		   motpwm_setLeft(0);
    		   motpwm_setRight(0);
    		}
    
       	lcd_locate(15,0);
       	lcd_writeInteger(Batterie(),10);
       	lcd_locate(3,1);
       	lcd_writeInteger(line_get(LINE_L),10);
       	lcd_writeString(" ");
       	lcd_writeInteger(analog_getValue(ANALOG_L0),10);
       	lcd_writeString(" ");
       	lcd_writeInteger(analog_getValue(ANALOG_L1),10);
       	lcd_writeString("  ");
       	lcd_locate(3,2);
    		lcd_writeInteger(line_get(LINE_C),10);
       	lcd_writeString(" ");
    		lcd_writeInteger(analog_getValue(ANALOG_C0),10);
       	lcd_writeString(" ");
    		lcd_writeInteger(analog_getValue(ANALOG_C1),10);
       	lcd_writeString("  ");
       	lcd_locate(3,3);
    		lcd_writeInteger(line_get(LINE_R),10);
       	lcd_writeString(" ");
    		lcd_writeInteger(analog_getValue(ANALOG_R0),10);
       	lcd_writeString(" ");
    		lcd_writeInteger(analog_getValue(ANALOG_R1),10);
       	lcd_writeString("  ");
    		delay(100);
          i=lcd_getkeys();
    	}
       return 0;
    }
    Das Spannungsproblem dürfte mit meinen AAs nicht so dramatisch sein. Zur Darstellung der Werte ohne LCD: Lass dir die Werte doch blicken. Eine LED blinkt nacheinander die Ziffer der jeweiligen Stelle. Oder du "sendest" die Bits des Wertes in Nipples aufgeteilt nacheinender: 0123 4567 89. Zwischen den Nipples eine kurze Pause, zwischen den Werten jeweils eine ängere Pause: http://www.youtube.com/watch?v=TvZ_JJk_yJE

    Gruß

    mic

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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    61
    Beiträge
    30
    Zitat Zitat von Rabenauge
    Wollen wir mal für die Geschichte nen extra Thread aufmachen?
    Könne wir gerne machen
    Inzwischen habe ich aber Fortschritte gemacht:
    Das Verbreitern der Linien (mit einem schwarzen Colli-Marker) hat gar nichts gebracht, aber:
    Einen Teil des Problems habe ich vermutlich gefunden! Ich hatte aus rein ästhetischen Gründen (andere Forums-User haben es genau so gemacht) statt der unteren "Halbsphäre" einen halbierten Tischtennisball angeklebt:



    Nun habe mal versuchsweise die originale durchsichtige Halbsphäre drübergestülpt, wodurch die Liniensensoren einen ganzen Zentimeter höher liegen als vorher - da waren sie nur 0,5 cm über dem Boden:



    Der Erfolg war verblüffend: die Bee schafft jetzt problemlos die innenliegende "8" der "Linientestarena" - bei den engeren Kurven des äußeren Parcours steigt sie aber immer noch regelmäßig aus.
    Noch ein interessantes Ergebnis: durch Kalibrierung mit einer grauen Unterlage anstelle der weißen wurden die Ergebnisse noch besser, ohne daß ich jetzt genau verstehen würde, weshalb das so ist. Ich werde es mal genauer untersuchen.

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Was ein durcheinander hier... ich hoffe, ihr habe gelesen, was ich vorhin schrieb. Wahrscheinlich ist das Problem beim fahren sogar noch akuter, da die Motoren auch noch Strom fressen.

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Tja, wir sind schneller als twitter

    Die innere 8 konnte meine bee auch schon mit dem TT-Ball, allerdings nur im Halbdunkel: http://www.youtube.com/watch?v=WaxGDNcvVpo

    Je heftiger die Regelung reagiert, umso größer wird die Stromaufnahme der Motoren. Ich werde mal Testen wie die Liniensensoren mit meinem Ballast und den AAs reagieren.

    Meine Messung von oben zeigt auch die Batteriespannung an: 923
    (Gemessen mit der Funktion von Skroete: http://www.roboternetz.de/phpBB2/zei...ag.php?t=51863)
    Das wäre vielleicht ein Ansatz für eine Kompensation der Spannungsschwankungen.

    Gruß

    mic

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

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.245
    Ich schätze, den Referenzwert (der sich ja "verstellt" wenn die Spannung sich ändert) brauchen wir gar nicht.
    Das Programm von workwind beruht auf Vergleichen, es werden einfach die unterschiedlichen Werte der drei Sensoren benutzt.
    Die Strategie kommt also völlig ohne irgendwelche Referenzwerte aus, wenn ich das richtig verstehe.

    Ich hab mir ein ähnliches geschrieben, und es scheint bestens zu funktionieren, man muss nur etwas Unschärfe reinbringen, denke ich.
    In eine Richtung (wieso das in die andere noch nicht klappt, ist mir derzeit schleierhaft) fährt die Biene mit der Nase Kurvenradien von 3-4cm noch problemlos ab.
    Geht auch noch nach einer halben Stunde üben.
    Das heisst, wie es aussieht, ist der schwankende (weil von der Spannung abhängige) Wert völlig nebensächlich, man braucht gar keine fixen Werte.
    Es wird einfach immer der jeweils aktuelle Wert des interessanten Sensors als Referenz genommen und dann nur verglichen, ob der auf der anderen Seite heller oder dunkler sieht.
    Sollte, um auch einer komplizierten Linie zu folgen, eigentlich reichen, auch wenn man (ich schalte immer nur einen Motor, weil sie erst ab ca. 300 in jeder Fahrsituation _sicher_ laufen) im Grunde immer zickzack fährt.
    Aber das kann man noch ausbügeln, erst mal geht es mir darum, den Kurs zu schaffen, Eleganz und Tempo kommen später.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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