- SF800 Solar Speicher Tutorial         
Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 64

Thema: Anschluss von Infrarotsensoren

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    Anzeige

    Powerstation Test
    danke radbruch für deinen vorschlag mit den bits, hab ich wohl irgendwie total vergessen, dass man das so machen muss.

    jetzt ändert sich immerhin schon mal die spannung an meiner ir sendediode.
    im standby betrieb beträgt diese an der diode etwa 1V. im betrieb sinkt diese nun auf 0,6 V.

    was allerdings auch sehr komisch ist, ist die tatsache, dass das writeString_P("\Interrupt Timer1 Compare");, welches in jedem interrupt angezeigt werden sollte, während des laufenden programms nie erscheint und nur beim beenden des programmes einmal im terminal angezeigt wird.

    ist das normal?

    außerdem empfängt mein ir- empfänger keine ir- signale. als vorwiderstand für den ir- sender habe ich einen 100 ohm widerstand eingelötet.
    der ir- empfänger habe ich wie im schaltplan des rp6Base angeschlossen.

    gibt es vielleicht irgendeine möglichkeit z.b. über den rp6loader zu sehen, ob ein ausgang gepulst wird, bzw. ob ein interrupt ausgelöst wird?

    mfg andi

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    ich bins nochmal,
    heut ist wohl nicht mein tag. ich habe bei den writeString(...) das \n am ende vergessen. nun habe ich das korrigiert und jetzt kann ich im terminal sehen, dass mein interrupt funktioniert.

    nur empfängt mein ir empfänger immer noch keine ir- singale.

    an was kann das liegen?

    mfg

  3. #13
    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

    Das Timersetup erscheint mir in Ordnung (kleines Lob für die 72kHz

    Mit einer Digicm oder einem Fotohandy sollte man die glimmende IR-Led erkennen können. Eine noch einfacherer Methode wäre eine sichtbare Led in der ISR mitzutakten (oder einfach nur einzuschalten um zu testen, ob die ISR überhaupt aufgerufen wird):

    Code:
    ISR(TIMER1_COMPA_vect)
       {
       PORTD ^= PD5;
       sichtbareLed ^= sichtbareLed;
    }
    btw. schaltet der IR-Empfänger seinen Ausgang auf low wenn er etwas empfängt.

    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!

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, jetzt habe ich meine ganze isr nochmal überarbeitet. in einem anderen internetforum habe ich gelesen, dass das agc des ir- empfängers zu macht, es dauerhaft ir- impulse empfängt. kann mir jemand ähnliches bestätigen?

    darum habe ich jetzt die isr abgeändert, und eine zyklische pulspause eingefügt.
    wenn ich nun mit einer handykamera die ir- led beobachte, kann ich ein blinken erkennen. d.h. die ansteuerung der ir- led funktioniert so weit.

    nur leider empfängt mein ir- empfänger immer noch keine ir- signale.

    letztens habe ich mit einem alten oszi (weiß leider nicht ob es korrekt funktioniert) die pulsfrequenz ir signale gemessen (vor der abänderung des programms auf pulpausen). da habe ich eine pulsfrequenz von 72Hz gemessen. also genau um den faktor 1000 die falsche.

    darum die frage, ob vielleicht jemand mal meine timereinstellung überprüfen kann:

    Code:
    //     Timer 1 erweiterung
    
    
    
    	 TCCR1B =  (0 << ICNC1)
             | (0 << ICES1)
             | (0 << WGM13)
             | (1 << WGM12)
             | (0 << CS12)
             | (0 << CS11)
             | (1 << CS10);
    
    	 OCR1A = 221; 
    	
    
    
    	// Timer 2 - used for beeper:
    	TCCR2 =  0; 
    	OCR2  = 0xFF; 
    
    	// Enable timer interrupts:
    	TIMSK =   (1 << OCIE0)|(1<<OCIE1A);
    	sei();
    mein abgeändertes programm:

    Code:
    #include "RP6ControlLib.h"
    
    uint8_t a;
    uint8_t interruptcounter;
    
    
    ISR(TIMER1_COMPA_vect) 
    	
    	{interruptcounter++;
    	
    if(interruptcounter <51)
    	{PORTD ^= (1<<PD5);
    	writeString_P("Interrupt Timer1 Compare\n");}
    
    if(interruptcounter > 50)
    	{writeString_P("Interrupt Pause\n");}
    
    if(interruptcounter > 80)
    	{interruptcounter =0;}
    	
    
    
    }
    
    
    
    
    
    
    void infrarotempfang(void)
    {if (PINC & (1<<PC3))
    {
    a++;
    }
    
    if (a >100)
    	{writeString_P("Infrarot empfangen\n");
    	startStopwatch1();}
    	
    if (getStopwatch1() >1000)
    	{setStopwatch1(0);}
    }
    
    int main(void)
    {initRP6Control();
    
    DDRD |= (1<<PD5);	//PD5 als Ausgang
    
    DDRC &=~ (1<<PC3);  	//PC3 als Eingang
    
    while(true)
    {
    
    infrarotempfang();
    }
    return 0;
    }
    bin um jede hilfe dankbar.

    mfg andi

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, nach weitereim rumtüfteln bin ich nun zu dem entschluss gekommen, dass irgendetwas an meiner timereinstellung nicht passen kann.

    bei folgendem programm müsste die ir- pulspause nach meiner berechnung 690µs betragen. wenn ich das programm aber teste beträgt sie geschätzt nur etwa 0,1s.

    irgendwie habe ich langsam das gefühl, dass mein oszi mit den 72Hz doch richtig misst und mein timer um den faktor 1000 falsch eingestellt ist...

    hier die timereinstellung:




    Code:
    //     Timer 1 erweiterung
    
    
    	 TCCR1B =  (0 << ICNC1)
             | (0 << ICES1)
             | (0 << WGM13)
             | (1 << WGM12)
             | (0 << CS12)
             | (0 << CS11)
             | (1 << CS10);
    
    	 OCR1A = 221; 
    	
    
    
    	// Timer 2 - used for beeper:
    	TCCR2 =  0; 
    	OCR2  = 0xFF; 
    
    	// Enable timer interrupts:
    	TIMSK =   (1 << OCIE0)|(1<<OCIE1A);
    	sei();
    mein programm:

    Code:
    #include "RP6ControlLib.h"
    
    uint8_t a;
    uint8_t interruptcounter;
    
    
    ISR(TIMER1_COMPA_vect) 
    	
    	{interruptcounter++;
    	
    if(interruptcounter <50)
    	{PORTD ^= (1<<PD5);
    	writeString_P("Interrupt Timer1 Compare\n");}
    
    if(interruptcounter > 50 && interruptcounter <101)
    	{writeString_P("Interrupt Pause\n");}
    
    if(interruptcounter > 100)
    	{interruptcounter =0;}
    	
    
    
    }
    
    
    
    
    
    void infrarotempfang(void)
    {if (PINC & (1<<PC3))
    {
    a++;
    }
    
    if (a >100)
    	{writeString_P("Infrarot empfangen\n");
    	startStopwatch1();}
    	
    if (getStopwatch1() >1000)
    	{setStopwatch1(0);}
    }
    
    int main(void)
    {initRP6Control();
    
    DDRD |= (1<<PD5);	//PD5 als Ausgang
    
    DDRC &=~ (1<<PC3);  	//PC3 als Eingang
    
    while(true)
    {
    
    infrarotempfang();
    }
    return 0;
    }

    was meint ihr dazu?

    weiß langsam nicht mehr weiter....

    mfg andi

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, jetzt habe ich mich nochmal über die infrarotsensorik schlau gemacht. aber ich scheiter immer noch an einem grundlegenden problem. und zwar erkennt die M32 irgendwie nicht meinen port PC3 als eingang.

    das dürfte auch das problem sein, warum sie keinen infrarotempfang meldet.

    ich komm mir richtig blöd vor das zu fragen, weil ich nicht das erste mal einen port als eingang verwende. aber ich habe gerade +5Volt auf meinen eingang PC3 gebrückt und dieser aber scheinbar nichts registriert.

    scheinbar steh ich gerade extrem auf der leitung. hier das programm:


    Code:
    #include "RP6ControlLib.h"
    
    uint8_t a;
    uint8_t interruptcounter;
    
    
    ISR(TIMER1_COMPA_vect) 
      
      {interruptcounter++;
      
    if(interruptcounter <21)
      {PORTD ^= (1<<PD5);
      writeString_P("Interrupt Timer1 Compare\n");}
    
    if(interruptcounter > 20 && interruptcounter <41)
      {writeString_P("Interrupt Pause\n");}
    
    if(interruptcounter == 41)
      {interruptcounter =0;}
      
    
    
    }
    
    
    
    
    
    void infrarotempfang(void)
    {if (PINC & (1<<3))
    {writeString_P("eingang PC3 high\n");
    a++;
    }
    
    if (a >100)
      {writeString_P("Infrarot empfangen\n");
      startStopwatch1();}
      
    if (getStopwatch1() >1000)
      {setStopwatch1(0);}
    }
    
    int main(void)
    {initRP6Control();
    
    DDRD |= (1<<PD5);  //PD5 als Ausgang
    
    DDRC &=~ (1<<3);    //PC3 als Eingang
    
    while(true)
    {
    
    infrarotempfang();
    }
    return 0;
    }
    was ist hier falsch? ich glaub ich versteh die welt nicht mehr....

    mfg andi

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, die semesterferien machen es möglich. nun ist mein ir kollissionsumbau fertig und funktioniert auch.

    allerdings habe ich meine schaltung noch einmal ein wenig abgeändert um eine höhere reichweite zu erreichen. nun jetzt steuere ich die ir led über einen transistor, wessen basis über einen 1K widerstand mit meinem µc ausgang verbunden ist. den kollektor habe ich über ein 500 ohm poti mit VDD verbunden. so kann ich die reichweite einstellen. die ir led hängt nun ohne weiteren widerstand an emitter und masse.

    konkret schaut das ganze nun so aus:
    http://img211.imageshack.us/img211/4489/1001329f.jpg

    damit erreiche ich nun eine maximal reichweite von gut 20cm.

    nun möchte ich mit dieser sensorik ein inrarotradar bauen. d.h. ich möchte die sensorik mittels eines Servos ständig langsam drehen und dadurch die nähere umgebung des roboters abzuscannen und so hindernissen ausweichen.

    nun ist es so, dass ich ja die ir sensorik über den timer 1 der M32 ansteuere und für die servoansteuerung dirks servolib verwenden möchte.
    da aber dirks servolib für die M32 schon den timer1 belegt, würde ich gerne den servo über die base ansteuern, d.h. mit dirks servobaselib.

    nun meine frage: kann ich mit einem programm auf der M32 gleichzeitig mein ir system ansteuern und gleichzeitig einen servo, welcher an der base angeschlossen ist?
    oder muss ich für den servo das RP6_Slave programm noch erweitern und dann zusätzlich mit einem programm auf der M32 das ir ansteuern?

    wie ist es am leichtesten so etwas zu realisieren?

    mfg andi

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo andi,

    wenn du willst, kannst du auch meine Servo Lib für die M32 nehmen.

    Du kannst in der Lib F_TIMER1 auf die Frequenz ändern, die du für deinen IR-Empfang brauchst (bei 72 kHz müßte F_TIMER1 = 72000 gesetzt werden, OCR1A wird dann automatisch 28 ).

    Deinen IR-Empfang könntest du dann in die ISR einklinken. Die neuen Servo-Grenzwerte kannst du ohne Probleme ausrechnen (siehe die Header-Datei der Lib!). Die Auflösung der Servo-Schritte ist mit der geringeren Timer1-Frequenz natürlich nicht mehr so groß,- müßte aber reichen.

    Gruß Dirk

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    gute idee dirk,
    das ist dann wohl auch die einfachste lösung. allerdings errechne ich für den OCR1A einen wert von 26,77 bei einem abgeänderten wert von 72000 für F_TIMER1.
    das ist wahrscheinlich auch der grund, warum du dem µc den OCR1A mit der formel berechnen lässt, und nicht gleich 19 hineinschreibst.
    bis gerade eben habe ich gedacht, dass der µc für den wert des OCR1A nur gerade werte zulässt.

    dann muss ich jetzt ja eigentlich nur noch neue werte für die impulslängen der servopulse ausrechnen und die dann in der lib abändern.

    klasse idee \/

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    dann muss ich jetzt ja eigentlich nur noch neue werte für die impulslängen der servopulse ausrechnen und die dann in der lib abändern.
    Ja, exakt.

    Für LEFT_TOUCH würde ich mit 50 anfangen zu testen, für RIGHT_TOUCH mit 116.

    Gruß Dirk

Seite 2 von 7 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen