Hallo,
ich habe folgenden Code angepasst und getestet:
Wenn ich mit der Digitalkamera daraufblicke, leuchten beide LEDs. Irgendwie habe ich das Gefühl, als ob beide Dioden Synchron leuchten und nicht getrennt voneinander die Abstandsmessung durchführen.Code:/************************************************************************ Test Programm fuer den ASURO IR-Adapter Der ASURO ermittelt ueber den nach vorne gerichteten Infrarot Empfänger und Sender über die Reflektion des Lichtes an einem Objekt ungefaehr dessen Abstand. Es wird je nach Abstand die Status-LED in verschiedenen Farben eingeschaltet. Bei der größten Reflexion werden zusätzlich die Rueckfahr-LEDs eingeschalten. Zur Compilierung dieses Programmes wird asuro.c und asuro.h aus der ASURO Lib 2.6.1 benötigt. Die ASURO Lib ist auf sourceforge zu finden. ************************************************************************ Hardware: ASURO Roboter prozessor: ATMEGA32 clock: 16MHz Crystal **************************************************************************** date authors version comment ====== ====================== ======= ============================== Jan.08 (ch) robo.fr V1.0 First implemetation Mai 08 (aut) pinsel120866 V1.1 Erweitert auf 2 IR-Dioden Versions: V1.0 - first version ***************************************************************************/ /*************************************************************************** * * (c) 2007 robo.fr , christoph(at)roboterclub-freiburg.de * *************************************************************************** * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation version 2 of the License, * * If you extend the program please maintain the list of authors. * * If you want to use this software for commercial purposes and you * * don't want to make it open source, please contact the authors for * * licensing. * ***************************************************************************/ #include "asuro.h" #include <stdlib.h> /************************************************************************* uint8_t objekt_sichtbar(uint8_t abstand) Ist ein Objekt in der Entfernung kleiner oder gleich dem Eingangsparameter "abstand" erkennbar? objekt_sichtbar(7) liefert TRUE zurück, falls überhaupt ein Object detektierbar. abstand: 0: 5cm 1: 7cm 2: 13cm 3: 15cm 4: 16cm 5: 17cm 6: 18cm 7: 22cm ( Testobjekt: Joghurtecher, Umgebungsbeleuchtung: Zimmer ) return: TRUE falls Objekt gefunden FALSE wenn nicht Zeitbedarf: 5ms *************************************************************************/ uint8_t objekt_sichtbar_rechts(uint8_t distance) { uint16_t j,z; DDRD |= (1 << DDD1); // Port D1 als Ausgang PORTD &= ~(1 << PD1); // PD1 auf LOW OCR2 = 254-distance; // wenn OCR2=0xFE dann Objekt sehr nahe z=0; for(j=0;j<30;j++) // loop time: 5ms { if (PIND & (1 << PD0))z++; Sleep(6); // 6*Sleep(6)=1ms } if (z>=29) return FALSE; // Objekt nicht gefunden else return TRUE; } uint8_t objekt_sichtbar_links(uint8_t distance) { uint16_t j,z; DDRB|= (1 << DDB1); // Port B1 als Ausgang PORTB &= ~(1 << PB1); // PB1 auf LOW OCR2 = 254-distance; // wenn OCR2=0xFE dann Objekt sehr nahe z=0; for(j=0;j<30;j++) // loop time: 5ms { if (PIND & (1 << PD0))z++; Sleep(6); // 6*Sleep(6)=1ms } if (z>=29) return FALSE; // Objekt nicht gefunden else return TRUE; } /************************************************************************* uint8_t abstand() Abstandsermittelung über IR-Sendiode / IR-Empfänger. 0:kleinster Abstand 7:größter Abstand 255: kein Objekt Zeitbedarf: 5ms*9=45ms *************************************************************************/ uint8_t abstand_rechts() { uint8_t k,n; k=255; for(n=0;n<8;n++) { if (!objekt_sichtbar_rechts(n)) k=n; // solange kein Objekt, Distanz erhoehen } return k; } uint8_t abstand_links() { uint8_t l,m; l=255; for(m=0;m<8;m++) { if (!objekt_sichtbar_links(m)) l=m; // solange kein Objekt, Distanz erhoehen } return l; } /************************************************************************* Hauptprogramm *************************************************************************/ int main(void) { uint8_t n,m; Init(); FrontLED(ON); while(1) { n=abstand_rechts(); m=abstand_links(); StatusLED(OFF); BackLED(OFF,OFF); if ((n!=255) || (m!=255)) { if (n<2) StatusLED(GREEN); if (m<2) StatusLED(RED); Msleep(10); } else StatusLED(YELLOW); } }







Zitieren

Lesezeichen