Informatik und Kram

Da wir lange nicht wußten, wo wir das für die Uni ausgearbeitete Material unterbringen sollten und auch einen schrecklichen Drang hatten der Welt diverse Sachen aufzudrücken...

Er lebt!
de-flagge aktiviert en-flagge deaktiviert

Er ist wieder unterwegs! Nach wochenlangem Grübeln, Messen, Layouten und Platinen-Ätzen ist er endlich unterwegs, um die WG unsicher zu machen: der Afterburner!
Hier mal ein kleines Video, funktioniert trotz ziemlich grober Programmierung und fehlender Kalibrierung erstaunlich gut.

Das Video

Die neue Technik

Neu sind diesmal dazugekommen:
  • 2. Atmega zur PWM-Servo-Steuerung
  • Servo, um den Distanz-Sensor zu drehen
  • Sharp GP2D12 Distanz-Sensor (10-80cm, Analog-Ausgang)

  • Den Sharp GP2D12-Sensor kann man hervorragend mit dem ADC-Wandler des Atmega8 auslesen. Den Sensor kann man direkt an PC0 anschliessen und in digitale Werte umwandeln.
    Da dieser Sensor ziemlich empfindlich gegen Spannungsspitzen ist, empfiehlt es sich, zwei Kondensatoren in die Nähe vom Sensor zwischen + und - zu hängen, einmal 100 nF und einmal 100 uF.
    Der Code zum Umwandeln d. Analog-Wertes und für die Reaktion d. Robos:
        int sample,i,j,value, count1, count2, left, right, try;
        /* Interne Referenz-Spannung (2,56V) verwenden */
        ADMUX=0xC0;
        ADCSRA=0x80;
        count1 = 0;
        count2 = 0;
        try = 0;
        left = 0;
        right = 0;
        while(1){
    	    if(left == 1){
    		    PORTC |= (1 << 4);
    		    PORTC &= ~(1 << 3);
    		    wait_ms(100);
    		    try++;
    	    }
    
    	    if(right == 1){
    		    PORTC |= (1 << 3);
    		    PORTC &= ~(1 << 4);
    		    wait_ms(100);
    		    try++;
    	    }
    
    	    if(right != 1 && left !=1 ){
    		    PORTC |= (1 << 3);
    		    PORTC |= (1 << 4);
    		    wait_ms(100);
    		    try = 0;
    	    }
    
    	    count1 = 0;
    	    count2 = 0;
    	    for(j=0;j<10;j++){		 
    		    sample=0;
    		    for(i=0;i<32;i++){
    			    ADCSRA |= (1 << 6);
    			    while(ADCSRA & (1<<ADSC)){
    				    ;
    			    }
    
    			    sample+=ADCW;
    		    }
    		    value=sample/32;
    		    if(value < 300){
    			    count1 ++; // counter für weg frei
    		    }else{
    			    count2 ++; // counter für weg versperrt
    		    }
     	    }
    
    	    if(count1 > count2){
    		    {
    			    char buffer[20];
    			    lcd_clear();
    			    lcd_string("No Obstacles.Go!");
    			    set_cursor(0,2);
    			    itoa(value, buffer, 10);
    			    lcd_string( buffer );
    		    }
    		    if(left == 1){
    			turn_left();
    			wait_ms(100);
    			left = 0;
    		    }
    		    if(right == 1){
    			    turn_right();
    			    wait_ms(100);
    			    right = 0;
    		    }
    		    if(left != 1 && right != 1){
    		    	drive();
    		    }
    			
    	    }else{
    		    {
    			    char buffer[20];
    			    lcd_clear();
    			    lcd_string("Obstacle! Stop! ");
    			    set_cursor(0,2);
    			    itoa(value, buffer, 10);
    			    lcd_string( buffer );
    		    }
    		    stop_slow(); // bei Hindernis anhalten, Kopf drehen
    
    		    if(try >= 4){
    			    go_back();
    			    wait_ms(100);
    			    try = 0;
    		    }
    
    		    if(right == 1 || left != 1){
    			    right = 0;
    			    left = 1;
    		    }else{
    			    if(left == 1){
    				    left = 0;
    				    right = 1;
    			    }
    		    }
    	    }
         }
    
    Ja, ich weiß, dem Meissner sträuben sich jetzt wahrscheinlich wieder die Haare, weil der Code wahrscheinlich noch super vereinfacht/gekürzt werden kann, aber ich hab jetzt echt keinen Bock mehr im Moment. Bin dankbar für alle Verbesserungsvorschläge!
    Ich habe immer noch leichte Spannungs-Spitzen und extreme Messwerte, man merkt es, wenn er bei gerader Fahrt ohne Hindernisse trotzdem stehenbleibt..Bin noch nicht draufgekommen, ob es Spannungsschwankungen sind, die die Motoren irgendwie verursachen (die Masse vom Atmega8, dem L293D und dem IR-Distanz-Sensor GP2D12 müssen zusammenhängen), oder ob es einfach nur Erschütterungen sind..
    Wie ihr seht bilde ich schon den Mittelwert aus 32 Messungen, und entscheide dann auch erst nach 10-maligem Zählen, ob ein Hindernis da ist oder nicht, also - äh - kein Plan im Moment, da muß wahrscheinlich noch ein bißchen Entstörtechnik und Mathe her.

    Bilder

    Der Sensor auf dem Servo-Hals in seinem "Gehäuse":
    Die neuste Platine
    Die Platine für die Servo-Steuerung:
    Alles zusammen:

    --- UPDATE 07.04.2008 ---

    Heute hab ich mir mal WD-40, zwei Click-Schalter und sechs-zackige Servo-Kränze besorgt.
    Das WD-40, ums Getriebe mal ordentlich zu ölen, jetzt fährt er endlich mal wieder geradeaus :-)
    Und die Servo-Kränze hab ich innenliegend je auf eine Getriebe-Stange gemacht, um damit die Click-Schalter auszulösen und so einen minimalistischen Rad-Encoder zu basteln.
    Soweit so gut, die Teile festgeklebt, und bis jetzt aber erstmal in ner einfachen Schleife die Auslöser gezählt, was soweit ganz gut funktioniert..
    Als nächstes muss ich mich jetzt halt erstmal mit interrupts auseinandersetzen, um die Schalter regelmässig auszulesen..
    Wie immer - Tips, Ratschläge, Kommentare sehr willkommen!

    Kommentare

    Hübsch, hübsch... Wir wollten schon immer einen kleinen Staubsauger für unsere Wohnung haben :).
    Aber sag' mal: warum hat er so einen Linksdrall?

    Hi! Der Linksdrall ist ungewollt, war wohl irgendwo ein mechanischer Hänger, ich hab das Gehäsue noch nicht wirklich 100% ausgefeilt..Hab eben gerade WD-40 draufgehauen, jetzt läuft das Getriebe viel leiser, und er fährt auch wieder geradeaus..Ausserdem mal nen 8-Zackigen Servo-Kranz auf die Achsen geschraubt, damit will ich nen Klick-Schalter auslösen, um wenigstens grob abzuschätzen, wie schnell die Motoren getrennt laufen...

    der kranz hat 6 zacken du rechenmonster. muhaaa!

    uh, äh, stimmt...und was waren nochmal 2 Fototransistoren und 2 Fototransistoren? Muharhar, ich rechne nicht mehr mit Zahlen, nur noch mit komischen griechischen Zeichen!

    Kommentar schreiben