- 3D-Druck Einstieg und Tipps         
Seite 5 von 8 ErsteErste ... 34567 ... LetzteLetzte
Ergebnis 41 bis 50 von 71

Thema: Minimallösung: IR-Abstandsmessung

  1. #41
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Praxistest und DIY Projekte
    Hallo

    dein fertiges hex-file ist ein anderes programm...
    Jain, das selbe Programm ist es eigentlich schon, aber mit der falschen Lib kompiliert. Das steht glaube ich irgendwo weiter unten...

    DDRD |= (1 << DDD1); // Port D1 als Ausgang
    PORTD &= ~(1 << PD1); // PD1 auf LOW


    Setzt den TXD-Pin des Mega8 auf Ausgangsfunktion und gibt ein Low aus. An diesem Pin ist die Kathode IR-LED angeschlossen die deshalb nur leuchten kann, wenn dieser Pin Low ist.

    OCR2 = 0xFC;

    Das ist der eigentliche Trick der Sache. Die Anode der IR-LED ist (über R16) am OC2-Pin angeschlossen, das ist der Ausgangspin von Timer2. Hier wird nun ein (ich glaube 36kHz-)Signal mit variablem Puls-Pauseverhältniss erzeugt. Je größer dabei der Pulsanteil ist, desto empfindlicher wird die Abstandsmessung, 0xff ist unempfindlich wenn ich mich recht erinnere. Das alles funktioniert aber nur richtig, wenn man die von waste angepasste Lib (anderer PWM-Mode und Ausgangstogglen) verwendet. Das funktionierte bei mir zu Anfang nicht, deshalb funzt das Hex nicht.

    ir=PIND & (1 << PD0);

    Fragt den IR-Empfänger ab und speichert 1 oder 0 in ir. Dazu muß man aber wissen, dass der Empfänger das Signal invertiert! Wenn er kein 36kHz-Signal erkennt ist sein Ausgang high, deshalb prüft if(ir) ob die Bahn frei ist (kein IR-Echo erkannt) und if(!ir) prüft auf ein Hinderniss (Echo erkannt).

    Gruß

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

  2. #42
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.693
    Hi,

    bei dieser Messung muss man noch beachten, dass nach Einstellen der neuen Puls-Pausen-Zeit der SFH5110 vier (bei älteren Sensoren sechs) Pulse braucht, bis sein Signal gültig ist. Das steht bei dem auch in der Doku:

    .................Bild hier  

    Die ganze Geschichte habe ich hier ziemlich ausgebreitet.
    Ciao sagt der JoeamBerg

  3. #43
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    38
    Beiträge
    100
    ok danke erst mal.
    ich werd mich erst mal mit waste's thread auseinandersetzen. vllt kapier ich dann ja mehr
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  4. #44
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    38
    Beiträge
    100
    ich hab das ganze jetzt noch mal überdacht.

    ich verwende ja die lib 2.8rc1. da ist ja schon der ir-detektor eingebunden.
    nun erst mal ne frage: sind da schon die veränderungen von waste dabei?
    wenn nicht, wie kann ich die einbauen, sodass ich die aktuelle lib nutzen kann und trotzdem der ir-detektor richtig funzt?

    nun ist ja bei der lib auch ein ir-testprogramm dabei.
    dieses hier

    Code:
    /*******************************************************************************
    *
    * Description: Asuro IR-Detektor Testprogramm
    *
    *****************************************************************************/
    /***************************************************************************
     *                                                                         *
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation; either version 2 of the License, or     *
     *   any later version.                                                    *
     ***************************************************************************/
    #include "asuro.h"
    #include <stdlib.h>
    
    static unsigned char ocr2 = 0x91;
    
    void InitIRDetect(void)
    {  
      UCSRB = 0;
      DDRD |= (1 << DDD1);	// Port D1 als Ausgang
      PORTD &= ~(1 << PD1);	// PD1 auf LOW
      OCR2 = ocr2;
    }
    
    void InitUart(void)
    {
      OCR2  = 0x91;         // duty cycle fuer 36kHz
    }
    
    int main(void)
    {
    
      unsigned char sw;
    
      Init();
      
      DDRD |= (1 << DDD1);	// Port D1 als Ausgang
      PORTD &= ~(1 << PD1);	// PD1 auf LOW
    
    //  InitIRDetect();
      while (1)
      {
        UCSRB = 0;
        OCR2 = 0xFE;
    
        if (PIND & (1 << PD0))
          StatusLED(GREEN);
        else
          StatusLED(RED);
    
        sw = PollSwitch();
        if (sw & 0x01)
          ocr2  = 0xFE;	//Pulsbreite 1
        if (sw & 0x02)
          ocr2  = 0xFD;	//Pulsbreite 2
        if (sw & 0x04)
          ocr2  = 0xFB;	//Pulsbreite 4
        if (sw & 0x08)
          ocr2  = 0xF7;	//Pulsbreite 8
        if (sw & 0x10)
          ocr2  = 0xEF;	//Pulsbreite 16
        if (sw & 0x20)
          ocr2  = 0x90;	//Pulsbreite 110
    
        if (sw)
        {  
          OCR2 = 0x91;
          PrintInt(sw); 
          SerPrint(" ");
          PrintInt(ocr2); 
          SerPrint("\r\n");
        }
    //   Msleep(100);
      }
      return 0;
    }

    das hab ich mal auf meinen asuro geflasht und getstet. man kann dort mit den tastern ja die pulsweite einstellen.
    zuerst dachte ich, es würde gar nichts gehn, weil die status led immer grün war.
    das einstellen der pulsweite ging. das konnte ich ja mithilfe meines transceivers feststellen, da asuro je nach tastendruck mir ja die pulsweite gesendet hat.
    dass asuro was gesendet hat, hab ich auch mithilfe des transceivers feststellen können.
    jedoch konnte ich machen was ich wollte, die status led blieb grün.

    dann bin ich (mehr oder weniger durch zufall) ganz dich an meinen 45°-spiegel gekommen und siehe da: led rot!!!
    also funktioniert es, es ist jedoch nicht empfindlich genug eingestellt.

    das sollte man ja ansich mit den tastern machen können, aber ich hab - egal welche pulsweite ich verwendete - keine oder nur minimale veränderungen gemerkt. problem dabei: die objekterkennung erfolgt erst HINTER der platinenkante, also zu spät.

    kann ich das mithilfe der OCR2-werte noch weiter tunen oder muss ich da noch was anderes beachten (wie z.b. die einstellugnen von waste, mit denen ich noch nicht so ganz klar komme)?!

    wär toll, wenn mir wer helfen könnte. danke!
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  5. #45
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    38
    Beiträge
    100
    *thread nach oben schieb in der hoffnung eine antwort zu erhalten...*
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

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

    Ich verwende die 2.8er Lib nicht, deshalb kann ich dir nicht viel zum Zusammenspiel mit der IR-Erweiterung sagen. Allerdings scheint mir dein Beispielprogramm die etwas erweitete Demo von Waste zu sein, ich sehe keinen Hinweis auf eine Unterstützung durch die Lib.

    Wichtig ist die Initialisierung des Timers in der Lib, bei der von Waste modifizierten Version sieht die entsprechende Stelle in asuro.c so aus:

    TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
    In der Funktion Init()

    Laut Datenblatt (Seite 177ff) ist das "Fast PWM" (WGM20+21) mit "Set OC2 on Compare Match, clear OC2 at BOTTOM, (inverting mode)" (COM20+21). Prescaler ist 1 (CS20) (Wie man dann auf 36kHz kommt ist mir grad auch nicht klar ;)

    Diese Initialisierung sollte bei der 2.8er Lib gleich sein sonst funzt die IR-Abstandsmessung nicht.

    Du kannst auch noch mit dem OCR2-Wert rumspielen, mein asuro fuhr mit 0x50 ziemlich optimal. Das hängt aber auch vom Reflektor und dem Gesamtaufbau ab.

    Gruß

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

  7. #47
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    38
    Beiträge
    100
    hallo radbruch.

    danke für deine antwort.

    in meiner asuro.c-datei aus der 2.8er lib habe ich nur folgende 2 stellen gefunden:

    Code:
    #if defined(__AVR_ATmega168__)
      // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
      TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1);
      TCCR2B = _BV(CS20);
      // interrupt on timer overflow
      TIMSK2 |= _BV(TOIE2); 
    #else
      // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
      TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
      // interrupt on timer overflow
      TIMSK |= _BV(TOIE2); 
    #endif
      // 36kHz carrier/timer
      OCR2  = 0x91;
    für mich ja ansich uninteressant, weil ich den standard prozessor verwende und es hier um den atmega168 geht, oder?!

    und dann dieses hier:

    Code:
      /*
        PWM-Kanaele OC1A und OC1B auf 8-Bit einstellen.
        Sie werden fuer die Geschwindigkeitsvorgaben der Motoren benutzt.
      */
      TCCR1A = _BV(WGM10) | _BV(COM1A1) | _BV(COM1B1);
      TCCR1B = _BV(CS11);                 // tmr1-Timer mit MCU-Takt/8 betreiben.
    ich komme mit den ganzen operatoren in c noch nicht zu 100% klar, daher kann ich die oben genannte stelle schlecht interpretieren. dass diese jedoch nicht mit der von dir genannten übereinstimmt, ist eindeutig.

    meinst du ich kann das einfach dazu schreiben?

    mit der OCR2- Werten habe ich auch experimentiert. So habe ich auf die 6 Taster immer verschiedene Werte gelegt. Dabei habe ich die hex-werte von FF bis 00 laufen lassen und dabei von schlter zu schalter immer 33 abgezogen, sodass ich auf tasterbelegungen von FF, CC, 99, 66, 33, 00 kam. damit ist ja das ganze spektrum erst mal grob abgedeckt. es hat jedoch leider zu keiner veränderung geführt.

    mit deinem fertigen programm vom anfang des thread geht es. nur ist mir nicht ganz wohl gänzlich auf wastes lib umzusteigen, weil ich mich gerade an die 2.8 gewöhnt habe.

    vielleicht liegt es wirklich nur an der initialisierung. nur wundert mich das, weil man ja ansich mit der lib schon der ir-support bekommt. komisch, dass es dann nicht so funktioniert, wie gedacht.

    grüße, malediction.
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  8. #48
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    38
    Beiträge
    100
    sooooooo...

    da ich mal wieder keine antwort bekomme... ...hab ich mir selbst geholfen.

    für alle, die wie ich die 2.8er lib benutzen und die ir-minimallösung "installiert" haben sei hier gesagt, dass ich mit dem "mitgelieferten" testprogramm zur ir-kollision große probleme hatte. es funktionierte zwar, jedoch war die pulsbreite so eingestellt, dass der sensor hindernisse nur ca. 5mm vor dem spiegel erkannt hat (und damit erst HINTER der platinenkante)!
    die einstellung der pulsbreite mittels taster funktionierte bei mir in dem IRcollision-programm auch nicht.
    ich hab das ganze mal auseinandergenommen und herausgefunden, dass das testprogramm funktioniert (jedenfalls bei mir), wenn man es so umschreibt:

    Code:
    /*******************************************************************************
    *
    * Description: Asuro IR-Detektor Testprogramm
    *
    *****************************************************************************/
    /***************************************************************************
     *                                                                         *
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation; either version 2 of the License, or     *
     *   any later version.                                                    *
     ***************************************************************************/
    #include "asuro.h"
    #include <stdlib.h>
    
    int main(void)
    {
       unsigned char sw;
       
       Init();
       
       DDRD |= (1 << DDD1);   	// Port D1 als Ausgang
       PORTD &= ~(1 << PD1);   // PD1 auf LOW
       
       UCSRB = 0;
       OCR2 = 0xFE;				//Anfangswert (entspricht Pulsbreite 1)
       
       while(1)
       {
       if (PIND & (1 << PD0))
          StatusLED(GREEN);
       else
          StatusLED(RED);
          
       sw = PollSwitch();
       if (sw & 0x01)
          OCR2  = 0xFE;   //Pulsbreite 1
       if (sw & 0x02)
          OCR2  = 0xFD;   //Pulsbreite 2
       if (sw & 0x04)
          OCR2  = 0xFB;   //Pulsbreite 4
       if (sw & 0x08)
          OCR2  = 0xF7;   //Pulsbreite 8
       if (sw & 0x10)
          OCR2  = 0xEF;   //Pulsbreite 16
       if (sw & 0x20)
          OCR2  = 0x90;   //Pulsbreite 110
       }
       return 0;
    }
    hier muss man auch nichts mehr an der lib ändern. damit geht bei mir alles problemlos und man kann deutlich sehen, welche pulsbreite man einstellen muss für welche enfernung.

    vielleicht könnte mal jemand, der auch die 2.8er lib hat das ganze testen, indem er zuerst das original programm zur IR-Kollision flasht und ausprobiert, und danach das o.g.. dann könnte man mal feststellen, ob es an mir liegt oder ob es ein allgemeiner fehler ist.

    thx, malediction...
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

  9. #49
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    sooooooo...
    da ich mal wieder keine antwort bekomme... ...hab ich mir selbst geholfen.
    Prima, so sollte es sein. Selber Nachdenken führt gelegentlich auch zum Ziel.

    Deine vorige Programmversion mit Ausgabe der Tasten- und OCR2-Werte stolperte über den Mix aus IR-Abstandsmessung und IR-Kommunikation mit dem Terminal. So funktioniert es bei meinem asuro mit alter Lib:
    Code:
    /*******************************************************************************
    *
    * Description: Asuro IR-Detektor Testprogramm
    *
    *****************************************************************************/
    /***************************************************************************
     *                                                                         *
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation; either version 2 of the License, or     *
     *   any later version.                                                    *
     ***************************************************************************/
    #include "asuro.h"
    #include <stdlib.h>
    
    static unsigned char ocr2 = 0xFE;
    
    void InitIRDetect(void)
    {
      DDRD |= (1 << DDD1);   // Port D1 als Ausgang
      PORTD &= ~(1 << PD1);   // PD1 auf LOW
      UCSRB = 0;
      OCR2 = ocr2;
    }
    
    void InitUart(void)
    {
      OCR2  = 0x91;         // duty cycle fuer 36kHz
    }
    
    int main(void)
    {
      unsigned char sw;
    
      Init();
      InitIRDetect();
      while (1)
      {
        if (PIND & (1 << PD0))
          StatusLED(GREEN);
        else
          StatusLED(RED);
    
        sw = PollSwitch();
        if (sw & 0x01)
          ocr2  = 0xFE;   //Pulsbreite 1
        if (sw & 0x02)
          ocr2  = 0xFD;   //Pulsbreite 2
        if (sw & 0x04)
          ocr2  = 0xFB;   //Pulsbreite 4
        if (sw & 0x08)
          ocr2  = 0xF7;   //Pulsbreite 8
        if (sw & 0x10)
          ocr2  = 0xEF;   //Pulsbreite 16
        if (sw & 0x20)
          ocr2  = 0x90;   //Pulsbreite 110
    
        if (sw)
        {
          OCR2 = 0x91;
          PrintInt(sw);
          SerWrite("-", 1);
          PrintInt(ocr2);
          SerWrite("\n\r", 2);
          UCSRB = 0;
    		OCR2=ocr2;
        }
       Msleep(100);
      }
      return 0;
    }
    Das sollte auch mit der 2.8er Lib funktionieren weil sie den Timer richtig parametriert.

    Gruß

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

  10. #50
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.12.2008
    Ort
    Dresden
    Alter
    38
    Beiträge
    100
    Prima, so sollte es sein. Selber Nachdenken führt gelegentlich auch zum Ziel.
    ansich denk ich immer zuerst nach. nur ist das bei c so eine sache, da ich gerade erst dabei bin, mich reinzufuchsen

    was mich eben wunderte ist, dass das o.g. programm schon bei der lib dabei ist, allem anschein nach aber nicht ohne weiteres funktioniert. ich hab es dann so gemacht, dass ich für mich unlogisch erscheinende dinge (wie z.b. auch diese ausgabe in dem programm) schritt für schritt auskommentiert habe, sodass es am ende funktioniert hat und ich wusste woran es liegt.

    danke aber trotzdem für die tipps.
    Der Optimist: \"Das Glas ist halb voll.\"
    Der Pessimist: \"Das Glas ist halb leer.\"
    Der Ingenieur: \"Das Glas ist doppelt so groß wie es sein müßte.\"

Seite 5 von 8 ErsteErste ... 34567 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test