Introducere

Un Line Follower este o masina autonoma care este capabila sa urmareasca o linie deseneta pe un fundal de o culoare diferita.

Descriere generală

Schema bloc hardware

Masina foloseste senzori de lumina pentru a detecta linia.

Cand robotul incepe sa paraseasca linia, senzorii aditionali vor detecta negru.

In acest moment microcontroller-ul va comanda motoarele astfel incat robotul sa revina pe linie

Hardware Design

Robotul foloseste senzori de lumina pentru a se ghida pe traseu. Un senzor este compus dintr-un LED cu infrarosu (emitator) si un fototranzistor cu infrarosu (receptor). Acestea functioneaza dupa urmatorul principiu:


Schema electrica senzor:

Pe o suprafata alba lumina reflectata este suficienta pentru a deschide fototranzistorul. Acesta se satureaza si tensiunea VOUT va fi undeva in jurul 0,4V.

Pe o suprafata neagra fototranzistorul este blocat (sau deschis in regiunea activa, departe de saturatie), iar VOUT va fi aproximativ 2-3V.


Schema placa:

Outputul senzorilor de lumina sunt citite cu ADC-ul.

Software Design

Implementarea algoritmului este una simpla, folosindu-ne de senzorii plasati pe masinuta, aceasta se va incadra astfel incat sa urmareasca linia. Daca unu din senzorii de pe extremitati detecteaza alta culoare, robotul se va intoarce putin pe partea in care e senzorul. Astfel el va ramane tot timpul pe linie. Acesti pasi se efectueaza intr-o bucla inifinta.

while (1){  
 
#ifdef debug 
if(rep<255) 
rep++; 
if(prev!=PINA) { 
prev=PINA; 
printf("%u\r",rep); 
for(i=0;i<8;i++) 
printf("%u\t",(prev>>i)&0x01); 
rep=0; 
} 
#endif 
 
if(PINA!=255){  
         rotpow=255; 
        ldev=rdev=0; 
 
        if(PINA.3==0)  
        rdev=1; 
        if(PINA.2==0)  
        rdev=2; 
        if(PINA.1==0)  
        rdev=3; 
        if(PINA.0==0)  
        rdev=4; 
 
        if(PINA.4==0)  
        ldev=1; 
        if(PINA.5==0)  
        ldev=2; 
        if(PINA.6==0)  
        ldev=3; 
        if(PINA.7==0)  
        ldev=4;  
 
        if(rdev>ldev)  
        move(R,0,195+12*rdev);    
        if(rdev<ldev)  
        move(L,0,195+12*ldev);    
        if(rdev==ldev) 
        move(FWD,0,200); 
        }    
 
else    {  
        for(i=0,dirl=0;i<MAX;i++) { 
        if(history[i]==L) 
        {dirl++;} 
        } 
         if(rotpow<160) {rotpow=160;} 
         if(rotpow<255) {rotpow++;} 
 
        if(dirl>HMAX)  
        {move(CW,0,rotpow);} 
        else  
        {move(CCW,0,rotpow);} 
        }            
}; 
} 
 

Mai exista si alte functii de miscare.

Rezultate Obţinute

In curand…

Concluzii

Partea hardware a fost cea mai grea de facut, dar cu experianta dobandita la laboratoarele de PM a trecut cu bine :)

Jurnal + Poze

01 - 28 februarie → partea hardware

6 - 8 iunie 2010 → partea software

Bibliografie/Resurse

– datasheet atmega16 - 1773.pdf

– datasheet l298 - 1773.pdf

– laboratoare pm

– google

pm/prj2010/avoinescu/line_follower.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0