kannst du was über die Genauigkeit (mm) und Geschwindigkeit (Hz) deiner Methode sagen?
kannst du was über die Genauigkeit (mm) und Geschwindigkeit (Hz) deiner Methode sagen?
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!
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.
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!
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?
Hallo
Naja, Sinn würde das schon machen:
Der ACS-Code stammt von hier: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); }
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!
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.
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!
Ist OK, habe ich auch gerade beim Vergleichen festgestellt.
Kleine Verbesserungfür deinen Nachbau: Löte das SFH von unten ein - siehe Foto.
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:
Gruß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)); }
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen