- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 38

Thema: ACS an NIBObee

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Ach, ich weiß gar nicht wie oft und viel ich dir noch danken soll ich habe das Programm mal geflasht. Die LEDs leuchten auch, aber wie stelle ich fest, ob die IR-LEDs auch leuchten? habe mal gehört man kann das mit einer Kamera irgendwie sehen?

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Mit einer Digicam/Handycam kann man das IR-Licht erkennen. Gegenprobe wäre eine Fernbedienung die auch von der Kamera gesehen werden kann. Meine IR-LEDs (und auch der lötempfindliche IR-Empfänger) sind gesteckt, zum Testen kann ich sie gegen normale LEDs austauschen.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Hallo!
    Ich habe mal deinen Code geflasht:
    Code:
    // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0) 
    // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1) 
    // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden 
    // Der IR-Empfänger ist mit PA2 (X2-AN2) verbunden 
    
    // pacman-bee 
    #define ddr_acs_led_l      DDRA     // Anoden der IR-LEDs links 
    #define port_acs_led_l     PORTA 
    #define pin_acs_led_l    (1<<PA1) 
    
    #define ddr_acs_led_r      DDRA    // rechts 
    #define port_acs_led_r     PORTA 
    #define pin_acs_led_r     (1<<PA0) 
    
    #define ddr_acs_36kHz      DDRA     // Kathoden der IR-LEDS mit 36kHz getaktet 
    #define port_acs_36kHz     PORTA 
    #define pin_acs_36kHz     (1<<PA3) 
    
    #define ddr_acs_tsop      DDRA     // Eingang IR-Empfänger 
    #define port_acs_tsop     PINA  // Achtung, das ist ein Eingang! 
    #define pin_acs_tsop      (1<<PA2) 
    
    
    #include <avr/io.h> 
    #include <util/delay.h> 
    
    void leds(uint8_t status)    // status bit0 bis 3 entspricht den LED0 bis 3 
    { 
        PORTB &= 0b11110000;    // alle LED ausschalten 
        PORTB |= 0b1111 & status;    // gewünschte LED einschalten 
    } 
    
    int main(void) 
    { 
        DDRB |= 0b1111; // PB0 bis PB3 sind die LED 0 bis 3 
        leds(0b1001); // LED 0 und 3 einschalten 
        _delay_ms(10000); // eine Sekunde warten 
        leds(0); // alle LED ausschalten 
    
        ddr_acs_led_l |= pin_acs_led_l; // linke ACS-LED Anode 
        ddr_acs_36kHz |= pin_acs_36kHz; // Kathoden beide LED 
        port_acs_36kHz &= ~pin_acs_36kHz; // Dauerlicht 
        
        while(1) 
        { 
            port_acs_led_l |= pin_acs_led_l; // linke IR-LED anschalten 
            leds(0b0010); // LED1 zur Kontrolle einschalten 
            _delay_ms(5000); 
    
            port_acs_led_l &= ~pin_acs_led_l; // linke IR-LED ausschalten 
            leds(0); // LED1 zur Kontrolle ausschalten 
            _delay_ms(3000); 
        } 
        return(0); 
    }
    Bei diesem Programm leuchten zwar die LEDs wie vorgeschrieben, die IR-LEDs allerdings nicht. Die IR-LEDs sind alle richtig rum eingebaut und es gibt auch keine kalten Lötstellen. Danach habe ich mit dem Multimeter an den Anschlüssen von X1, X2 und X3 gemessen und festgestellt, dass dort überhaupt keine Spannung anliegt (bzw. 0,09 V).
    Wie kann das sein?

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Zumindest zwischen + und - sollte an allen Erweiterungssteckern die Bordspannung messbar sein. Testweise kann man anstelle der Pausen einen Programmstop einfügen, dann hat man mehr Zeit zum Messen. Aus _delay_ms(5000); wird ein schlichtes while(1); (mit Semikolon!)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    So, Problem gefunden, die Akkus waren fast leer. Jetzt klappt alles.
    Mittlerweile habe ich auch ein Programm geschrieben was beide IR-LEDs leuchten lässt.
    Könntest du mir jetzt vielleicht abschließend erklären, wie ich den TSOP einbinden kann? Sprich wie ich ihn definiere und wie ich ihn in if-Bedingungen einbinden kann.

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Code:
    // Übungen für ACS an Nibobee                                         11.6.11 mic
    
    // https://www.roboternetz.de/community/showthread.php?53494-ACS-an-NIBObee
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "acs_defines.h" // Definitionen als Headerdatei einbinden
    
    void set_leds(uint8_t status)
    {
    	PORTB &= 0xf0;
    	PORTB |= (0x0f & status);
    }
    
    int main(void)
    {
    	ddr_acs_led_l |= pin_acs_led_l;
    	//port_acs_led_l |= pin_acs_led_l;
    	port_acs_led_l &= ~pin_acs_led_l;
    
    	ddr_acs_led_r |= pin_acs_led_r;
    	//port_acs_led_r |= pin_acs_led_r;
    	port_acs_led_r &= ~pin_acs_led_r;
    
    	ddr_acs_36kHz |= pin_acs_36kHz;
    	port_acs_36kHz &= ~pin_acs_36kHz;
    	
    	DDRB |= 0x0f; // LEDs
    	set_leds(0b1001);
    	_delay_ms(1000);
    	set_leds(0);
    
    	while(1)
    	{
    		if(port_acs_tsop & pin_acs_tsop)
    			set_leds(0b0001);
    		else
    			set_leds(0b1000);
    	}
    	return(0);
    }
    Deine Datei acs_defines.h:
    Code:
    // pacman-bee
    
    // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0)
    // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1)
    // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden
    // Der IR-Empfänger ist mit PA2 (X2-AN2) verbunden
    
    #define ddr_acs_led_l  	DDRA 	// Anoden der IR-LEDs links
    #define port_acs_led_l 	PORTA
    #define pin_acs_led_l	(1<<PA1)
    
    #define ddr_acs_led_r  	DDRA    // rechts
    #define port_acs_led_r 	PORTA
    #define pin_acs_led_r 	(1<<PA0)
    
    #define ddr_acs_36kHz  	DDRA 	// Kathoden der IR-LEDS mit 36kHz getaktet
    #define port_acs_36kHz 	PORTA
    #define pin_acs_36kHz 	(1<<PA3)
    
    #define ddr_acs_tsop  	DDRA 	// Eingang IR-Empfänger
    #define port_acs_tsop 	PINA  // Achtung, das ist ein Eingang!
    #define pin_acs_tsop  	(1<<PA2)
    [Edit]
    Mittlerweile habe ich auch ein Programm geschrieben was beide IR-LEDs leuchten lässt.
    #define ddr_acs_36kHz DDRA // Kathoden der IR-LEDS mit 36kHz getaktet

    Das ist dir aber sicher auch schon aufgefallen ;)

    Du bist nun da wo Pinsel gestartet ist:
    https://www.roboternetz.de/community...bstandsmessung

    Um es nun etwas abzukürzen:

    PHP-Code:
    // ACS Testprogramm für die bee                                      11.6.2011 mic

    // Infrarot-ACS für die bee im zweiten Anlauf mit pacman ;)

    // https://www.roboternetz.de/community/showthread.php?53494-ACS-an-NIBObee
    // https://www.roboternetz.de/community/showthread.php?46233-nibobee-IR-Abstandsmessung
    // &p=444151&viewfull=1#post444151

    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include "acs_defines.h" // Definitionen der ACS-Hardware als Headerdatei einbinden

    volatile uint8_t count36kHz;
    volatile uint8_t acs=0;

    void Sleep(uint8_t pause);
    void Msleep(uint16_t pause);
    void ACSData(uint16_t *data);

    int main(void)
    {
        
    uint16_t data[2]; // Speicher für ACS-Werte

        
    led_init();

        
    // Setup Timer2
        
    TCCR2 = (<< WGM20)|(<< CS20); // PhaseCorrect-PWM, no prescaling, no OC2-Pin!
        
    TCNT2  96// (512-416) 36kHz @15MHz
        
    OCR2 151// (255-(208/2)) 151 ist 50:50 Compare Match für symetrische Halbwellen
        
    TIMSK |= (<< OCIE2)|(<< TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum!
        
    enable_interrupts();

        
    ddr_acs_led_l |= pin_acs_led_l;        // die Anoden der IR-LEDs
        
    port_acs_led_l &= ~pin_acs_led_l;

        
    ddr_acs_led_r |= pin_acs_led_r;
        
    port_acs_led_r &= ~pin_acs_led_r;

        
    ddr_acs_36kHz |= pin_acs_36kHz;        // die Kathoden der IR-LEDs

          
    led_set(0,1);
        
    Msleep(2000); // wait4programmer
          
    led_set(0,0);

        while(
    1)
       {
          
    ACSData(data);
          
    PORTB &= ~15// alle Leds aus
          
    if(data[0] > 251led_set(1,1);
             else if(
    data[0] > 230led_set(0,1);
          if(
    data[1] > 251led_set(2,1);
             else if(
    data[1] > 230led_set(3,1);
          
    Msleep(100);
       }
       return(
    0);
    }
    ISR (TIMER2_COMP_vect)
    {
        
    port_acs_36kHz ^= pin_acs_36kHz// IR-LEDs togglen
    }
    // Frequenzkorrektur für 36kHz (512-416 plus 3 Takte fürs Laden von TCNT2?)
    ISR (TIMER2_OVF_vect)
    {
        
    TCNT2  += 99// += bewirkt, dass schon erfolgte Zähltakte nicht ignoriert werden!
        
    port_acs_36kHz &= ~pin_acs_36kHz// bei Nulldurchgang soll die IR-LED aus sein!
        //port_acs_36kHz |= pin_acs_36kHz; // seltamerweise funktioniert das auch?
        
    if(count36kHzcount36kHz--;
       if(
    acsacs--;
    }

    void Sleep(uint8_t pause// 1/36000 Pause blockierend
    {
        
    count36kHz=pause;
        while(
    count36kHz);
    }
    void Msleep(uint16_t pause// 1/1000 Pause blockierend
    {
        while(
    pause--) Sleep(36);
    }
    void ACSData(uint16_t *data)
    {
       
    OCR2=253;
       
    port_acs_led_l |= pin_acs_led_l// ACS LED left on
       
    while((port_acs_tsop pin_acs_tsop) && (OCR2 151))
       {
          
    acs=10// Impulse senden, acs wird in OVF-ISR runtergezählt
          
    while(acs);
          
    OCR2--;
       }
       
    port_acs_led_l &= ~pin_acs_led_l// ACS LED left off
       
    data[0]=OCR2;
       while(!(
    port_acs_tsop pin_acs_tsop)); // warten bis keine Echo mehr

       
    OCR2=253;
       
    port_acs_led_r |= pin_acs_led_r// ACS LED right on
       
    while((port_acs_tsop pin_acs_tsop) && (OCR2 151))
       {
          
    acs=10;
          while(
    acs);
          
    OCR2--;
       }
       
    port_acs_led_r &= ~pin_acs_led_r// ACS LED right off
       
    data[1]=OCR2;
       while(!(
    port_acs_tsop pin_acs_tsop));

    Das Programm reagiert auf die Annäherung eines Hindernisses und auf eine Fernbedienung. Es wird nun doch die nibobee-Library verwendet. Erklärung folgt...
    Geändert von radbruch (11.06.2011 um 15:23 Uhr) Grund: Testprogramm angefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    vielen Dank, radbruch! Du hast mir sehr geholfen und mir viel beigebracht. Nachdem ich ein Programm geschrieben hab, wobei der NIBObee fährt und an Hindernisse vorbeifährt, melde ich mich wieder, damit du "dein" Werk begutachten kannst

    achso und:
    #define ddr_acs_36kHz DDRA // Kathoden der IR-LEDS mit 36kHz getaktet

    Das ist dir aber sicher auch schon aufgefallen
    ja, das ist mir aufgefallen.....nur halt ein bischen später

Ähnliche Themen

  1. NiboBee und Windows 7
    Von m125 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 12.02.2015, 11:21
  2. nibobee IR-Abstandsmessung
    Von pinsel120866 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 39
    Letzter Beitrag: 10.10.2011, 10:19
  3. Nibobee: Rad-Getriebe
    Von c07 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 16
    Letzter Beitrag: 21.01.2011, 15:57
  4. Nibobee laden
    Von Blacky666 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 07.12.2010, 12:08
  5. USB-Programmierer vom Nibobee
    Von Silver-Drago im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 06.11.2010, 01:39

Berechtigungen

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

LiFePO4 Speicher Test