PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Ir sensor



zigenpeter
08.12.2008, 13:52
hallo
ich weis das dieses thema schon sehr oft hier besprochen wurde aber leider finde ich nicht die richtige antwort .

Ich habe folgendes Problem ich hab den Ir sensor / empfänger des Asuro wie bei vielen schon beschreiben noch vorne gerichtet und umgebaut .

Nur mit dem Programm hab ich ein Problem und zwar hab ich den test Code aus dem Forum aufgespielt und sie klappt auch auf dem Asuro nur möchte ich das er bei erkennung eines hindernis nicht die Farbe der Satus LED ändert sondern stoppt und nach rechts solange dreht bis kein Hinderniss mehr da ist und dann wieder geradeaus weiter fährt !! Leider weis ich nicht wie ich dies in den Code einfügen kann


Hier der Code :

#include "asuro.h"
#include <stdlib.h>

int main(void)
{

unsigned char sw;

Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW

while(1)
{
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);

sw = PollSwitch();
if (sw & 0x01)
OCR2 = 0xFE; //Pulsbreite 1
if (sw & 0x02)
OCR2 = 0xFD; //Pulsbreite 2
if (sw & 0x04)
OCR2 = 0xFB; //Pulsbreite 4
if (sw & 0x08)
OCR2 = 0xF7; //Pulsbreite 8
if (sw & 0x10)
OCR2 = 0xEF; //Pulsbreite 16
if (sw & 0x20)
OCR2 = 0x90; //Pulsbreite 110
}
return 0;
}

radbruch
08.12.2008, 16:15
Hallo

Vielleicht funktioniert es so:

if (PIND & (1 << PD0))
{
StatusLED(GREEN); // freie Fahrt vorwärts
MotorDir(FWD, FWD);
MotorSpeed(150,150);
}
else
{
StatusLED(RED); // Hindernis erkannt
MotorDir(BREAK, RWD);
MotorSpeed(0,150);
while(!(PIND & (1 << PD0))); // warten bis kein Hindernis voraus
Sleep(255); // noch etwas weiterschwenken
}


Habe ich aber nicht selbst getestet.

Gruß

mic

zigenpeter
09.12.2008, 15:24
danke schon mal für die schnelle antwort leider hab ich jetzt noch ein problem :

ich hab den code mit dem besipiel code für geradeaus fahren kombiniert leider klappt das nicht ganz !!

Asuro soll solange gerade aus fahren mit der Odometrie auswertung und bei hinderniss rechts schwenken

so sieht der code derzeit aus : Leider taucht dabei immer folgender fehler auf :

test.c:68: error: parse error before "else"

was is falsch ??


#include "asuro.h"
#include <stdlib.h>

// Schwellwert fr die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 800
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1

int main(void)
{

Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW



if (PIND & (1 << PD0))
{
StatusLED(GREEN); // freie Fahrt vorwärts
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
MotorDir(FWD, FWD);
while(1)

{
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz?ler
// den erlaubten Wertebereich verl?st
if (difference<-255) difference=-255;
if (difference>255) difference=255;

// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);

// Z?ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(255-difference,255);
else MotorSpeed(255,255+difference);
}

else
{
StatusLED(RED); // Hindernis erkannt
MotorDir(BREAK, RWD);
MotorSpeed(0,200);
while(!(PIND & (1 << PD0))); // warten bis kein Hindernis voraus
Sleep(255); // noch etwas weiterschwenken
}
return 0;
}