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