- 3D-Druck Einstieg und Tipps         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 40

Thema: nibobee IR-Abstandsmessung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    20.09.2011
    Ort
    Bremen
    Beiträge
    21
    kannst du was über die Genauigkeit (mm) und Geschwindigkeit (Hz) deiner Methode sagen?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von elektrolutz
    Registriert seit
    20.04.2010
    Ort
    Werl
    Alter
    67
    Beiträge
    139
    Hallo knapsen,

    neue IR-Abstandsensoren für den NiboBee siehe hier: http://www.nicai-systems.com/de/zubehoer/bkit-xs.html

    Die Messgenauigkeit und Messweite hängt sicherlich von den Lichtverhältnissen ab (z.B. störendes UV-Licht) und von Form und Farbe des gemessenen Objektes ab.

    Die Messgeschwindigkeit hängt von der Taktfrequenz des verwendeten Proz ab (für den NiboBee gibt es ja ein Tuning-Kit) und natürlich vom Programm.
    Gruß aus Werl
    elektrolutz

    Theorie ist, wenn man weiß, wie alles funktioniert. Praxis ist, wenn alles klappt und keiner weiß warum!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    20.09.2011
    Ort
    Bremen
    Beiträge
    21
    Ich würde gerne die Wellenbewegung einer eingefärbten Wasseroberfläche in einem untransparenten Tank messen.
    Es wäre doch möglich, die Wellenhöhe durch den Abstand vom Sensor zur Oberfläche zum Zeitpunkt x an einem Punkt zu detektieren. Dabei muss das es aber auf ca. 1mm genau sein und mir ca. 50 Daten pro Sekunde (50Hz) liefern.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von elektrolutz
    Registriert seit
    20.04.2010
    Ort
    Werl
    Alter
    67
    Beiträge
    139
    Hallo knapsen,

    oops, da wirst Du aber mit den "Trivial-Sensoren" des NiboBee nicht weit kommen.

    Schau mal hier: http://www.de.endress.com/#products/fuellstand Hier findest Du einiges an Informationen zu Möglichkeiten und Tücken der Füllstandmessung.

    Die Sende-Diode strahlt einen Lichtkegel aus, je weiter der Abstand des Messpunktes, desto breiter ist also auch der Lichtkegel. Der Empfänger reagiert dann auf alle Reflexionen aus diesem Lichtkegel.
    Begrenzt man den Lichtkegel zu stark, reduziert sich auch die brauchbar abgestrahlte Lichtmenge und somit die Empfindlichkeit der Senorik.
    Bündelt man das Licht (wie bei einen Laserstrahl) stellt sich die Frage, ob der reflektierte Lichtstahl auch noch den Empfänger trifft.

    Speziell bei Flüssigkeiten ist eine optische Messung etwas problematisch, denn Flüssigkeiten verdunsten und der Nebel setzte sich auf den Optiken der Sensoren ab und stört so die Messgenauigkeit.

    Welche Mittel/Gerätschaften stehen Dir für die Lösung dieser Messaufgabe zur Verfügung?

    Recht einfach wäre eine Messung durch einen Schwimmer in einem offenen Röhrchen, hier muss man dan aber berücksichtigen, dass dabei die Wellenspitzen der Wasseroberfläche durch die Trägheit des Schwimmers und die Kapillarbildung im Röhrchen bedämpft werden.
    (Ich gehe davon aus, dass Du die Wellenbewegung nur an einer Stelle betrachten möchtest und nicht die Wellenverteilung auf der Wasseroberfläche.)
    Gruß aus Werl
    elektrolutz

    Theorie ist, wenn man weiß, wie alles funktioniert. Praxis ist, wenn alles klappt und keiner weiß warum!

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    59
    Beiträge
    847
    Hi,

    funktioniert - ich habe die Sekunde herausgenommen und mit einer Fernbedienung den SFH angeblinkt. Die roten LEDs flackern dann.

    Kannst du die "pulsweitenmoduliertes 36kHz-IR-Signal - Geschichte" noch in das gestrige Programm einbauen, oder macht dies im Moment noch keinen Sinn?

  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
    Hallo

    Naja, Sinn würde das schon machen:
    Code:
    // Nibobee ACS mit Pinselbee                                          12.1.2010 mic
    
    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include <nibobee/sens.h>
    
    volatile uint8_t count36kHz;
    volatile uint8_t acs=0;
    
    void Sleep(uint8_t pause);
    void Msleep(uint16_t pause);
    
    void ACSData(uint16_t *data)
    {
       OCR2=253;
       PORTA |= (1<<PA1); // ACS LED left on
       while((PINA & (1<<PA2)) && (OCR2 > 151))
       {
          acs=15; //15 Impulse senden, acs wird in OVF-ISR runtergezählt
          while(acs);
          OCR2--;
       }
       PORTA &= ~(1<<PA1); // ACS LED left off
       data[0]=OCR2;
       while(!(PINA & (1<<PA2))); // warten bis keine Echo mehr
    
       OCR2=253;
       PORTA|= (1<<PA0); // ACS LED right on
       while((PINA & (1<<PA2)) && (OCR2 > 151))
       {
          acs=15;
          while(acs);
          OCR2--;
       }
       PORTA &= ~(1<<PA0); // ACS LED right off                            6
       data[1]=OCR2;
       while(!(PINA & (1<<PA2)));
    }
    
    int main(void)
    {
    	uint16_t data[2]; // Speicher für ACS-Werte
    
    	led_init();
      	sens_init();
    
    	// Setup Timer2
    	TCCR2 = (1 << WGM20)|(1 << 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 |= (1 << OCIE2)|(1 << TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum!
    	enable_interrupts();
    
      	led_set(0,1);
    	Msleep(2000); // wait4programmer
    
    	DDRA |= (1<<PA3)|(1<<PA1)|(1<<PA0);
    	PORTA &= ~((1<<PA3)|(1<<PA1)|(1<<PA0));
    	//DDRB |= (1<<PB4); // Test mit LineLEDs
    	//PORTB &= ~(1<<PB4);
    	
    	while(!sens_getLeft() & !sens_getRight()) // solange keine Taste gedrückt wird
    		{Msleep(200); PORTB ^= (1<<PB0);} // hektisches Blinken mit LED0
    
    	while(1)
    	{
    	   ACSData(data);
    		PORTB &= ~15; // alle Leds aus
    		if(data[0] > 250) led_set(1,1);
    		   else if(data[0] > 230) led_set(0,1);
    		if(data[1] > 250) led_set(2,1);
    		   else if(data[1] > 230) led_set(3,1);
    	   Msleep(100);
    	}
    	return(0);
    }
    ISR (TIMER2_COMP_vect)
    {
    	PORTA ^= (1<<PA3); // IR-LEDs togglen
    	//PORTB ^= (1<<PB4); // Test mit LineLEDs
    }
    // Frequenzkorrektur 512-416 plus 3 Takte fürs Laden von TCNT2?
    ISR (TIMER2_OVF_vect)
    {
    	TCNT2  = 99;
    	if(count36kHz) count36kHz--;
       if(acs) acs--;
    }
    
    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);
    }
    Der ACS-Code stammt von hier:
    https://www.roboternetz.de/phpBB2/ze...=459661#459661

    ACSData() liefert Werte von 151(kein Echo) bis 253(vor der Nase) und funktioniert wie LineData() oder Odometriedata() beim asuro. Ich hab's mit einer Brücke zwischen X2:1 (PA2) und X2:3 (GND) getestet....

    Gruß

    mic

    [Edit]
    Tilde entfernt s.u.
    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 Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    59
    Beiträge
    847
    Hi mic,

    ich habe deinen Code getestet, mit dem Ergebnis dass die IR-LEDs auf der rechten Seite nicht leuchten. Links wird der Abstand mit der gelben und roten LED angezeigt.

    Übrigens, dieIR-LED-Widerstände haben 150 Ohm.

  8. #8
    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

    Im Moment habe ich das auch bemerkt (weil ich grad deine Erweiterung nachbaue). Hier ist die Tilde zuviel:

    PORTA|= ~(1<<PA0); // ACS LED right on
    _______^__________________________

    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!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von pinsel120866
    Registriert seit
    18.12.2007
    Ort
    Hohenems
    Alter
    59
    Beiträge
    847
    Ist OK, habe ich auch gerade beim Vergleichen festgestellt.

    Kleine Verbesserungfür deinen Nachbau: Löte das SFH von unten ein - siehe Foto.

  10. #10
    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

    Danke für den Tipp, er kommt leider zu spät ;)

    Bild hier   Bild hier   Bild hier   Bild hier  
    (Wegen der Qualität meiner Lötstellen sind die Pics mit Absicht unscharf ;)

    Ich verwende nur einen 120 Ohm Widerstand für beide LEDs an der Kathode, der erscheint mir allerdings zu groß. Links habe ich noch keinen Empfang mit der IR-LED, mit der Fernbedienung funzt es aber. Ich verwende einen IRM 2636A mit 3mm-IR-LEDS aus der Kruschtelkiste (von meiner Cam= 100%-Recycling;). Vielleicht passen die Wellenlängen nicht optimal. Mein Code mit LCD:
    Code:
    // Nibobee ACS mit radbruchbee                                          13.1.2010 mic
    
    #define acs_led_l (1<<PA2) // Anoden der IR-LEDs
    #define acs_led_r (1<<PA3)
    #define acs_36kHz (1<<PC2) // Kathoden der IR-LEDS mit 36kHz getaktet und 120R
    #define acs_tsop  (1<<PC3) // Ausgang IR-Empfänger
    
    #include <nibobee/iodefs.h>
    #include <nibobee/delay.h>
    #include <nibobee/led.h>
    #include <stdlib.h>
    #include "lcd_lib.c"
    
    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();
    	lcd_init();                   // lcd initialisieren
    
    	// Setup Timer2
    	TCCR2 = (1 << WGM20)|(1 << 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 |= (1 << OCIE2)|(1 << TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum!
    	enable_interrupts();
    
      	led_set(0,1);
    	Msleep(2000); // wait4programmer
    
    	DDRA |= acs_led_l|acs_led_r;			// die Anoden der IR-LEDs
    	PORTA &= ~(acs_led_l|acs_led_r); 	// muss angepasst werden!!!
    	DDRC |= acs_36kHz;                  // die Kathoden der IR-LEDs
    	DDRC &= ~acs_36kHz;                 // muss angepasst werden!!!
    
       lcd_cls();                    // lcd Inhalt löschen
       lcd_locate(2,0);
       lcd_writeString("NIBOBee mit ACS");
       lcd_locate(8,2);
       lcd_writeString("13.1.10 mic");
       lcd_locate(0,3);
       lcd_writeString("Bitte Taste druecken");
       while(!lcd_getkeys())
    		{Msleep(100); PORTB ^= (1<<PB0);} // hektisches Blinken mit LED0
    
       lcd_cls();                    // lcd Inhalt löschen
       lcd_locate(2,0);
       lcd_writeString("NIBOBee mit ACS");
       lcd_locate(0,2);
       lcd_writeString("ACS links:");
       lcd_locate(0,3);
       lcd_writeString("ACS rechts:");
    
    	while(1)
    	{
    	   ACSData(data);
    		lcd_locate(13,2);
    		lcd_writeInteger(data[0], 10);
       	lcd_writeString("  ");
       	lcd_locate(13,3);
    		lcd_writeInteger(data[1], 10);
       	lcd_writeString("  ");
    	   Msleep(100);
    	}
    	return(0);
    }
    ISR (TIMER2_COMP_vect)
    {
    	PORTC ^= 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;
    	if(count36kHz) count36kHz--;
       if(acs) acs--;
    }
    
    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;
       PORTA |= acs_led_l; // ACS LED left on
       while((PINC & acs_tsop) && (OCR2 > 151))
       {
          acs=30; //15 Impulse senden, acs wird in OVF-ISR runtergezählt
          while(acs);
          OCR2--;
       }
       PORTA &= ~acs_led_l; // ACS LED left off
       data[0]=OCR2;
       while(!(PINC & acs_tsop)); // warten bis keine Echo mehr
    
       OCR2=253;
       PORTA|= acs_led_r; // ACS LED right on
       while((PINC & acs_tsop) && (OCR2 > 151))
       {
          acs=30;
          while(acs);
          OCR2--;
       }
       PORTA &= ~acs_led_r; // ACS LED right off
       data[1]=OCR2;
       while(!(PINC & acs_tsop));
    }
    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 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress