Difference between revisions of "Two Rabbits & Two Hats"
From RoboWiki
(→Abstract) |
(→Project Files) |
||
(9 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
'''Author(s):''' <BR> | '''Author(s):''' <BR> | ||
− | + | Grzegorz Marzencki<BR> | |
− | + | Alessandro Colombo<BR> | |
− | + | Vladimir Kotev<BR> | |
− | |||
− | |||
− | |||
'''Country:''' <BR> | '''Country:''' <BR> | ||
− | |||
Poland<BR> | Poland<BR> | ||
Italy<BR> | Italy<BR> | ||
Line 26: | Line 22: | ||
== Project Files == | == Project Files == | ||
+ | [[Image:P1010874.JPG|thumb|Grabber arm robot|200px|right|Robot]] | ||
+ | [[Media:robot.ppt|Presentation]] | ||
+ | |||
+ | <source lang="basic"> | ||
+ | ' {$STAMP BS2} | ||
+ | ' {$PBASIC 2.5} | ||
+ | ' P12: Engine | ||
+ | ' P13: Engine | ||
+ | ' P10: line sensor | ||
+ | ' P14: line sensor | ||
+ | ' P8: line sensor | ||
+ | ' P4: front green led | ||
+ | ' P3: Front IR LED | ||
+ | ' P5: Front IR Receiver | ||
+ | |||
+ | ' -----[ Title ]-------------------------------------------------------------- | ||
+ | ' Robotics with the Boe-Bot - RoamingWithIr.bs2 | ||
+ | |||
+ | DEBUG "Program Running!" | ||
+ | ' -----[ Variables ]---------------------------------------------------------- | ||
+ | irDetectLeft VAR Bit | ||
+ | irDetectFront VAR Bit | ||
+ | pulseCount VAR Byte | ||
+ | flag VAR Bit | ||
+ | ' -----[ Initialization ]----------------------------------------------------- | ||
+ | |||
+ | qti VAR Nib | ||
+ | counter VAR Word | ||
+ | |||
+ | ' -----[ Main Routine ]------------------------------------------------------- | ||
+ | |||
+ | |||
+ | flag = 0 | ||
+ | DO | ||
+ | GOSUB read_line | ||
+ | DEBUG BIN3 qti, CR | ||
+ | 'DEBUG qti.BIT0, CR | ||
+ | 'DEBUG qti.BIT1, CR | ||
+ | 'DEBUG qti.BIT2, CR | ||
+ | FREQOUT 3, 1, 39000 | ||
+ | irDetectFront = IN5 | ||
+ | |||
+ | ' GOSUB Forward_Pulse | ||
+ | 'break: | ||
+ | |||
+ | |||
+ | DEBUG CRSRXY, 2, 6, BIN1 irDetectFront | ||
+ | IF (irDetectFront = 0) THEN | ||
+ | GOSUB Back_up | ||
+ | GOSUB Turn_Right ' Back up & U-turn | ||
+ | 'FREQOUT 4, 2000, 3000 ' Signal program start/reset. | ||
+ | PAUSE 20 | ||
+ | FOR pulseCount = 0 TO 50 | ||
+ | GOSUB Forward_Pulse | ||
+ | NEXT | ||
+ | |||
+ | GOSUB Turn_Left | ||
+ | FOR pulseCount = 0 TO 100 | ||
+ | GOSUB Forward_Pulse | ||
+ | NEXT | ||
+ | GOSUB Turn_Left | ||
+ | PAUSE 20 | ||
+ | ' FOR pulseCount = 0 TO 50 | ||
+ | DO | ||
+ | GOSUB read_line | ||
+ | GOSUB Forward_Pulse | ||
+ | ' NEXT | ||
+ | IF (qti) THEN | ||
+ | GOSUB T_right | ||
+ | GOSUB T_right | ||
+ | GOTO break | ||
+ | ENDIF | ||
+ | LOOP | ||
+ | ENDIF | ||
+ | break: | ||
+ | |||
+ | ''''''''''''''' | ||
+ | |||
+ | SELECT qti | ||
+ | CASE %000 ' Forward | ||
+ | |||
+ | GOSUB Forward | ||
+ | |||
+ | CASE %010 ' Forward | ||
+ | |||
+ | GOSUB Forward | ||
+ | |||
+ | |||
+ | CASE %001 ' right | ||
+ | |||
+ | GOSUB T_right | ||
+ | |||
+ | CASE %011 ' less right | ||
+ | |||
+ | GOSUB L_right | ||
+ | |||
+ | |||
+ | CASE %100 ' left | ||
+ | |||
+ | GOSUB T_left | ||
+ | |||
+ | CASE %110 ' less left | ||
+ | |||
+ | GOSUB L_left | ||
+ | |||
+ | |||
+ | CASE %111 ' grapping | ||
+ | ' grap | ||
+ | PAUSE 1000 | ||
+ | GOSUB Forward | ||
+ | IF (flag = 0) THEN | ||
+ | DO | ||
+ | GOSUB read_line | ||
+ | IF (qti =%111) THEN | ||
+ | 'PAUSE 1000 | ||
+ | GOSUB Forward | ||
+ | ENDIF | ||
+ | IF (qti = %001) OR (qti = %011) THEN | ||
+ | GOSUB L_left | ||
+ | PAUSE 1000 | ||
+ | ENDIF | ||
+ | IF (qti = %110) OR (qti = %100) THEN | ||
+ | GOSUB L_right | ||
+ | PAUSE 1000 | ||
+ | ENDIF | ||
+ | IF (qti = %000) THEN | ||
+ | FOR pulseCount = 0 TO 12 | ||
+ | GOSUB Forward | ||
+ | NEXT | ||
+ | GOSUB grab | ||
+ | FOR pulseCount = 0 TO 6 | ||
+ | GOSUB Back_up | ||
+ | NEXT | ||
+ | FOR pulseCount = 0 TO 6 | ||
+ | GOSUB Back_up | ||
+ | NEXT | ||
+ | FOR pulseCount = 0 TO 6 | ||
+ | GOSUB Back_up | ||
+ | NEXT | ||
+ | FOR pulseCount = 0 TO 6 | ||
+ | GOSUB Back_up | ||
+ | NEXT | ||
+ | GOSUB Turn_Back | ||
+ | flag = 1 | ||
+ | GOTO grip_end | ||
+ | ENDIF | ||
+ | LOOP | ||
+ | ENDIF | ||
+ | IF (flag = 1) THEN | ||
+ | DO | ||
+ | GOSUB read_line | ||
+ | IF (qti =%111) THEN | ||
+ | 'PAUSE 1000 | ||
+ | 'GOSUB Forward | ||
+ | ENDIF | ||
+ | IF (qti = %001) OR (qti = %011) THEN | ||
+ | GOSUB L_left | ||
+ | PAUSE 1000 | ||
+ | ENDIF | ||
+ | IF (qti = %110) OR (qti = %100) THEN | ||
+ | GOSUB L_right | ||
+ | PAUSE 1000 | ||
+ | ENDIF | ||
+ | IF (qti = %000) THEN | ||
+ | FOR pulseCount = 0 TO 12 | ||
+ | GOSUB Forward | ||
+ | NEXT | ||
+ | GOSUB relese | ||
+ | DO | ||
+ | GOSUB stop_pulse | ||
+ | LOOP | ||
+ | |||
+ | ENDIF | ||
+ | LOOP | ||
+ | ENDIF | ||
+ | grip_end: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ENDSELECT | ||
+ | LOOP | ||
+ | END | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ' -----[ Subroutines ]-------------------------------------------------------- | ||
+ | |||
+ | |||
+ | stop_pulse: | ||
+ | PULSOUT 13,759 | ||
+ | PULSOUT 12,750 | ||
+ | grab: | ||
+ | FOR counter = 1 TO 100 | ||
+ | PULSOUT 15, 1000 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | |||
+ | relese: | ||
+ | FOR counter = 1 TO 100 | ||
+ | PULSOUT 15, 700 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | |||
+ | read_line: | ||
+ | qti.BIT0 = IN8 | ||
+ | qti.BIT1 = IN14 | ||
+ | qti.BIT2 = IN10 | ||
+ | RETURN | ||
+ | |||
+ | Forward_Pulse: ' Send a single forward pulse. | ||
+ | PULSOUT 13,850 | ||
+ | PULSOUT 12,650 | ||
+ | PAUSE 20 | ||
+ | RETURN | ||
+ | Turn_Left: ' Left turn, about 90-degrees. | ||
+ | FOR pulseCount = 0 TO 23 | ||
+ | PULSOUT 13, 650 | ||
+ | PULSOUT 12, 650 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | Turn_Right: | ||
+ | FOR pulseCount = 0 TO 25 ' Right turn, about 90-degrees. | ||
+ | PULSOUT 13, 850 | ||
+ | PULSOUT 12, 850 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | Back_up: | ||
+ | FOR pulseCount = 0 TO 8 | ||
+ | PULSOUT 13, 650 | ||
+ | PULSOUT 12, 850 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | |||
+ | Turn_Back: | ||
+ | FOR pulseCount = 0 TO 50 ' Right turn, about 180-degrees. | ||
+ | GOSUB read_line | ||
+ | PULSOUT 13, 850 | ||
+ | PULSOUT 12, 850 | ||
+ | PAUSE 20 | ||
+ | IF (qti AND (pulseCount>40)) THEN | ||
+ | GOTO ex | ||
+ | ENDIF | ||
+ | NEXT | ||
+ | ex: | ||
+ | RETURN | ||
+ | |||
+ | Forward: | ||
+ | FOR counter = 1 TO 2 | ||
+ | PULSOUT 13, 875 | ||
+ | PULSOUT 12, 725 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | |||
+ | T_left: | ||
+ | FOR counter = 1 TO 8 | ||
+ | PULSOUT 13, 675 | ||
+ | PULSOUT 12, 675 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | |||
+ | L_left: | ||
+ | FOR counter = 1 TO 3 | ||
+ | PULSOUT 13, 725 | ||
+ | PULSOUT 12, 650 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | |||
+ | |||
+ | T_right: | ||
+ | FOR counter = 1 TO 8 | ||
+ | PULSOUT 13, 875 | ||
+ | PULSOUT 12, 875 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
− | |||
− | + | L_right: | |
+ | FOR counter = 1 TO 3 | ||
+ | PULSOUT 13, 875 | ||
+ | PULSOUT 12, 800 | ||
+ | PAUSE 20 | ||
+ | NEXT | ||
+ | RETURN | ||
+ | </source> | ||
Go back to the [http://virtuallab.kar.elf.stuba.sk/robowiki/index.php?title=Summer_School_2009 List of the projects] | Go back to the [http://virtuallab.kar.elf.stuba.sk/robowiki/index.php?title=Summer_School_2009 List of the projects] |
Latest revision as of 21:14, 27 August 2009
Overview
Author(s):
Grzegorz Marzencki
Alessandro Colombo
Vladimir Kotev
Country:
Poland
Italy
Bulgaria
Date: 13.08.2009
Activity: Centrobot Robotic Summer School 2009
Location: Vienna, Austria
Hardware: Boe Bot
Abstract
Linefollower with 3 sensores, avoiding obsticle, having mechanical claws (gripper) and using them to move objects.
Project Files
' {$STAMP BS2}
' {$PBASIC 2.5}
' P12: Engine
' P13: Engine
' P10: line sensor
' P14: line sensor
' P8: line sensor
' P4: front green led
' P3: Front IR LED
' P5: Front IR Receiver
' -----[ Title ]--------------------------------------------------------------
' Robotics with the Boe-Bot - RoamingWithIr.bs2
DEBUG "Program Running!"
' -----[ Variables ]----------------------------------------------------------
irDetectLeft VAR Bit
irDetectFront VAR Bit
pulseCount VAR Byte
flag VAR Bit
' -----[ Initialization ]-----------------------------------------------------
qti VAR Nib
counter VAR Word
' -----[ Main Routine ]-------------------------------------------------------
flag = 0
DO
GOSUB read_line
DEBUG BIN3 qti, CR
'DEBUG qti.BIT0, CR
'DEBUG qti.BIT1, CR
'DEBUG qti.BIT2, CR
FREQOUT 3, 1, 39000
irDetectFront = IN5
' GOSUB Forward_Pulse
'break:
DEBUG CRSRXY, 2, 6, BIN1 irDetectFront
IF (irDetectFront = 0) THEN
GOSUB Back_up
GOSUB Turn_Right ' Back up & U-turn
'FREQOUT 4, 2000, 3000 ' Signal program start/reset.
PAUSE 20
FOR pulseCount = 0 TO 50
GOSUB Forward_Pulse
NEXT
GOSUB Turn_Left
FOR pulseCount = 0 TO 100
GOSUB Forward_Pulse
NEXT
GOSUB Turn_Left
PAUSE 20
' FOR pulseCount = 0 TO 50
DO
GOSUB read_line
GOSUB Forward_Pulse
' NEXT
IF (qti) THEN
GOSUB T_right
GOSUB T_right
GOTO break
ENDIF
LOOP
ENDIF
break:
'''''''''''''''
SELECT qti
CASE %000 ' Forward
GOSUB Forward
CASE %010 ' Forward
GOSUB Forward
CASE %001 ' right
GOSUB T_right
CASE %011 ' less right
GOSUB L_right
CASE %100 ' left
GOSUB T_left
CASE %110 ' less left
GOSUB L_left
CASE %111 ' grapping
' grap
PAUSE 1000
GOSUB Forward
IF (flag = 0) THEN
DO
GOSUB read_line
IF (qti =%111) THEN
'PAUSE 1000
GOSUB Forward
ENDIF
IF (qti = %001) OR (qti = %011) THEN
GOSUB L_left
PAUSE 1000
ENDIF
IF (qti = %110) OR (qti = %100) THEN
GOSUB L_right
PAUSE 1000
ENDIF
IF (qti = %000) THEN
FOR pulseCount = 0 TO 12
GOSUB Forward
NEXT
GOSUB grab
FOR pulseCount = 0 TO 6
GOSUB Back_up
NEXT
FOR pulseCount = 0 TO 6
GOSUB Back_up
NEXT
FOR pulseCount = 0 TO 6
GOSUB Back_up
NEXT
FOR pulseCount = 0 TO 6
GOSUB Back_up
NEXT
GOSUB Turn_Back
flag = 1
GOTO grip_end
ENDIF
LOOP
ENDIF
IF (flag = 1) THEN
DO
GOSUB read_line
IF (qti =%111) THEN
'PAUSE 1000
'GOSUB Forward
ENDIF
IF (qti = %001) OR (qti = %011) THEN
GOSUB L_left
PAUSE 1000
ENDIF
IF (qti = %110) OR (qti = %100) THEN
GOSUB L_right
PAUSE 1000
ENDIF
IF (qti = %000) THEN
FOR pulseCount = 0 TO 12
GOSUB Forward
NEXT
GOSUB relese
DO
GOSUB stop_pulse
LOOP
ENDIF
LOOP
ENDIF
grip_end:
ENDSELECT
LOOP
END
' -----[ Subroutines ]--------------------------------------------------------
stop_pulse:
PULSOUT 13,759
PULSOUT 12,750
grab:
FOR counter = 1 TO 100
PULSOUT 15, 1000
PAUSE 20
NEXT
RETURN
relese:
FOR counter = 1 TO 100
PULSOUT 15, 700
PAUSE 20
NEXT
RETURN
read_line:
qti.BIT0 = IN8
qti.BIT1 = IN14
qti.BIT2 = IN10
RETURN
Forward_Pulse: ' Send a single forward pulse.
PULSOUT 13,850
PULSOUT 12,650
PAUSE 20
RETURN
Turn_Left: ' Left turn, about 90-degrees.
FOR pulseCount = 0 TO 23
PULSOUT 13, 650
PULSOUT 12, 650
PAUSE 20
NEXT
RETURN
Turn_Right:
FOR pulseCount = 0 TO 25 ' Right turn, about 90-degrees.
PULSOUT 13, 850
PULSOUT 12, 850
PAUSE 20
NEXT
RETURN
Back_up:
FOR pulseCount = 0 TO 8
PULSOUT 13, 650
PULSOUT 12, 850
PAUSE 20
NEXT
RETURN
Turn_Back:
FOR pulseCount = 0 TO 50 ' Right turn, about 180-degrees.
GOSUB read_line
PULSOUT 13, 850
PULSOUT 12, 850
PAUSE 20
IF (qti AND (pulseCount>40)) THEN
GOTO ex
ENDIF
NEXT
ex:
RETURN
Forward:
FOR counter = 1 TO 2
PULSOUT 13, 875
PULSOUT 12, 725
PAUSE 20
NEXT
RETURN
T_left:
FOR counter = 1 TO 8
PULSOUT 13, 675
PULSOUT 12, 675
PAUSE 20
NEXT
RETURN
L_left:
FOR counter = 1 TO 3
PULSOUT 13, 725
PULSOUT 12, 650
PAUSE 20
NEXT
RETURN
T_right:
FOR counter = 1 TO 8
PULSOUT 13, 875
PULSOUT 12, 875
PAUSE 20
NEXT
RETURN
L_right:
FOR counter = 1 TO 3
PULSOUT 13, 875
PULSOUT 12, 800
PAUSE 20
NEXT
RETURN
Go back to the List of the projects