Two Rabbits & Two Hats

From RoboWiki
Revision as of 21:14, 27 August 2009 by Robot (talk | contribs) (Project Files)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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

Robot

Presentation

' {$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