Hallo,
Das Projekt ist fertig. Die Robot kann die Liene folgen und stoppen bei ein Obstacle. Er braucht die Obstacle Sensoren und die gemachte Lienefolg sensor. Ich habe die Lienefolgsensor in zwei teilen erbaut.
Unterstehend das Programm vor das Projekt.
Code:
#include "RP6RobotBaseLib.h" // moet er altijd bij
uint8_t afstandlezen(uint8_t slinks, uint8_t srechts)
{
task_ACS();
task_RP6System();
if(obstacle_left || obstacle_right)
{
slinks = 0;
}
return slinks;
}
uint8_t licht(uint8_t slinks, uint8_t srechts)
{
task_ACS();
uint8_t lichtlinks;
uint8_t lichtrechts;
uint8_t lichtgrens = 990;
task_ADC;
lichtlinks = adcLSL;
lichtrechts = adcLSR;
if(lichtlinks > lichtgrens || lichtrechts > lichtgrens)
{
slinks=0;
srechts=0;
}
return slinks;
}
uint8_t lijnvolgenlinks(uint8_t snelheidlinks, uint8_t snelheidrechts)
{
task_ACS();
DDRA &= ~E_INT1;
DDRC &= ~(SCL | SDA);
uint8_t templinks;
uint8_t temprechts;
uint8_t tempmidden;
PORTC &= ~SCL;
PORTC &= ~SDA;
uint8_t m101;
uint8_t l100;
uint8_t ll110;
uint8_t r001;
uint8_t rr011;
uint8_t niks000;
uint8_t alles111;
uint8_t delervooruit = 2;
uint8_t delerneteraf = 2;
uint8_t delerverafoptel = 2;
uint8_t delerverafaftrek = 2;
if (snelheidlinks > 20 || snelheidrechts > 20)
{
delervooruit = 5;
}
tempmidden = PINA & E_INT1;
templinks = PINC & SCL;
temprechts = PINC & SDA;
uint8_t casus;
if(templinks && !tempmidden && temprechts)
{
casus=101;
}
if(templinks && !tempmidden && !temprechts)
{
casus=100;
}
if(templinks && tempmidden && !temprechts)
{
casus=110;
}
if(!templinks && !tempmidden && temprechts)
{
casus=001;
}
if(!templinks && tempmidden && temprechts)
{
casus=011;
}
if(!templinks && !tempmidden && !temprechts)
{
casus=000;
}
if(templinks && tempmidden && temprechts)
{
casus=111;
}
switch(casus)
{
case 101: if(l100 > 0)
{
snelheidlinks = snelheidrechts - (snelheidrechts/delerneteraf);
}
if(ll110 > 0)
{
snelheidlinks = snelheidrechts - (snelheidrechts/delerverafaftrek);
}
else
{
snelheidlinks = snelheidlinks +(snelheidlinks/delervooruit);
}
setMotorDir(FWD,FWD);
m101++; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
case 100: snelheidlinks = snelheidlinks - (snelheidlinks / 4);
if (snelheidlinks < 30)
{
snelheidlinks = 30;
}
setMotorDir(FWD,FWD);
m101=0; l100++; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
case 110: snelheidlinks=snelheidlinks+(snelheidlinks/delerverafoptel);
setMotorDir(FWD,BWD);
m101=0; l100=0; ll110++; r001=0; rr011=0; niks000=0; alles111=0; break;
case 001: snelheidlinks=snelheidlinks-(snelheidlinks/delerneteraf);
setMotorDir(FWD,FWD);
m101=0; l100=0; ll110=0; r001++; rr011=0; niks000=0; alles111=0; break;
case 011: snelheidlinks=snelheidlinks-(snelheidlinks/delerverafaftrek);
setMotorDir(BWD,FWD);
m101=0; l100=0; ll110=0; r001=0; rr011++; niks000=0; alles111=0; break;
case 000:
m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000++; alles111=0; break;
case 111:
m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111++; break;
}
task_ACS();
if(snelheidlinks > 50)
{
snelheidlinks = 50;
}
task_RP6System();
if(snelheidlinks < 10)
{
snelheidlinks=10;
}
task_ACS();
return snelheidlinks;
}
uint8_t lijnvolgenrechts(uint8_t snelheidlinks, uint8_t snelheidrechts)
{
task_ACS();
uint8_t templinks;
uint8_t temprechts;
uint8_t tempmidden;
uint8_t m101;
uint8_t l100;
uint8_t ll110;
uint8_t r001;
uint8_t rr011;
uint8_t niks000;
uint8_t alles111;
uint8_t delervooruit = 2;
uint8_t delerneteraf = 2;
uint8_t delerverafoptel = 2;
uint8_t delerverafaftrek = 2;
task_RP6System();
if (snelheidlinks > 20 || snelheidrechts > 20)
{
delervooruit = 5;
}
tempmidden = PINA & E_INT1;
templinks = PINC & SCL;
temprechts = PINC & SDA;
uint8_t casus;
task_RP6System();
if(templinks && !tempmidden && temprechts)
{
casus=101;
}
if(templinks && !tempmidden && !temprechts)
{
casus=100;
}
task_RP6System();
if(templinks && tempmidden && !temprechts)
{
casus=110;
}
if(!templinks && !tempmidden && temprechts)
{
casus=001;
}
if(!templinks && tempmidden && temprechts)
{
casus=011;
}
if(!templinks && !tempmidden && !temprechts)
{
casus=000;
}
if(templinks && tempmidden && temprechts)
{
casus=111;
}
task_RP6System();
switch(casus)
{
case 101:
if(r001 > 0)
{
snelheidrechts = snelheidlinks - (snelheidlinks/delerneteraf);
}
if(rr011 > 0)
{
snelheidrechts = snelheidlinks - (snelheidlinks/delerverafaftrek);
}
else
{
snelheidrechts = snelheidlinks;
}
setMotorDir(FWD,FWD);
m101++; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
case 100: snelheidrechts=snelheidrechts-(snelheidrechts/delerneteraf);
setMotorDir(FWD,FWD);
m101=0; l100++; ll110=0; r001=0; rr011=0; niks000=0; alles111=0; break;
case 110:
snelheidrechts=snelheidrechts-(snelheidrechts/delerverafaftrek);
setMotorDir(FWD,BWD);
m101=0; l100=0; ll110++; r001=0; rr011=0; niks000=0; alles111=0; break;
case 001:
snelheidrechts=snelheidrechts-(snelheidrechts/4);
if(snelheidrechts < 30)
{
snelheidrechts = 30;
}
setMotorDir(FWD,FWD);
m101=0; l100=0; ll110=0; r001++; rr011=0; niks000=0; alles111=0; break;
case 011:
snelheidrechts=snelheidrechts+(snelheidrechts/delerverafoptel);
setMotorDir(BWD,FWD);
m101=0; l100=0; ll110=0; r001=0; rr011++; niks000=0; alles111=0; break;
case 000: m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000++; alles111=0; break;
case 111: m101=0; l100=0; ll110=0; r001=0; rr011=0; niks000=0; alles111++; break;
}
task_ACS();
if(snelheidrechts > 50)
{
snelheidrechts = 50;
}
if(snelheidrechts <10)
{
snelheidrechts=10;
}
task_ACS();
return snelheidrechts;
}
int main(void)
{
initRobotBase();
uint8_t vstart = 10;
powerON();
DDRA &= ~E_INT1;
DDRC &= ~(SCL | SDA);
PORTC &= ~SCL;
PORTC &= ~SDA;
setACSPwrMed();
uint8_t slinks = vstart;
uint8_t srechts = vstart;
uint8_t snelheidlinks;
uint16_t xlinks;
uint8_t zlinks;
uint8_t afstand;
uint8_t x = 0;
while(true)
{
task_RP6System();
slinks = lijnvolgenlinks(slinks,srechts);
srechts = lijnvolgenrechts(slinks,srechts);
task_RP6System();
//slinks = licht(slinks, srechts);
task_RP6System();
slinks = afstandlezen(slinks, srechts);
task_RP6System();
if(slinks == 0)
{
srechts = 0;
}
task_RP6System();
moveAtSpeed(slinks,srechts);
task_RP6System();
}
return 0;
}
Ich habe auch ein Film on youtube gemacht: http://www.youtube.com/watch?v=H-tXpLv0l_M
Vielen dank vor alle Hilfe!
Gruss Fieke
Lesezeichen