- LiFePO4 Speicher Test         
Ergebnis 1 bis 3 von 3

Thema: RP6 sucht und sammelt coladose

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384

    RP6 sucht und sammelt coladose

    Siehe mal das video an von meinen RP6 : er sucht und sammelt leere coladose. Das ganse naturlich nicht um nach eine party auf zu raumen, aber für unsere Wettkampf "Roborama". Da muss der Robby so schnell wie moglich 6 coladose suchen und nach eine bestimmte Stelle retournieren. Aber auch beim letzte Wettkampf war der RP6 gans gutt. Da hatte wir eine Teambuilding organisiert mit 3 verschiedene Aufgabe. Am 9uhr die (unbekannte) Aufgaben bekommen , am 15 h fangt der Wettkamp an !

    http://video.google.com/videoplay?do...91936793688895

    Teambuilding :

    www.robotmc.org

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.11.2003
    Ort
    Leipzig
    Alter
    37
    Beiträge
    578
    Cool, hast du gut gemacht!

    Kannst du sagen, wie die Erkennung Software mäßig funktioniert?
    Ich denke du suchst peilst die Mitte an, indem du das lokale Minimum der Messwerte ermittelst oder?

    MfG
    ACU
    http://www.roboterbastler.de
    endlich wieder online

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    An sich ist das relatif einfach : Der servo von Sharp IR fahrt verschieden positionen an. Dan wirt der ADC Wert eingelesen und gespeichert in eine Array. Am ende von Servoweg (pos 0 = 1 mS, pos 10 = 2 mS) wird der Array untersucht auf min. Werte. Das gibt dan 2 min. Variabelen : Eine ist der minimale Abstand das die Sharp IR hat gesehen, das andere ist die Servopos. die hiermit zusammen hangt. Mit diesen Werten wird dan der RP6 in die Richtung gesteuert wo das ein coladose sein soll . Hiebei die code von scanning :
    Code:
    int8_t Blik[14]={80,80,80,80,80,80,80,80,80,80,80,80,80,80,}; //meetwaarden Sharp IR onder
    int8_t BlikMax=80;	//hoogst gemeten waarde Blik sensor
    uint8_t imaxR=0;	//positie hoogste gemeten waarde Blik
    
    int8_t Wand[14]={80,80,80,80,80,80,80,80,80,80,80,80,80,80,}; //meetwaarden Sharp IR boven
    int8_t WandMax=80;	//hoogst gemeten waarde Wand sensor
    uint8_t imaxL=0;	//positie hoogste gemeten waarde Wand
    
    int16_t SharpVoor=0 ; //ADC2 ingang van M32
    int16_t SharpAchter=0; //ADC3 ingang van M32
    
    uint8_t up=1;
    uint8_t i=0;
    uint8_t state=0;	//toestand blik zoeken
    uint8_t refresh=2;	//Data volledige scan beschikbaar : refresh==2
    void ScanR(uint8_t min,uint8_t max,uint8_t time)
    { 
    	if (getStopwatch3()>time)
    		{
    		getAllSensors(); //ADC ingangen via I2C van basis halen
    		SharpVoor = readADC(ADC_3);//ADC3 ingang van M32 lezen
    		SharpAchter = readADC(ADC_2);//ADC2 ingang van M32 lezen
    		
    		//if(((adc0-adc1)>25)&((adc0-adc1)<500)) Blik[i]=adc0;else Blik[i]=0; //Blik detectie
    		if (adc0<100)adc0=100;
    		if (adc1<100)adc1=100;
    		Blik[i]=7500/adc0;
    		Wand[i]=7500/adc1;	//Wand detectie
    		
    		statusLEDs.byte=0b000000;
    		if (Blik[i]<70) statusLEDs.LED1=1;
    		if (Blik[i]<50) statusLEDs.LED2=1;
    		if (Blik[i]<40) statusLEDs.LED3=1;
    		if (Wand[i]<70) statusLEDs.LED4=1;
    		if (Wand[i]<50) statusLEDs.LED5=1;
    		if (Wand[i]<40) statusLEDs.LED6=1;
    		updateStatusLEDs();	
    		clearLCD();
    		writeStringLCD("Blik   Wand");
    		setCursorPosLCD(1,0);
    		writeIntegerLengthLCD(BlikMax,DEC,2);
    		setCursorPosLCD(1,5);
    		writeIntegerLengthLCD(imaxR,DEC,2);	
    		setCursorPosLCD(1,9);
    		writeIntegerLengthLCD(WandMax,DEC,2);
    		setCursorPosLCD(1,14);
    		writeIntegerLengthLCD(imaxR,DEC,2);	
    		
    		
    		if (min==max) i=min;
    		else
    			{
    		     if (up)i++ ; 
    			 else i--;
    			}
    		servo(2,(10+i));//Servo 2 = stekker 4
    		setStopwatch3(0);
    		if(i<=min) up=1;
    		if(i>=max)up=0; 
    		Wand[max+1]=Wand[max];	 //waarde invoeren  uiterste stand +1 
    		
    		
    		if((i==min)|(i==max))//Alleen update van Max waarden indien einde scanbereik
    			{
    			if (refresh<2) refresh++;
    			BlikMax=100;
    		
    			imaxR=0;
    			WandMax=100;
    			imaxL=0;
    			writeString_P("Blik RAW :");
    			for(uint8_t j=min;j<=max;j++)
    					{
    					writeInteger(Blik[j],DEC);
    					writeChar(',');
    					}
    			writeChar('\n');		
    			for(uint8_t j=0;j<=12;j++)
    					{
    					if((j<min)|(j>max)){Blik[j]=100;Wand[j]=100;}
    					if ((abs(Blik[j]-Wand[j+1])<18)) Blik[j]=90;
    					if (Blik[j]<BlikMax) {BlikMax=Blik[j];imaxR=j;}
    					if (Wand[j]<WandMax) {WandMax=Wand[j];imaxL=j;}
    					}
    			writeString_P("Blik DET :");		
    			for(uint8_t j=min;j<=max;j++)
    					{
    					writeInteger(Blik[j],DEC);
    					writeChar(',');
    					}
    			writeChar('\n');
    			writeString_P("Wand RAW:");
    			for(uint8_t j=min;j<=max;j++)
    					{
    					writeInteger(Wand[j],DEC);
    					writeChar(',');
    					}
    			writeChar('\n');
    			
    			
    			//writeInteger(BlikMax,DEC);
    			//writeChar(',');
    			//writeInteger(imaxR,DEC);
    			//writeChar(',');	
    			//writeInteger(state,DEC);
    			//writeChar(',');
    			//writeInteger(WandMax,DEC);
    			//writeChar(',');
    			//writeInteger(imaxL,DEC);
    			
    			}
    		}
    }

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad