hi hans,
für die IR-ortung verwende ich die original IR diode und transistor, sie sind halt nicht an der originalstelle, sondern nach vorne gerichtet und mit leitungen mit den originalanschluss-stellen verbunden (dien IR diode sitzt inzwischen nicht mehr auf den widerständen, sondern ist auf einem kleinen platinchen auf dem anderen großen kondensator mit heisskleber befestigt)...
https://www.roboternetz.de/phpBB2/vi...97eb82ac2ea6e7
als software habe ich folgendes ausprobiert:
Code:
//Programm zum Umfahren von Hindernissen mithilfe der Infrarot-Hinderniserkennung von waste
//zusammengestellt und programmiert von julien
#include "asuro.h"
#include <stdlib.h>
#include "inka.h"
int main(void)
{
float puls;
int hindernis=0;
int richt=0, wegr=0, wegl=0, vorher=0, auswl=0, auswr=0, schritt=0;
unsigned int Rmin = 1024, Rmax = 0, Lmin = 1024, Lmax = 0, Rmitte = 512, Lmitte = 512, lspeed=185, data[2];
unsigned char flagl=FALSE, flagr=FALSE;
Init();
WaitforStart();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
puls = 1;
while(1)
{
if (PIND & (1 << PD0)){
StatusLED(GREEN); // kein Hindernis
} else {
vorher=(int)(puls);
hindernis=1;
StatusLED(RED); // Hindernis erkannt
}
puls = 1.02 * puls; // Pulsbreite wird um 2% erhöht
if (puls > 10){
if (PIND & (1 << PD0)) hindernis=0;
puls = 1;
}
OCR2 = 255 - (int)(puls);
if(hindernis==1){ //"gucken", wo noch ein freier Weg ist und diesen dann fahren
if(schritt==0){ //nach rechts "gucken"
MotorDir(FWD,RWD);
Msleep(100);
}
if(schritt==1){
auswr=(int)(puls);
}
if(schritt==2){ //nach links gucken
MotorDir(RWD,FWD);
Msleep(100);
}
if(schritt==3){
auswl=(int)(puls);
}
if(schritt==4){ //richtigen weg fahren
if(auswr>auswl) richt=1;
if(auswr<auswl) richt=2;
if(auswr==auswl) richt=3;
}
if(schritt<4) schritt++;
}
if(hindernis==0){ //kein Hindernis in Sicht - geradeaus fahren
richt=0;
schritt=0;
OdometrieData(data); // 0. links, 1. rechts
// max links
if (data[0] > Lmax)
Lmax += (data[0] - Lmax) / 2;
// min links
if (data[0] < Lmin)
Lmin -= (Lmin - data[0]) / 2;
// max rechts
if (data[1] > Rmax)
Rmax += (data[1] - Rmax) / 2;
// min rechts
if (data[1] < Rmin)
Rmin -= (Rmin - data[1]) / 2;
Rmitte=(Rmax+Rmin)/2;
Lmitte=(Lmin+Lmax)/2;
if ((data[0] < Lmitte) && (flagl == TRUE)) {
flagl = FALSE;
wegl++;
}
if ((data[0] > Lmitte) && (flagl == FALSE)) {
flagl = TRUE;
wegl++;
}
if ((data[1] < Rmitte) && (flagr == TRUE)) {
flagr = FALSE;
wegr++;
}
if ((data[1] > Rmitte) && (flagr == FALSE)) {
flagr = TRUE;
wegr++;
}
if(wegl<wegr) lspeed++;
if(wegl>wegr) lspeed--;
if(wegl>=1000){ wegl=0; wegr=wegr-1000; } //zurücksetzen, damit kein Überlauf nach
if(wegr>=1000){ wegr=0; wegl=wegl-1000; } //längeren Fahrten passiert
}
if(richt==0) MotorDir(FWD,FWD); //geradeaus
if(richt==1) MotorDir(RWD,FWD); //links
if(richt==2) MotorDir(FWD,RWD); //rechts
if(richt==3) MotorDir(RWD,RWD); //zurück
MotorSpeed(lspeed,155);
}
return 0;
}
es funktioniert
Lesezeichen