You are on page 1of 10

'****************************************************************

'* Name : LineFollower.BAS *

'* Author : Mohammd Yousefi *

'* Notice : Copyright (c) 2008 *

'* : All Rights Reserved *

'* Date : 9/17/2008 *

'* Version : 1.0 *

'* Notes : Program for controling a line follower robot *

'* : using PIC16F84A and four IR sensors *

'****************************************************************

Symbol Mbtn = Porta.0 'Mode Button

Symbol Lbtn = Porta.1 'Left Motor Button

Symbol Rbtn = Porta.2 'Right Motor Button

Symbol Mled = Porta.3 'Mode Indicator LED OFF


= Default ON = Custom based on Motors Blink = Custom based on Sensors

Symbol Lmotorb = Portb.0 'Left Motor Forward

Symbol Lmotorf = Portb.1 'Left Motor Backward

Symbol Rmotorf = Portb.2 'Right Motor Forward

Symbol Rmotorb = Portb.3 'Right Motor Backward

Symbol Fsensor = Portb.4 'Right Sensor

Symbol Rsensor = Portb.5 'Middle Sensor

Symbol Msensor = Portb.6 'Left Sensor

Symbol Lsensor = Portb.7 'Front Sensor


Lmf Var Bit 'Left Motor Forward

Lmb Var Bit 'Left Motor Backward

Rmf Var Bit 'Right Motor Forward

Rmb Var Bit 'Right Motor Backward

Online Var Bit 'Is robot on line?

Mustturn Var Bit 'Is the path lost?

Mustturnleft Var Bit 'Indicates direction on


turning

Fastrotate Var Bit 'Indicates fast rotating

Lls Var Bit 'Last state of Left


Sensor

Lrs Var Bit 'Last state of Right


Sensor

Lms Var Bit 'Last state of Middle


Sensor

Lcb Var Bit 'Last state of Custom


Button

Llb Var Bit 'Last state of Left Motor


Button

Lrb Var Bit 'Last state of Right


Motor Button

I Var Byte

S Var Byte

Modevar0 Var Bit 'Mode state variable 0


Modevar1 Var Bit 'Mode state variable 1

Cms Var Byte[16] 'Custom mode values

Schngd Var Bit 'Custom mode values


changed

Cyclecounter Var Byte 'Count cycles (used for


LED blinking)

Porta = 0

Portb = 0

Lmf = 1

Lmb = 0

Rmf = 1

Rmb = 0

Online = 1

Mustturn = 0

Mustturnleft = 0

Fastrotate = 0

Lls = 0

Lrs = 0

Lms = 0

Lcb = 0

Llb = 0

Lrb = 0

Modevar0 = 0
Modevar1 = 0

Cyclecounter = 0

Trisa = %00111

Trisb = %11110000

Main:

' Default Process

If(((lsensor <> Msensor) And(rsensor <> Msensor)) Or((lsensor <> Fsensor)


And(rsensor <> Fsensor))) Then

'On line, move forward fast

Lmf = 1

Lmb = 0

Rmf = 1

Rmb = 0

Online = 1

Mustturn = 0

Else

'Save sensors state at the begining

If(online = 1) Then

Lls = Lsensor
Lrs = Rsensor

Lms = Msensor

Online = 0

End If

If(mustturn = 1) Then

If(mustturnleft = 1) Then

Lmf = 0

Lmb = Fastrotate

Rmf = 1

Rmb = 0

Else

Lmf = 1

Lmb = 0

Rmf = 0

Rmb = Fastrotate

End If

Else

If((lsensor <> Lls) Or(rsensor <> Lrs)) Then

'It's not a damage in path, I really lost the path

Mustturn = 1

If(rsensor <> Lrs) Then Mustturnleft = 0

If(lsensor <> Lls) Then Mustturnleft = 1

'FastRotate = 0

'if (MSensor = lms) then FastRotate = 1

End If

End If
End If

' Mode Button

If((mbtn = 0) And(lcb = 1)) Then

If((modevar0 = 1) And(modevar1 = 1)) Then

Modevar0 = 0

Modevar1 = 0

Low Mled

Else

If((modevar0 = 1) And(modevar1 = 0)) Then

Modevar1 = 1

For I = 16 To 31

Read I , S

Cms[i - 16] = 255 - S

Next I

Else

If((modevar0 = 0) And(modevar1 = 0)) Then

Modevar0 = 1

High Mled

For I = 0 To 15

Read I , S

Cms[i] = 255 - S

Next I
End If

End If

End If

Lcb = 0

End If

If(mbtn = 1) Then Lcb = 1

If((modevar0 = 1) And(modevar1 = 1)) Then

If(cyclecounter < 85) Then

High Mled

Else

Low Mled

End If

End If

' Custom Process

If(modevar0 = 1) Then

' Variable Index

I = 0

If(modevar1 = 0) Then

If(lmf = 1) Then I = I + 8

If(lmb = 1) Then I = I + 4

If(rmf = 1) Then I = I + 2

If(rmb = 1) Then I = I + 1
Else

If(rsensor = 1) Then I = I + 8

If(msensor = 1) Then I = I + 4

If(lsensor = 1) Then I = I + 2

If(fsensor = 1) Then I = I + 1

End If

S = Cms[i]

Schngd = 0

' Left Motor Button

If((lbtn = 0) And(llb = 1)) Then

S = S + 1

If(s.2 = 1) Then S = S & %11110000

Cms[i] = S

Schngd = 1

Llb = 0

End If

If(lbtn = 1) Then Llb = 1

' Right Motor Button

If((rbtn = 0) And(lrb = 1)) Then

S = S + 16

If(s.6 = 1) Then S = S & %00001111

Cms[i] = S

Schngd = 1
Lrb = 0

End If

If(rbtn = 1) Then Lrb = 1

If(schngd = 1) Then

If(modevar1 = 0) Then Write I , 255 - S

If(modevar1 = 1) Then Write I + 16 , 255 - S

End If

End If

' Operate

If(modevar0 = 1) Then

If((s.0 <> 0) Or(s.1 <> 0)) Then

Lmotorb = S.1

Lmotorf = S.0

Else

Lmotorb = Lmb

Lmotorf = Lmf

End If

If((s.4 <> 0) Or(s.5 <> 0)) Then

Rmotorb = S.5

Rmotorf = S.4

Else
Rmotorb = Rmb

Rmotorf = Rmf

End If

Else

Lmotorb = Lmb

Lmotorf = Lmf

Rmotorb = Rmb

Rmotorf = Rmf

End If

Cyclecounter = Cyclecounter + 1

Goto Main

End

You might also like