Lijnvolger

Dit is een projectje dat ik een paar jaar geleden in school voor een projectweek samen met 2 klasgenoten heb gebouwd .

Nadat we de Cruiser Micromouse hadden gemaakt hadden we een sensor printje voor een lijnvolger over. De school had nog een chassis voor een zelfde robotje dus hebben we beslist om ook maar een lijnvolger te maken. De aansturingsprint hebben we zelf ontworpen, deze keer op basis van een PIC16F876A.

 

De lijnvolger moet de lijn volgen. Dit gebeurt doordat de sensoren, die voor op de robot zitten, infrarood licht uitzenden naar de ondergrond. Het infrarode licht wordt gereflecteerd door de ondergrond en wordt opgevangen door fototransistoren. Die zijn aangesloten op de analoge ingangen van de PIC. Als de waarde van die ingangen kleiner is dan een ingestelde waarde dan is de ondergrond wit. Als er links of rechts gedetecteerd wordt dan gaat de robot bijsturen. De buitenste sensoren worden niet gebruikt omdat hier nooit wordt gedetecteerd.
Op het zelfgemaakt printje zitten 4 groene ledjes: Led 1 is de power led, led 2 gaat aan als er naar rechts gedraaid wordt, led 3 bij vooruit rijden en led 4 bij links draaien.

 

Schema main print:

Schema sensor print:

Filmpje van de lijnvolger in actie:

 

Code (Picbasic):

'*************************************************
'*Naam   : Lijnvolger                            *           
'*Auteurs: Coenen Stijn, Thomas Rob,van Roy Stijn*
'*Datum  : 18/02/2009                            *             
'*************************************************
Device 16F876A
Config      WDT_OFF, PWRTE_ON, HS_OSC, lvp_off
XTAL        = 20

Declare ADIN_RES 10       ' 10-bit result required 
Declare ADIN_TAD FRC      ' RC OSC chosen 
Declare ADIN_STIME 50     ' Allow 50us sample time 

Dim sensor_waarde As Word

Dim detect_links2 As Bit
Dim detect_links1 As Bit
Dim detect_midden As Bit
Dim detect_rechts1 As Bit
Dim detect_rechts2 As Bit


ADCON1 = %10000010
'
Symbol sensorRU = PORTA.0
Symbol sensorRB = PORTA.1
Symbol sensorM = PORTA.2
Symbol sensorLB = PORTA.3
Symbol sensorLU = PORTA.5
TRISA=1
'
Symbol IR_led1 =PORTB.2
Symbol IR_led2 =PORTB.3
Symbol IR_led3 =PORTB.4
Symbol led4 = PORTB.5
Symbol led3 = PORTB.6
Symbol led2 = PORTB.7
TRISB = 0
'
Symbol motor1A = PORTC.7
Symbol motor1B = PORTC.6
Symbol motor2A = PORTC.5
Symbol motor2B = PORTC.4
TRISC=0
'
Symbol motor_en = PORTC.2
'
Clear
'
HPWM 1,190,1221 
motor1A = 0
motor1B = 0
motor2A = 0
motor2B = 0         
DelayMS 3000
  '**********************************************  
  'afstemmen van IRled's en sensoren.
  'Kijken welke led er wanneer 1 is.
  GoTo over_sub
    sensorinl:
        '*************************************
        '* L2 **** L1 * L0 * R0 * R1 **** R2 *
        '*************************************
        '  A4      A3     A2      A1      A0
        '  15      15     30      20      70
        sensor_waarde = ADIn 0
        If sensor_waarde < 70 Then
            detect_links2 = 1    
        Else
            detect_links2 = 0
        EndIf
        sensor_waarde = ADIn 1
        If sensor_waarde < 15 Then
            detect_links1 = 1 
        Else
            detect_links1 = 0       
        EndIf
        sensor_waarde = ADIn 2
        If sensor_waarde < 30 Then
            detect_midden = 1
        Else
            detect_midden = 0 
        EndIf   
        sensor_waarde = ADIn 3
        If sensor_waarde < 15 Then
            detect_rechts1 = 1    
        Else
            detect_rechts1 = 0
        EndIf
        sensor_waarde = ADIn 4
        If sensor_waarde < 15 Then
            detect_rechts2 = 1 
        Else
            detect_rechts2 = 0       
        EndIf

    Return
  '**********************************************      
  'Vooruit gaan    
    vooruit:
        motor1A = 0
        motor1B = 1
        motor2A = 1
        motor2B = 0 
        led2 = 0
        led3 = 1
        led4 = 0  
    Return
  '**********************************************     
  'een stuk naar links draaien    
    Links_draaien_weinig:
        motor1A = 0
        motor1B = 0
        motor2A = 1
        motor2B = 0
        led2 = 0
        led3 = 0
        led4 = 1
        DelayMS 5
        GoSub vooruit                  
    Return
   '**********************************************     
   'een stuk naar links draaien     
    Rechts_draaien_weinig:
        motor1A = 0
        motor1B = 1
        motor2A = 0
        motor2B = 0
        led2 = 1
        led3 = 0
        led4 = 0
        DelayMS 5
        GoSub vooruit                  
    Return
'**********************************************      
'een stuk naar links draaien   (langere delay)   
    Links_draaien_veel:
        motor1A = 0
        motor1B = 0
        motor2A = 1
        motor2B = 0
        led2 = 0
        led3 = 0
        led4 = 1
        DelayMS 100
        GoSub vooruit                  
    Return
'**********************************************    
'een stuk naar rechts draaien (langere delay)     
    Rechts_draaien_veel:
        motor1A = 0
        motor1B = 1
        motor2A = 0
        motor2B = 0
        led2 = 1
        led3 = 0
        led4 = 0
        DelayMS 100
        GoSub vooruit                  
    Return
'**********************************************   
'alle sensoren op 1 zette
over_sub:
   IR_led1 = 0
   IR_led2 = 0
   IR_led3 = 0
   GoSub vooruit
'**********************************************      
'oneindige lus  
While 1=1
    Main:
'**********************************************      
'kijken welke sensor(en) er 1 is/zijn
    GoSub sensorinl
    If detect_links1 = 1 Then
        GoSub Rechts_draaien_weinig
        GoTo Main
    EndIf       
    If detect_rechts1 = 1 Then
        GoSub Links_draaien_weinig
        GoTo Main
    EndIf     
'**********************************************   
Wend
End


Bestanden:

Code: Download

 

PCB bestanden: Download


Geef een reactie

Je e-mailadres wordt niet gepubliceerd.

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.