- 12V Akku mit 280 Ah bauen         
Seite 1 von 7 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 64

Thema: Anschluss von Infrarotsensoren

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

    Anschluss von Infrarotsensoren

    Anzeige

    Powerstation Test
    Hallo, ich werde meinen RP6 demnächst mit 2 Infrarotsensoren, wie sie ja bereits einfach vorhanden sind, ausstatten.

    Dazu habe ich mir gerade den Schaltplan des RP6 angeschaut.

    Leider ist mir so einiges unklar, was den Anschluss und die Programmierung betrifft

    Kann mir jemand vielleicht mal grob in worten schildern wie man eine Hindernisserkennung mit 2 sendern und einem empfänger programmieren muss?

    gruß

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Das ACS-system von der RP6 functioniert anhand einer IR-empfanger die nur reagiert auf eine IR-signal das moduliert ist mit 36 kHz. Nur wen dieses Signal den Empfanger trefft, wird das weitergegeven an der Mega32. Die IR-Leds Links und Rechts senden exact auf diese 36 kHz, aber erst gibt der Linker Diode ein Anzahl von Pulsen, und dan der Rechter Diode. Da das alles von Mega32 gesteuert werd, ist das dan auch klar auf welche Sendesignalen die Empfanger reagiert.
    Das programmieren von eine zweite ACS-system geht, aber ist nicht so einfach. Zum Empfanger brauch men am besten eine Interrupteingang (nicht mehr Forhanden bei RP6 gelaube ich). Zum Senden zwei freie Ports. Aufgepasst : max 20 mA/port !! Siehe auch die Lib von RP6 an. Das ist recht komplieziert, da auch der RC5 Code decodiert werd in diese Functionen (ACS). Ohne RC5 ist das einfacher machbar.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    also, hab ich das jetzt richtig verstanden?

    es sendet zuerst die linke sendediode ir und dann die rechte und immer so weiter?

    und links wäre dann zum beispiel ein hindernis, wenn der ir- empfänger während dem senden der linken sendediode ir- strahlung empfangen würde.

    wenn ich das baue ist das bisherige ir eh ausgeschaltet weil ich es nur zur teilerkennung für meinen greifer brauche. das von dir geschilderte problem existiert also da drum nicht.

    die ir- sender sind beim rp6 so unverständlich angeschlossen.

    kann ich das eine ende einer sendediode einfach jeweils an einen eigenen mikrocontrollerausgang anschließen und die anderen enden masse?

    müsste doch eigentlich funktionieren, oder?

    gruß

    gruß

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Frage 1 und 2 : ja,richtig verstanden.
    Frage 3 :
    Nein. Minimal braucht du eine Wiederstand von ca 250 ohm in serien mit der IR-sende diode. Ansonst ueberschreitet die Strom 20 mA und geht die Ausgang von µ kaputt.
    Zweitens sollst du auch eine Art von Modulation verwenden, ansonst reagiert der Empfanger auch auf "Fremdlicht" wie Sonneschein.
    Eine einfachere Alternative sond die Sharp GP2 IR Sensoren : Kannst du einfach anschliessen an ADC0/ADC1 und geben ihnen dan auch die Abstand von Hinderniss !! Auch die Farbe von Hinderniss hat dan kaum Einfluss mehr. Diese Sensoren kosten ca 12 €.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2008
    Ort
    Frankfurt
    Alter
    40
    Beiträge
    21

    sharp gp2 ir sensoren

    hi! ich kann dir nur die IR-Sensoren von Sharp empfehlen. Ich hab schon mit mehreren GP2D12 gearbeitet, die muss man mithilfe des ADCs auslesen. Diese Teile haben eine super Auflösung, und du bekommst zwischen 10 und 80cm fast centimetergenaue Abstände raus. Die Sensoren gibt es auch mit I2C-Ausgang, wenn du ADCs sparen willst, mit der I2C-Version hab ich allerdings noch nie was gemacht..
    Der Anschaffungspreis ist recht hoch, aber im Gegensatz zum Eigenbau musst du dir selbst keine Sorgen über Modulation und Messung machen..

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    danke für eure vorschläge,

    ich werde mir die sharpsensoren aber trotzdem nicht anschaffen.

    ich will ja schließlich selber richtig c programmieren lernen, und drum werd ich das ganze mit 2 sendedioden ld271 und dem entsprechendem 16 khz empfänger programmieren.

    hat nicht nur den vorteil, dass es günstiger ist, sondern auch noch den vorteil, dass ich daraus mehr lerne als mit fertigen sensoren.

    der rp6 ist in meinen augen eh ein lernroboter.

    viel zu schade, um ihn nur für ein projekt zu erweitern und dann immer so belassen.

    gruß

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    für die ansteuerung von den ir- sendedioden muss ich ja ein 16khz signal erzeugen.

    wenn ich das in der anleitung richtig gelesen habe besitzt der sleep- timer die kleinste auflösung.

    aber auch mit diesem timer lässt sich so kein 16 khz signal erzeugen.

    muss ich dass dann mit rechenanweisungen machen?

    zu erklärung: ich weiß, dass es bereits ein fertiges makro in der rp6 lib gibt, aber auf das will ich nicht zurückgreifen, weil ich die ansteuerung selber programmieren will.

    gruß

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    OK. Stichwort hier sind die hardwaretimer von der µ. Der MEGA32 hat 3 solche Timer (counter), 2*8 bit und 1*16 bit. Diese Timer konnen hoch oder unterzahlen auf eine bestimmte Teilfrequenz von der hauptakt. So mit der Haupttakt von 8 MHz kansst du zahlen an 8MHz oder ein teilfactor davon (prescaler). Mit hilfe von bestimmte register (OCR) konnen dan bei bestimmte ergebnissen etwas getan wirden. Sage mal diesen 8 bit counter lauft mit ein prescaler von 8. Dan ist seine Frequenz 1 MHz. In 1 mS zaehlt er dan hoch bis 1000.... Leiter gibt nur 8 bit, nach 255 fangt das wieder von 0 an... Lassen wir mal bei Zahlerwert 200 eine Ausgang toggle (wechseln von Zustand) und der Zaehler zuruck auf 0 setzen. Dan schaltet diese Ausgang mit 5000 Hz !! Zahler rucksetzen bei 50 gibt dan schon 20000 Hz.
    Leiter sind alle 3 Timer bei den RP6 schon genutzt für : PWM Motoren, ACS - RC5 Functionen, Stopwatches und Timer Functionen.
    Aber du muss sicher mal die RP6lib ansehen. Das nutzen von diese Timer ist nicht so gans einfach. Bestimmte Register mussen richtig gesetzt werden, interrupts sub routines (ISR) mussen programmiert werden. Aber mit Hilfe von das gut documentierte Lib von RP6, und das datasheet von der ATMega32 ist das zu verstehen.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    so, nach längerer abstinenz in diesem thread mache ich mich meinen rp6 nun mit einem ir kollissionssensor ausgestattet.

    siehe hier:

    Bild hier  

    empfänger und sender sind die selben wie bei der RP6 Base.

    die 36 KHz möchte ich über den freien Timer 1 auf der M32 mittels CTC modus erzeugen.

    dazu hab ich die controllib.c folgendermaßen abgeändert:

    Code:
    
    	 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 programmcode dazu sieht bisher so aus:

    Code:
    #include "RP6ControlLib.h"
    
    uint8_t a;
    
    ISR(TIMER1_COMPA_vect) 
    	{
    	PORTD ^= PD5;
    writeString_P("\Interrupt Timer1 Compare");
    
    
    }
    
    
    
    
    
    
    void infrarotempfang(void)
    {if (PINC & PC3)
    {
    a++;}
    
    if (a >100)
    	{writeString_P("\Infrarot empfangen");
    	startStopwatch1();}
    	
    if (getStopwatch1() >1000)
    	{setStopwatch1(0);}
    }
    
    int main(void)
    {initRP6Control();
    
    DDRD |= PD5;	//PD5 als Ausgang
    
    DDRC &=~ PC3;  	//PC3 als Eingang
    
    while(true)
    {
    
    infrarotempfang();
    }
    return 0;
    }
    obwohl ich mittlerweile das datenblatt der M32 genau seziert habe, löst mein timer 1 immer noch keinen interrupt aus. die einstellungen hab ich genauestens überprüft.
    kann es sein, dass der interrupt irgendwo an anderer stelle in der controllib blockiert wird?

    gruß

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

    Ich bin im Moment zu faul dein Timersetup nachzuprüfen, weil ich die Bedeutung der einzelnen Bits im TCCR1B-Register nicht auswendig kenne. Hier wäre es sehr hilfreich, wenn du dazu ein paar Kommentare einfügen würdest...

    Was mir aber sofort aufgefallen ist: Du setzt bzw. prüfst die Pins der Ports nicht richtig. Die Basis bildet die Definitionen in der entsprechenden io.h-Datei, für den Mega32 auf dem M32 befinden sich die in der Datei iom32.h im avr-Pfad. Hier der entsprechende Abschnitt für Port C/D:
    Code:
    /* PORTC */
    #define PC7     7
    #define PC6     6
    #define PC5     5
    #define PC4     4
    #define PC3     3
    #define PC2     2
    #define PC1     1
    #define PC0     0
    
    /* DDRC */
    #define DDC7    7
    #define DDC6    6
    #define DDC5    5
    #define DDC4    4
    #define DDC3    3
    #define DDC2    2
    #define DDC1    1
    #define DDC0    0
    
    /* PINC */
    #define PINC7   7
    #define PINC6   6
    #define PINC5   5
    #define PINC4   4
    #define PINC3   3
    #define PINC2   2
    #define PINC1   1
    #define PINC0   0
    
    /*
       PD7 = OC2
       PD6 = ICP
       PD5 = OC1A
       PD4 = OC1B
       PD3 = INT1
       PD2 = INT0
       PD1 = TXD
       PD0 = RXD
     */
    
    /* PORTD */
    #define PD7     7
    #define PD6     6
    #define PD5     5
    #define PD4     4
    #define PD3     3
    #define PD2     2
    #define PD1     1
    #define PD0     0
    Wenn du auf einen bestimmten Pin eines Ports mit DDRx, PORTx oder PINx zugreifen willst, musst du dazu die Wertigkeit des Pins verwenden und nicht seine Nummer! PC3 ist z.B. das dritte Bit (Zählung startet bei 0!) mit dem Wert 2^3 oder 8. Um diesen Pin einzulesen muss die Abfrage deshalb so aussehen:

    if(PINC & 8)...

    Deshalb verwendet man hier die Bitschieberei um das richtige Bit anzusprechen. (1<<PC3) schreibt die 1 ganz rechts in das Byte und schiebt es dann 3 mal nach links. Das ergibt genau die 8:

    if(PINC & (1<<PC3))...

    Das gilt dann auch hier:

    PORTD ^= (1<<PD5);

    DDRD |= (1<<PD5); //PD5 als Ausgang
    DDRC &=~ (1<<PC3); //PC3 als Eingang

    Hier habe ich das kapiert:
    https://www.roboternetz.de/phpBB2/ze...=295604#295604

    Vielleicht löst das dann schon dein Problem.

    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!

Seite 1 von 7 123 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests