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:
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;
}
}
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.
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
Lesezeichen