Difference between revisions of "BoeBot"
From RoboWiki
| Line 1: | Line 1: | ||
| − | Example 1: | + | |
| + | == Example 1: == | ||
| + | |||
<source lang="vb"> | <source lang="vb"> | ||
| Line 19: | Line 21: | ||
| − | <source lang=" | + | == Example 2: == |
| + | |||
| + | |||
| + | <source lang="vb"> | ||
| + | ' Robotics with the Boe-Bot - TestServoSpeed.bs2 | ||
| + | ' Enter pulse width, then count revolutions of the wheel. | ||
| + | ' The wheel will run for 6 seconds | ||
| + | ' Multiply by 10 to get revolutions per minute (RPM). | ||
| + | |||
| + | '{$STAMP BS2} | ||
| + | '{$PBASIC 2.5} | ||
| + | |||
| + | counter VAR Word | ||
| + | pulseWidth VAR Word | ||
| + | |||
| + | FREQOUT 4, 2000, 3000 ' Signal program start/reset. | ||
| + | |||
| + | DO | ||
| + | |||
| + | DEBUG "Enter pulse width: " | ||
| + | DEBUGIN DEC pulseWidth | ||
| + | |||
| + | FOR counter = 1 TO 244 | ||
| + | PULSOUT 12, pulseWidth | ||
| + | PULSOUT 13, pulseWidth | ||
| + | PAUSE 20 | ||
| + | NEXT | ||
| + | |||
| + | LOOP | ||
| + | </source> | ||
| + | |||
| + | |||
| + | == Example 3: == | ||
| + | |||
| + | |||
| + | <source lang="vb"> | ||
| + | ' Robotics with the Boe-Bot - EepromNavigation.bs2 | ||
| + | ' Navigate using characters stored in EEPROM. | ||
| + | |||
| + | ' {$STAMP BS2} ' Stamp directive. | ||
| + | ' {$PBASIC 2.5} ' PBASIC directive. | ||
| + | |||
| + | DEBUG "Program Running!" | ||
| + | |||
| + | ' -----[ Variables ]---------------------------------------------------------- | ||
| + | |||
| + | pulseCount VAR Word ' Stores number of pulses. | ||
| + | address VAR Byte ' Stores EEPROM address. | ||
| + | instruction VAR Byte ' Stores EEPROM instruction. | ||
| + | |||
| + | ' -----[ EEPROM Data ]-------------------------------------------------------- | ||
| + | |||
| + | ' Address: 0123456789 ' These two commented lines show | ||
| + | ' |||||||||| ' EEPROM address of each datum. | ||
| + | DATA "FLFFRBLBBQ" ' Navigation instructions. | ||
| + | |||
| + | ' -----[ Initialization ]----------------------------------------------------- | ||
| + | |||
| + | FREQOUT 4, 2000, 3000 ' Signal program start/reset. | ||
| + | |||
| + | ' -----[ Main Routine ]------------------------------------------------------- | ||
| + | |||
| + | DO UNTIL (instruction = "Q") | ||
| + | |||
| + | READ address, instruction ' Data at address in instruction. | ||
| + | address = address + 1 ' Add 1 to address for next read. | ||
| + | |||
| + | SELECT instruction ' Call a different subroutine | ||
| + | CASE "F": GOSUB Forward ' for each possible character | ||
| + | CASE "B": GOSUB Backward ' that can be fetched from | ||
| + | CASE "L": GOSUB Left_Turn ' EEPROM. | ||
| + | CASE "R": GOSUB Right_Turn | ||
| + | ENDSELECT | ||
| + | |||
| + | LOOP | ||
| + | |||
| + | END ' Stop executing until reset. | ||
| + | |||
| + | |||
| + | ' -----[ Subroutine - Forward ]----------------------------------------------- | ||
| + | |||
| + | Forward: ' Forward subroutine. | ||
| + | FOR pulseCount = 1 TO 64 ' Send 64 forward pulses. | ||
| + | PULSOUT 13, 850 ' 1.7 ms pulse to left servo. | ||
| + | PULSOUT 12, 650 ' 1.3 ms pulse to right servo. | ||
| + | PAUSE 20 ' Pause for 20 ms. | ||
| + | NEXT | ||
| + | RETURN ' Return to Main Routine loop. | ||
| + | |||
| + | |||
| + | ' -----[ Subroutine - Backward ]---------------------------------------------- | ||
| + | |||
| + | Backward: ' Backward subroutine. | ||
| + | FOR pulseCount = 1 TO 64 ' Send 64 backward pulses. | ||
| + | PULSOUT 13, 650 ' 1.3 ms pulse to left servo. | ||
| + | PULSOUT 12, 850 ' 1.7 ms pulse to right servo. | ||
| + | PAUSE 20 ' Pause for 20 ms. | ||
| + | NEXT | ||
| + | RETURN ' Return to Main Routine loop. | ||
| + | |||
| + | |||
| + | ' -----[ Subroutine - Left_Turn ]--------------------------------------------- | ||
| + | |||
| + | Left_Turn: ' Left turn subroutine. | ||
| + | FOR pulseCount = 1 TO 24 ' Send 24 left rotate pulses. | ||
| + | PULSOUT 13, 650 ' 1.3 ms pulse to left servo. | ||
| + | PULSOUT 12, 650 ' 1.3 ms pulse to right servo. | ||
| + | PAUSE 20 ' Pause for 20 ms. | ||
| + | NEXT | ||
| + | RETURN ' Return to Main Routine loop. | ||
| + | |||
| + | |||
| + | ' -----[ Subroutine – Right_Turn ]-------------------------------------------- | ||
| + | |||
| + | Right_Turn: ' right turn subroutine. | ||
| + | FOR pulseCount = 1 TO 24 ' Send 24 right rotate pulses. | ||
| + | PULSOUT 13, 850 ' 1.7 ms pulse to left servo. | ||
| + | PULSOUT 12, 850 ' 1.7 ms pulse to right servo. | ||
| + | PAUSE 20 ' Pause for 20 ms. | ||
| + | NEXT | ||
| + | RETURN ' Return to Main Routine section. | ||
| + | |||
| + | |||
| + | </source> | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | == Example 4: == | ||
| + | |||
| + | |||
| + | <source lang="vb"> | ||
| + | ' Robotics with the Boe-Bot - TestWhiskers.bs2 | ||
| + | ' Display what the I/O pins connected to the whiskers sense. | ||
| + | |||
| + | ' {$STAMP BS2} ' Stamp directive | ||
| + | ' {$PBASIC 2.5} ' PBASIC directive. | ||
| + | |||
| + | DEBUG "WHISKER STATES", CR, | ||
| + | " Left Right", CR, | ||
| + | "------ -------" | ||
| + | |||
| + | DO | ||
| + | DEBUG CRSRXY, 0, 3, | ||
| + | "P5 = ", BIN1 IN5, | ||
| + | " P7 = ", BIN1 IN7 | ||
| + | PAUSE 50 | ||
| + | LOOP | ||
| + | |||
| + | |||
| + | ' Later on.. Let's add following: | ||
| + | |||
| + | IF (IN7 = 0) THEN | ||
| + | HIGH 1 | ||
| + | ELSE | ||
| + | LOW 1 | ||
| + | ENDIF | ||
| + | |||
| + | |||
| + | IF (IN5 = 0) THEN | ||
| + | HIGH 10 | ||
| + | ELSE | ||
| + | LOW 10 | ||
| + | ENDIF | ||
| + | 'And finally: | ||
| + | DO | ||
| + | IF (IN5 = 0) AND (IN7 = 0) THEN ' Both whiskers detect obstacle | ||
| + | GOSUB Back_Up ' Back up & U-turn (left twice) | ||
| + | GOSUB Turn_Left | ||
| + | GOSUB Turn_Left | ||
| + | ELSEIF (IN5 = 0) THEN ' Left whisker contacts | ||
| + | GOSUB Back_Up ' Back up & turn right | ||
| + | GOSUB Turn_Right | ||
| + | ELSEIF (IN7 = 0) THEN ' Right whisker contacts | ||
| + | GOSUB Back_Up ' Back up & turn left | ||
| + | GOSUB Turn_Left | ||
| + | ELSE ' Both whiskers 1, no contacts | ||
| + | GOSUB Forward_Pulse ' Apply a forward pulse | ||
| + | ENDIF ' and check again | ||
| + | LOOP | ||
</source> | </source> | ||
Latest revision as of 13:30, 11 December 2008
Contents
Example 1:
' Robotics with the Boe-Bot - StartResetIndicator.bs2
' Test the piezospeaker circuit.
' {$STAMP BS2} ' Stamp directive.
' {$PBASIC 2.5} ' PBASIC directive.
DEBUG CLS, "Beep!!!" ' Display while speaker beeps.
FREQOUT 4, 2000, 3000 ' Signal program start/reset.
DO ' DO...LOOP
DEBUG CR, "Waiting for reset…" ' Display message
PAUSE 500 ' every 0.5 seconds
LOOP ' until hardware reset.
Example 2:
' Robotics with the Boe-Bot - TestServoSpeed.bs2
' Enter pulse width, then count revolutions of the wheel.
' The wheel will run for 6 seconds
' Multiply by 10 to get revolutions per minute (RPM).
'{$STAMP BS2}
'{$PBASIC 2.5}
counter VAR Word
pulseWidth VAR Word
FREQOUT 4, 2000, 3000 ' Signal program start/reset.
DO
DEBUG "Enter pulse width: "
DEBUGIN DEC pulseWidth
FOR counter = 1 TO 244
PULSOUT 12, pulseWidth
PULSOUT 13, pulseWidth
PAUSE 20
NEXT
LOOP
Example 3:
' Robotics with the Boe-Bot - EepromNavigation.bs2
' Navigate using characters stored in EEPROM.
' {$STAMP BS2} ' Stamp directive.
' {$PBASIC 2.5} ' PBASIC directive.
DEBUG "Program Running!"
' -----[ Variables ]----------------------------------------------------------
pulseCount VAR Word ' Stores number of pulses.
address VAR Byte ' Stores EEPROM address.
instruction VAR Byte ' Stores EEPROM instruction.
' -----[ EEPROM Data ]--------------------------------------------------------
' Address: 0123456789 ' These two commented lines show
' |||||||||| ' EEPROM address of each datum.
DATA "FLFFRBLBBQ" ' Navigation instructions.
' -----[ Initialization ]-----------------------------------------------------
FREQOUT 4, 2000, 3000 ' Signal program start/reset.
' -----[ Main Routine ]-------------------------------------------------------
DO UNTIL (instruction = "Q")
READ address, instruction ' Data at address in instruction.
address = address + 1 ' Add 1 to address for next read.
SELECT instruction ' Call a different subroutine
CASE "F": GOSUB Forward ' for each possible character
CASE "B": GOSUB Backward ' that can be fetched from
CASE "L": GOSUB Left_Turn ' EEPROM.
CASE "R": GOSUB Right_Turn
ENDSELECT
LOOP
END ' Stop executing until reset.
' -----[ Subroutine - Forward ]-----------------------------------------------
Forward: ' Forward subroutine.
FOR pulseCount = 1 TO 64 ' Send 64 forward pulses.
PULSOUT 13, 850 ' 1.7 ms pulse to left servo.
PULSOUT 12, 650 ' 1.3 ms pulse to right servo.
PAUSE 20 ' Pause for 20 ms.
NEXT
RETURN ' Return to Main Routine loop.
' -----[ Subroutine - Backward ]----------------------------------------------
Backward: ' Backward subroutine.
FOR pulseCount = 1 TO 64 ' Send 64 backward pulses.
PULSOUT 13, 650 ' 1.3 ms pulse to left servo.
PULSOUT 12, 850 ' 1.7 ms pulse to right servo.
PAUSE 20 ' Pause for 20 ms.
NEXT
RETURN ' Return to Main Routine loop.
' -----[ Subroutine - Left_Turn ]---------------------------------------------
Left_Turn: ' Left turn subroutine.
FOR pulseCount = 1 TO 24 ' Send 24 left rotate pulses.
PULSOUT 13, 650 ' 1.3 ms pulse to left servo.
PULSOUT 12, 650 ' 1.3 ms pulse to right servo.
PAUSE 20 ' Pause for 20 ms.
NEXT
RETURN ' Return to Main Routine loop.
' -----[ Subroutine – Right_Turn ]--------------------------------------------
Right_Turn: ' right turn subroutine.
FOR pulseCount = 1 TO 24 ' Send 24 right rotate pulses.
PULSOUT 13, 850 ' 1.7 ms pulse to left servo.
PULSOUT 12, 850 ' 1.7 ms pulse to right servo.
PAUSE 20 ' Pause for 20 ms.
NEXT
RETURN ' Return to Main Routine section.
Example 4:
' Robotics with the Boe-Bot - TestWhiskers.bs2
' Display what the I/O pins connected to the whiskers sense.
' {$STAMP BS2} ' Stamp directive
' {$PBASIC 2.5} ' PBASIC directive.
DEBUG "WHISKER STATES", CR,
" Left Right", CR,
"------ -------"
DO
DEBUG CRSRXY, 0, 3,
"P5 = ", BIN1 IN5,
" P7 = ", BIN1 IN7
PAUSE 50
LOOP
' Later on.. Let's add following:
IF (IN7 = 0) THEN
HIGH 1
ELSE
LOW 1
ENDIF
IF (IN5 = 0) THEN
HIGH 10
ELSE
LOW 10
ENDIF
'And finally:
DO
IF (IN5 = 0) AND (IN7 = 0) THEN ' Both whiskers detect obstacle
GOSUB Back_Up ' Back up & U-turn (left twice)
GOSUB Turn_Left
GOSUB Turn_Left
ELSEIF (IN5 = 0) THEN ' Left whisker contacts
GOSUB Back_Up ' Back up & turn right
GOSUB Turn_Right
ELSEIF (IN7 = 0) THEN ' Right whisker contacts
GOSUB Back_Up ' Back up & turn left
GOSUB Turn_Left
ELSE ' Both whiskers 1, no contacts
GOSUB Forward_Pulse ' Apply a forward pulse
ENDIF ' and check again
LOOP