- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 2 von 2

Thema: Software für Roboter effizienter gestalten

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355

    Software für Roboter effizienter gestalten

    Anzeige

    Powerstation Test
    Hallo RNler!

    Im Moment bastle ich wieder an meinem Roboter rum auf Basis eines ATmega644.

    Ich habe mehrere Probleme mit dem Code und hoffe, dass hier jemand helfen kann.

    Das 1. Problem ist, der Roboter scheint garnicht zu vergleichen ob Links oder Rechts mehr Platz frei ist, sondern dreht immer nach Links. Ich habe das Gefühl, dass der Code so nicht wirklich effizient ist, wie könnte man dieses "Geradeausfahren bis ein Hindernis kommt" so gestalten, dass ich die main() frei bekomme und andere Sachen während des Fahrens machen kann?

    Noch ein Problem ist die Kurskorrektur mittels dem HMC5883L Kompassmodul. Mir wurde ein P-Regler bzw. PI-Regler empfohlen jedoch habe ich diesbezüglich keinerlei Erfahrungen welchen Ansatz ich dafür verfolgen muss.

    Hier einmal die main():

    Code:
    int main(void)
    {
        init_SRF05();
        init_uart(9600);
        init_Servo();
        init_Timer1();
        
        i2c_init();
        // initialize compass
        init_HMC5883L();
        
        sei();
        
        headingDegrees = getHeading();
        heading_previous = headingDegrees;
        
        distL = SRF05_getDistance(left);
        distM = SRF05_getDistance(middle);
        distR = SRF05_getDistance(right);
        
        Mleftfwd();
        Mrightfwd();
        accelerate(1);
        
        while(1)
        {
            
            while(distM > threshold){
                distL = SRF05_getDistance(left);
                distM = SRF05_getDistance(middle);
                distR = SRF05_getDistance(right);   
            }
            
            if(distM < threshold && distR > threshold){
                
                while(distM < threshold){
                    setPWMleft(motor_values[maxspeed]);
                    setPWMright(motor_values[0]);
                    distM = SRF05_getDistance(middle);
                }            
                
                setPWMleft(motor_values[maxspeed]);
                setPWMright(motor_values[maxspeed]);
            }
            else if(distM < threshold && distL > threshold){
        
                while(distM < threshold){
                    setPWMleft(motor_values[0]);
                    setPWMright(motor_values[maxspeed]);
                    distM = SRF05_getDistance(middle);
                }    
                
                setPWMleft(motor_values[maxspeed]);
                setPWMright(motor_values[maxspeed]);
            }  
        }
    }
    Und hier habe ich nochmal eine Fahrschleife, nur dass anstatt dem Distanzsensor nun der Kompass abgefragt wird und der Kurs korrigiert wird. Ich scheitere an der Kombination von Hinderniserkennung & Vermeidung und der Kurskorrektur.

    Code:
            while( (headingDegrees < (heading_previous +  max_course_deviation)) && (headingDegrees > heading_previous -  max_course_deviation ) ){
                getHeading();
                _delay_ms(66);
            }
            
            if(headingDegrees > (heading_previous + max_course_deviation) ){
            
                while(headingDegrees > (heading_previous + max_course_deviation) ){
                    setPWMlinks(maxspeed + 50);
                    setPWMrechts(maxspeed - 50);
                    getHeading();
                    _delay_ms(66);
                }
                
                setPWMlinks(maxspeed);
                setPWMrechts(maxspeed);    
            }
            else if(headingDegrees < (heading_previous - max_course_deviation) ){
                
                while(headingDegrees < (heading_previous - max_course_deviation)){
                    setPWMlinks(maxspeed - 50);
                    setPWMrechts(maxspeed + 50);
                    getHeading();
                    _delay_ms(66);    
                }
                
                setPWMlinks(maxspeed);
                setPWMrechts(maxspeed);    
            }
    Bin für Hilfe dankbar!
    MfG Torrentula

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.059
    Hast du schon den Code im Simulator angeschaut? Vielleicht weißt du dann besser wo der Fehler ist. Probleme gibt es mit dem Simulator nur wenn man Datenübertragungen simulieren will (z.B. SPI, I2C,...).

    Um das Programm besser zu gestalten kann man mit Interrupts arbeiten. Man wählt z.B. eine Interrupt am Int0 Eingang und wenn sich der Pegel ändert springt er in die Interrupt Routine. Diese wird nur abgearbeitet wenn der Interrupt ausgelöst wird. Es gibt auch noch andere Interruptquellen wie z.B. Timer, ADC, UART,...

    MfG Hannes

Ähnliche Themen

  1. Licht-emittierende Solarzellen sind effizienter
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 1
    Letzter Beitrag: 12.11.2011, 16:22
  2. Effizienter 6-A-Schaltregler
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 12.05.2011, 14:00
  3. AVR40 Pins universell gestalten
    Von BlackDevil im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 15.05.2009, 17:16
  4. Effizienter Rechnen?
    Von BASTIUniversal im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 02.01.2008, 17:54
  5. Programm interruptgesteuert gestalten
    Von daiyama im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 02.02.2005, 19:01

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad