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