- fchao-Sinus-Wechselrichter AliExpress         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 46

Thema: Code aus dem Band I für US funktioniert nicht mit neuer Lib

  1. #31
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Anzeige

    Praxistest und DIY Projekte
    schaue dir die datei ultrasoni.c in der 2.7.1 lib an, dort ist beschrieben was zu tun ist...
    gruß inka

  2. #32
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Heureka, Kompilierproblem gelöst!

    In die asuro.h (bei mir unter c:\asuro_src\asurolib\lib ) folgenden Code (gefunden auf
    http://www.henkessoft.de/Roboter/ASURO.htm) eingefügt:

    Code:
    /*****************ultrasonic********************************/
    /**
     * being used insted TIMER2_OVF_vect during ultrasonic polling
     */
    ISR(TIMER2_COMP_vect)
    {
       //TCNT2 += 0x25; //Wichtig!! Die Zeile muss entfernt werden, damit es funktioniert.
       count36kHz++;
       if(!count36kHz) timebase++;
    }
    
    /**
     * initialises the Ultrasonic module
     * this function is automaticly called by Chirp
     */
    void InitUltrasonics(void)
    {
       // Change Oscillator-frequency of Timer 2
       // to 40kHz, no toggling of IO-pin:
       TCCR2  = (1 << WGM21) | (1 << CS20);
       OCR2   = 100;              // 40kHz @8MHz crystal
       TIMSK |= (1 << OCIE2);     // OCIE2:  Timer/Counter2 Output Compare Match Interrupt Enable
    
       ADCSRA = (0 << ADEN);      // deactivate ADC
       ACSR  |= (1 << ACIS1);     // Comparator Interrupt on Falling Output Edge
    
       ADMUX  = 0x03;             // connect ADC3-input with comparator
       SFIOR |= (1 << ACME);      // connect ADC multiplexer to comparator
       DDRD  &= ~(1 << 6);        // use Port D Pin 6 as input (AIN0)
    }
    
    /**
     * restores the hardware after using the Ultrasonic module
     * this function is called automaticly after a Chirp
     */
    void RestoreAsuro(void)
    {
       TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
       OCR2  = 0x91;              // duty cycle for 36kHz
       TIMSK |= (0 << OCIE2);     // OCIE2:  Timer/Counter2 Output Compare Match Interrupt Enable
    
       ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
       ACSR  |= (0 << ACIS1);
    
       if(autoencode)
       {
          EncoderInit();
       }
    
       Sleep(1);
    }
    
    /**
     * @return distance in cm
     */
    int Chirp(void)
    {
       unsigned int sleeptime = 0, dist = 0;
    
       InitUltrasonics();
    
       // chirpen:
       count36kHz = 0;
    
       while(count36kHz != 20)
       {
          OCR2 = 100 + 20 / 2 - count36kHz;
       }
    
       TCCR2   = (1 << WGM21) | (1 << CS20);
       OCR2   = 100;
    
       // analyse echoes:
       while(TRUE)
       {
          Sleep(1);
          sleeptime++;
    
          if((ACSR & (1 << ACI)))
          {
             // Hinweis: 344 m/s Schallgeschwindigkeit in Luft bei ca. 20°C      
             dist = (unsigned int) ((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L));
             ACSR |= (1 << ACI);
             break;
          }
    
          ACSR |= (1 << ACI);
    
          if(sleeptime > 3500)
          {
             return -1;
          }
       }
    
       RestoreAsuro();
       return dist;
    }
    Nun stellt sich die Frage ob ich diese Datei abändern darf, oder ob ich das ganze in myasuro.c eintragen muss?

  3. #33
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    @inka:

    Danke für den Hinweis, hat wohl eine Überschneidung bei unseren Posts gegeben. Der Code in der ultrasonic.c scheint neuer als der von mir verwendete zu sein, mal sehen.

  4. #34
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    14.04.2007
    Ort
    Einhausen
    Alter
    68
    Beiträge
    699
    Freut mich, dass sich hier nun noch mehr Ultraschall-Asuros tummeln.

  5. #35
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    hallo ehenkes,

    mal eine Frage an den Fachmann:

    Ich habe deinen Code geflasht:

    Code:
    /*****************ultrasonic********************************/
    /**
     * being used insted TIMER2_OVF_vect during ultrasonic polling
     */
    ISR(TIMER2_COMP_vect)
    {
       //TCNT2 += 0x25; //Wichtig!! Die Zeile muss entfernt werden, damit es funktioniert. 
       count36kHz++;
       if(!count36kHz) timebase++;
    }
    
    /**
     * initialises the Ultrasonic module
     * this function is automaticly called by Chirp
     */
    void InitUltrasonics(void)
    {
       // Change Oscillator-frequency of Timer 2
       // to 40kHz, no toggling of IO-pin:
       TCCR2  = (1 << WGM21) | (1 << CS20);
       OCR2   = 100;              // 40kHz @8MHz crystal
       TIMSK |= (1 << OCIE2);     // OCIE2:  Timer/Counter2 Output Compare Match Interrupt Enable
    
       ADCSRA = (0 << ADEN);      // deactivate ADC
       ACSR  |= (1 << ACIS1);     // Comparator Interrupt on Falling Output Edge
    
       ADMUX  = 0x03;             // connect ADC3-input with comparator
       SFIOR |= (1 << ACME);      // connect ADC multiplexer to comparator
       DDRD  &= ~(1 << 6);        // use Port D Pin 6 as input (AIN0)
    }
    
    /**
     * restores the hardware after using the Ultrasonic module
     * this function is called automaticly after a Chirp
     */
    void RestoreAsuro(void)
    {
       TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
       OCR2  = 0x91;              // duty cycle for 36kHz
       TIMSK |= (0 << OCIE2);     // OCIE2:  Timer/Counter2 Output Compare Match Interrupt Enable
    
       ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
       ACSR  |= (0 << ACIS1);
    
       if(autoencode) 
       {
          EncoderInit();
       }
    
       Sleep(1);
    }
    
    /**
     * @return distance in cm
     */
    int Chirp(void)
    {
       unsigned int sleeptime = 0, dist = 0;
    
       InitUltrasonics();
    
       // chirpen:
       count36kHz = 0;
    
       while(count36kHz != 20) 
       {
          OCR2 = 100 + 20 / 2 - count36kHz;
       }
    
       TCCR2   = (1 << WGM21) | (1 << CS20);
       OCR2   = 100;
    
       // analyse echoes:
       while(TRUE) 
       {
          Sleep(1);
          sleeptime++;
    
          if((ACSR & (1 << ACI))) 
          {
             // Hinweis: 344 m/s Schallgeschwindigkeit in Luft bei ca. 20°C       
             dist = (unsigned int) ((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L)); 
             ACSR |= (1 << ACI);
             break;
          }
    
          ACSR |= (1 << ACI);
    
          if(sleeptime > 3500) 
          {
             return -1;
          }
       }
    
       RestoreAsuro();
       return dist;
    }
    Wenn ich nun den Asuro einschalte fährt er nur Ruckartig rückwärts, wenn ich meine Hand davorhalte fährt er gleichmässig rückwärts. Leider nie vorwärts

    Die US-Sensoren scheinen zu funktionieren, oder nicht?

  6. #36
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    Hallo,

    ich habe für meine US-Kalibrierung den Code von ehenkes verwendet:

    Code:
    #include "asuro.h" 
    int abstand=0; 
    
    int main(void) 
    { 
      Init(); 
      SerWrite("\r\n  --- ultrasonic test ---",29); 
      Msleep(1000); 
      
      do 
      { 
        abstand = Chirp(); 
        SerWrite("\r\n distanz in cm: ",20); 
        Msleep(500); 
        PrintInt(abstand); 
      } 
      while(1); 
      return 0; 
    }
    mit diesen Messergebnissen:

    Code:
     distanz in cm: 0
     distanz in cm: 05
     distanz in cm: 14
     distanz in cm: 15
     distanz in cm: 15
     distanz in cm: 14
     distanz in cm: 05
     distanz in cm: 15
     distanz in cm: 15
     distanz in cm: 14
     distanz in cm: 15
     distanz in cm: 14
     distanz in cm: 15
     distanz in cm: 14
     distanz in cm: 15
     distanz in cm: 04
     distanz in cm: 0
     distanz in cm: 0
     distanz in cm: 0
     distanz in cm: 0
     distanz in cm: 0
     distanz in cm: 0
     distanz in cm: 0
     distanz in cm: 697
     distanz in cm: 698
     distanz in cm: 698
     distanz in cm: 698
     distanz in cm: 498
     distanz in cm: 597
     distanz in cm: 697
     distanz in cm: 697
     distanz in cm: 675
     distanz in cm: 697
     distanz in cm: 697
     distanz in cm: 671
     distanz in cm: 698
     distanz in cm: 713
     distanz in cm: 0
     distanz in cm: 14
     distanz in cm: 19
     distanz in cm: 19
     distanz in cm: 09
     distanz in cm: 19
     distanz in cm: 19
     distanz in cm: 19
    Wenn ich nun diesen US-Code lade:
    Code:
    /*
          Bewegung auf Basis Ultraschallortung 
          Dr. Erhard Henkes, Mai 2007 
    */
    #include "asuro.h" // incl. der Funktionen InitUltrasonics, RestoreAsuro, Chirp von "dopez" (roboternetz)
    #define MAXDIFF 80 // Sehr große Sprünge zunächst ausblenden
    
    int main(void) 
    { 
      int abstand, abstand_alt, diff, zaehler=0; 
      Init(); 
      abstand = Chirp(); 
        
      while(TRUE) 
      { 
       abstand_alt = abstand; 
       abstand = Chirp();   
       ++zaehler; 
       diff = abstand - abstand_alt; 
        
       if( (abstand>15) && (abs(diff)<MAXDIFF) ) 
       { 
         StatusLED(GREEN); 
         MotorDir(FWD, FWD); 
         MotorSpeed(150, 150); 
       } 
       else if( (abstand>10) && (abstand<=15) && (abs(diff)<MAXDIFF) ) 
       { 
         StatusLED(GREEN); 
         MotorDir(FWD, FWD); 
         MotorSpeed(150, 100); 
         Msleep(30); 
       } 
       else 
       { 
         StatusLED(RED); 
         MotorDir(RWD, RWD); 
         MotorSpeed(100, 150); 
         Msleep(100); 
       } 
        
       if (zaehler > 400) 
       { 
         StatusLED(RED); 
         BackLED(ON,ON); 
         MotorDir(RWD, RWD); 
         MotorSpeed(250, 200); 
         Msleep(10); 
         BackLED(OFF,OFF); 
       } 
       
       if (zaehler > 405) 
       { 
         StatusLED(RED); 
         BackLED(ON,ON); 
         MotorDir(RWD, RWD); 
         MotorSpeed(200, 250); 
         Msleep(10); 
         BackLED(OFF,OFF); 
                 
         if(zaehler > 410) 
           zaehler = 0; 
       } 
    
      } 
      return 0; 
    }
    Nun dreht sich der Asuro ruckartig rückwärts im Kreis. Kann mir jemand einen Tip geben?

    Danke
    Pinsel

  7. #37
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi,
    hast du beim code 1 und den messergebnissen die entfernung (mit der hand z.b.) variiert?
    zu code 2: du solltest versuchen die werte z.b. für MAXDIFF oder der abfrage zu abstand zu verändern...
    gruß inka

  8. #38
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    hi inka,

    das variieren bei Code 1 habe ich gemacht. Geht, wenn auch der Wert schnell auf "0" springt. Der Poti ist so eingestellt, dass, wenn der Abstand und ca. 30 cm kommt "0" erscheint - dies war der beste Kompromiss nach 30 Minuten Poti einstellen.

    Ist MAXDIFF der einzige Wert oder gibt es andere, die ich anpassen muß?

    Noch was beim Kompilieren kommt folgende Warnung:
    test.c:12: warning: implicit declaration of function 'Chirp'
    kann ich die ignorieren?

    Gruß
    Pinsel

  9. #39
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    hi,
    man hat mir gesagt, bei der "0" handelt es sich um einen akustischen "kurzschluss" zwischen sender und empfänger und sollte eigentlich nicht vorkommen. Kommt aber vor, auch bei mir, isolierun so gut wie unmöglich. Also rausfilter, das versucht das zweite programm, wie, das habe ich noch nicht so genau verstanden...
    Ob MAXDIFF die einzuge veränderbare größe ist kann i9ch also auch nicht so genau sagen...
    die fehlermeldung beim kompilieren wird durch das "nichtanmelden" (deklarieren) der funktion Chirp() verursacht, ist durch das includen der datei in der diese definition bei dir definiert ist behebbar...
    gruß inka

  10. #40
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    58
    Beiträge
    847
    OK, Wartung kommt nicht mehr. Mein Code sieht jetzt so aus:

    Code:
    #include "asuro.h" // incl. der Funktionen InitUltrasonics, RestoreAsuro, Chirp von "dopez" (roboternetz)
    #include "ultrasonic.h"
    #define MAXDIFF 80 // Sehr große Sprünge zunächst ausblenden
    
    int main(void) 
    { 
      int abstand, abstand_alt, diff, zaehler=0; 
      Init(); 
      abstand = Chirp(); 
        
      while(TRUE) 
      { 
       abstand_alt = abstand; 
       abstand = Chirp();   
       ++zaehler; 
       diff = abstand - abstand_alt; 
        
       if( (abstand>40) && (abs(diff)<MAXDIFF) ) 
       { 
         StatusLED(GREEN); 
         MotorDir(FWD, FWD); 
         MotorSpeed(150, 150); 
       } 
       else if( (abstand>35) && (abstand<=40) && (abs(diff)<MAXDIFF) ) 
       { 
         StatusLED(GREEN); 
         MotorDir(FWD, FWD); 
         MotorSpeed(150, 100); 
         Msleep(30); 
       } 
       else 
       { 
         StatusLED(RED); 
         MotorDir(RWD, RWD); 
         MotorSpeed(100, 150); 
         Msleep(100); 
       } 
        
       if (zaehler > 400) 
       { 
         StatusLED(RED); 
         BackLED(ON,ON); 
         MotorDir(RWD, RWD); 
         MotorSpeed(250, 200); 
         Msleep(10); 
         BackLED(OFF,OFF); 
       } 
       
       if (zaehler > 405) 
       { 
         StatusLED(RED); 
         BackLED(ON,ON); 
         MotorDir(RWD, RWD); 
         MotorSpeed(200, 250); 
         Msleep(10); 
         BackLED(OFF,OFF); 
                 
         if(zaehler > 410) 
           zaehler = 0; 
       } 
    
      } 
      return 0; 
    }
    Kannst du mal drübersehen? Ich habe immer noch das gleiche Problem mit dem "Rückwärtsgang".
    Wie hast du deinen zum Laufen gebracht?

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests