Hallo
Das wird so nichts, weil die IR-Abstandsmessung nach Waste beim asuro mit variablen Halbwellen der Trägerfrequenz arbeitet. Das ist letzlich die Meisterleistung seiner Modifikation der asuro-Lib bei der IR-Abstandsmessung.
Wir erzeugen im Moment ein symetrisches Signal bei dem die Impuls- und Pausenzeiten des IR-Signals 50:50 sind. Waste hat den Timer im PWM-Mode betrieben und die Dauer der Halbwellen mit dem OCR2-Register gesteuert. Das kann meine Ansteuerung nicht, weil der OC2-Pin bei der bee zur Motordrehrichtungsansteuerung (PD7, DIR_R) verwendet wird und deshalb nicht zur freien Verfügung steht. (Das ist meiner Meinung nach einer der wenigen Kritikpunkte bei der bee) Um das nachzubilden müßten wir in der ISR zusätzlich eine Software-PWM einbauen. (was natürlich nicht ausschliest, dass wir das noch machen werden;)
Weil ich deine Erweiterungen (noch) nicht an meiner bee angebaut habe, kann ich weiterhin nur "theoretisch" programmieren. Testen mußt du selbst. Das folgende Programm sendet jeweils auf einer Seite ein IR-Signal, prüft, ob der SFH ein IR-Echo empfängt und zeigt das Ergebniss an den roten Leds an:
Der SFH reagiert nach ca. 10 Signalwellen auf eine IR-Trägerfrequenz. Wir senden jeweils ca. 36 Wellen (mit dem schrottigen delay() gemessen) und prüfen dann, ob der SFH etwas erkannt hat. Das funktioniert vermutlich nur zufriedenstellend, wenn die IR-Leds eine deutliche Richtungswirkung haben. Das kann man z.B. mit Schrumpfschläuchen (wie beim Probot) über den Leds erreichen.Code:// nibobee Einfache Abstandsmessung mit Pinselbee-Umbau 11.1.2010 mic // Es werden im Wechsel die rechten und linken IR-Leds mit 36kHz angesteuert // und jeweils das Echo ausgewertet und an den roten Leds angezeigt. // LED3 leuchtet, wenn die ISR aktiv ist. // https://www.roboternetz.de/phpBB2/vi...=480142#480142 // 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 Empfänger SFH5110 ist mit PA2 (X2-AN2) verbunden #include <nibobee/iodefs.h> #include <nibobee/delay.h> #include <nibobee/led.h> #include <stdlib.h> #define FALSE (1==0) #define TRUE (1==1) uint8_t detect_right(void) { uint8_t echo; DDRA |= (1<<PA3); // Trägerfrequenz an Kathoden einschalten TIMSK |= (1 << OCIE2); // ISR aktivieren PORTA |= (1<<PA0); // rechte IR-LEDs einschalten delay(1); // 36 IR-Impulse senden (10 sollten dem SFH genügen) ??? //delay(10); // delay(1) ist nicht immer 1/1000 Sek!!! // SFH Ausgang wird low, wenn er Trägersignal erkennt => echo ist true ;) echo=((PINA & (1<<PA2)) == 0); // SFH hängt an PA2 PORTA &= ~(1<<PA0); // IR-Leds wieder ausschalten TIMSK &= ~(1 << OCIE2); // ISR ausklinken DDRA &= ~(1<<PA3); // keine Trägerfrequenz an Kathoden PORTA &= ~(1<<PA3); // bedeutet alle IR-LEDS aus led_set(LED_R_YE, 0); // ISR-Kontroll-LED aus return(echo); } uint8_t detect_left(void) { uint8_t echo; DDRA |= (1<<PA3); // 36kHz-Trägersignal senden TIMSK |= (1 << OCIE2); PORTA |= (1<<PA1); delay(1); //delay(10); echo=((PINA & (1<<PA2)) == 0); // Echo empfangen? PORTA &= ~(1<<PA1); // Trägersignal ausschalten TIMSK &= ~(1 << OCIE2); DDRA &= ~(1<<PA3); PORTA &= ~(1<<PA3); led_set(LED_R_YE, 0); return(echo); } int main(void) { led_init(); PORTB |= 15; // alle LEDs an delay(2000); // wait4programmer PORTB &= ~15; // alle LEDs aus // Timer2-Setup für 72kHz TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN! OCR2 = 208; // 36kHz @15MHz DDRA |= (1<<PA1) | (1<<PA0); // Anoden der LEDs mit Vorwiderstand an PA0/1 PORTA &= ~((1<<PA1) | (1<<PA0)); // low = LEDs aus DDRA &= ~(1<<PA3); // keine 72kHz-Ansteuerung PORTA &= ~(1<<PA3); // deshalb Kathoden-Pin auf Ausgang ohne PullUp if(TRUE) led_set(0,1); // true-Test ;) sei(); // und los while(1) { if(detect_right()) led_set(2,1); else led_set(2,0); if(detect_left()) led_set(1,1); else led_set(1,0); delay(1000); } } ISR (TIMER2_COMP_vect) { static uint8_t status=0; if(status) { led_set(LED_R_YE, 1); // Kontroll-LED PORTA |= (1<<PA3); status=0; } else { led_set(LED_R_YE, 0); PORTA &= ~(1<<PA3); status=1; } }
Ob das Programm wie erwartet fumktioniert mußt du testen. Bei meiner bee ohne deine Erweiterung ist der X3-Slot nicht belegt und die PA2/3-Pins hängen frei in der Luft. Deshalb kann ich mit dem Daumen eine Brücke zwischen GND und PA2 machen und so einen SFH-Empfang simulieren ;)
Wie groß sind eigentlich die Vorwiderstände der IR-LEDs? Vorsichtshalber sollten nie beide Seiten eingeschaltet sein um eine Überlastung von PA3 zu vermeiden.
Gruß
mic







Zitieren

Lesezeichen