Shop OBEX P1 Docs P2 Docs Learn Events
Thanks Publison, here's an updated demo I promised you (Erco's laser sensor). — Parallax Forums

Thanks Publison, here's an updated demo I promised you (Erco's laser sensor).

Martin_HMartin_H Posts: 4,051
edited 2014-09-09 12:24 in General Discussion
Thanks for the better reflector tape. I'm getting a ten foot range with it pretty easily. In this demo I use the Boe-bot and laser to fetch a target from across the kitchen and bring it back.

If I didn't have grout lines in the floor I could have use line sensors to recognize a home area as well. But I was able to tighten up the code enough that I no longer needed the ServoPal to tend the servos as well. The code is below and represents about five hours work start to finish.
' ==================================================  ============================
'
'   File...... FetchTargetAndFindBeacon.BS2
'   Purpose... Find a target using the Ping))) and laser, then returns to
'              the beacon
'   Authors... Martin Heermance.
'   E-mail.... mheermance@gmail.com
'   Started... 2014 September 6th
'   Updated... 2014 September 7th
'
'   {$STAMP BS2}
'   {$PBASIC 2.5}
'
' ==================================================  ============================

' ------------------------------------------------------------------------------
' Program Description
' ------------------------------------------------------------------------------
' A program to locate a target using a laser, then return to the Pololu beacon

' ------------------------------------------------------------------------------
' Revision History
' ------------------------------------------------------------------------------
' 2014-09-XX Initial creation and ongoing development.

' ------------------------------------------------------------------------------
' I/O Definitions
' ------------------------------------------------------------------------------

Laser           PIN      0                    ' Laser input
BLeft           PIN      6                    ' Beacon to left indicator
BBack           PIN      7                    ' Beacon in back indicator
BRght           PIN      8                    ' Beacon to right indicator
BFront          PIN      9                    ' Beacon in front indicator
Buzzer          PIN     10                    ' pin for output sound
RMotor          PIN     12                    ' Pin for right servo
LMotor          PIN     13                    ' Pin for left servo
Gripper         PIN     14                    ' Pin for gripper servo
Ping            PIN     15                    ' Pin for PING))) Sensor

' ------------------------------------------------------------------------------
' Constants
' ------------------------------------------------------------------------------

'--------[Calibration Constants, must be adjusted for your specific robot]------
GripperOpened   CON     500                   ' PULSOUT pulse width to open gripper servo
GripperClosed   CON     960                   ' PULSOUT pulse width to close gripper servo

' These values need tweaking for each robot's servos.
SpeedF75L       CON     840  ' Fast forward left
SpeedF50L       CON     808  ' Med  forward left
SpeedF25L       CON     775  ' Slow forward left
Speed000L       CON     750  ' stop left
SpeedR25L       CON     710  ' slow reverse left
SpeedR50L       CON     690  ' med reverse left
SpeedR75L       CON     650  ' fast reverse left

SpeedF75R       CON     650  ' Fast forward right
SpeedF50R       CON     690  ' med forward right
SpeedF25R       CON     720  ' slow forward right
Speed000R       CON     750  ' Stop right
SpeedR25R       CON     775  ' slow reverse right
SpeedR50R       CON     810  ' med reverse right
SpeedR75R       CON     850  ' Fast reverse right

'---------[Other Global Constants]----------------------------------------------

NULL            CON     750                   ' Pulse width for 1.5ms stop pulse.
Trigger         CON     5                     ' trigger pulse = 10 uS
Scale           CON     $200                  ' raw x 2.00 = uS

RawToIn         CON     889                   ' 1 / 73.746 (with **)

IsHigh          CON     1                     ' for PULSOUT
IsLow           CON     0

Success         CON     0                     ' Constant for zero success
ErrorBeaconLost CON     -1                    ' Constant for lost on move
ErrorTooClose   CON     -2                    ' Constant for farther than max

RIGHT           CON     0                     ' Subscripts into arrays.
LEFT            CON     1
FRONT           CON     2
BACK            CON     3

COM_SPEED       CON     84                    ' 9600 baudnon-inverted.

' ------------------------------------------------------------------------------
' Variables - for simplicty I use exactly the same variables in all modules.
' ------------------------------------------------------------------------------

' General purpose volatile variables which are modified by subroutines or tasks
ACC             VAR     Word

' Loop index variables and for argument passing.
X               VAR     Word
Y               VAR     Word
Z               VAR     Word

' DirReads is a nibble array
DirReads        VAR     Nib(4)

' State variables which are modified to reflect changes of robot state.
RSpeed         VAR      Word   ' Holds current r motor pulse
LSpeed         VAR      Word   ' Holds current l motor pulse
GripState      VAR      Word   ' Holds current gripper pulse

' ------------------------------------------------------------------------------
' Initialization
' ------------------------------------------------------------------------------

' ------------------------------------------------------------------------------
' Program Code
' ------------------------------------------------------------------------------

  ' Pause at start of program to let user set down robot.
  FREQOUT Buzzer, 1000, 2500

  GripState = GripperOpened
  GOSUB Halt              ' stop robot

  GOSUB FindTarget
  GOSUB Fetch

  GripState = GripperClosed
  GOSUB Halt

  GOSUB FindBeacon
  END

' ------------------------------------------------------------------------------
' Subroutines
' ------------------------------------------------------------------------------

' slowly rotate until the laser target finds target
FindTarget:

    RSpeed = SpeedF25R
    LSpeed = SpeedR25L
  DO
    ' Each iteration refresh the servos
    GOSUB PulseServos
    IF (Laser = IsLow)  THEN
      GOSUB Halt
      FREQOUT Buzzer, 1000, 2500
      RETURN
    ENDIF
  LOOP

' moves towards the target and stops when it is in range
Fetch:
  Y = 0
  DO
    Y = Y + 1
    ' Every so often check that we still see the target
    ' If not then turn TO face it
    IF (Y > 35 AND Laser = IsHigh)  THEN
      GOSUB FindTarget
      Y = 0
    ENDIF

    ' slowly move forward to the desired distance to the target
    RSpeed = SpeedF50R
    LSpeed = SpeedF50L
    GOSUB PulseServos

    ' Exit if we're close to the target
    GOSUB PingDistance
    IF (X < 3)  THEN
      GOSUB Halt
      RETURN
    ENDIF
  LOOP

' PingDistance - reads the distance to the target.
' Inputs:
' Outputs:
'   X - distance in inches.
PingDistance:
  Ping = IsLow                                ' make trigger 0-1-0
  PULSOUT Ping, Trigger                       ' activate sensor
  PULSIN  Ping, IsHigh, X                     ' measure echo pulse
  X = X */ Scale                              ' convert to uS
  X = X / 2                                   ' remove return trip
  X = X ** RawToIn                            ' convert to inches
  RETURN

' Turn the robot on its axis by the amount in signed byte Arg at speed Veloc.
' Inputs:
'   Arg - number of brads to turn. > 0 turns left; Arg < 0 turns right.
'   Veloc - peak speed where 0 is stop and 15 is fast.
' Outputs:
'   X - 0 success, -1 beacon lost, -2 closer than min
Turn:
  RETURN

' Stop moving
Halt:
  RSpeed = Speed000R
  LSpeed = Speed000L

' Called to refresh the servos.
PulseServos:
  PULSOUT RMotor, RSpeed
  PULSOUT LMotor, LSpeed
  PULSOUT Gripper, GripState
  PAUSE 20
  RETURN

' ReadBeacon - scans the beacon pins, removes spurious noise and returns value.
' Inputs:
'   none
' Outputs:
'   ACC - most common direction
'   Z - number of occurances
ReadBeacon:
  FOR Y = RIGHT TO BACK
    DirReads(Y) = 0
  NEXT

  FOR Y = 0 TO 6
    IF BFront = IsLow THEN
      DirReads(Front) = DirReads(Front) + 1
    ENDIF
    IF BRght = IsLow THEN
      DirReads(Right) = DirReads(Right) + 1
    ENDIF
    IF BLeft = IsLow THEN
      DirReads(Left) = DirReads(Left) + 1
    ENDIF
    IF BBack = IsLow THEN
      DirReads(BACK) = DirReads(BACK) +  1
    ENDIF
  NEXT

  ' Have a bias towards LEFT to initiate beacon search
  ACC = LEFT
  Z = DirReads(LEFT)
  FOR Y = RIGHT TO BACK
    ' If this direction is more common than current max, make it max
    IF DirReads(Y) > Z THEN
      ACC = Y
      Z = DirReads(Y)
    ENDIF
  NEXT
  RETURN

' Find the beacon, althouh at the present no exit condition is specified
FindBeacon:
  ' slowly rotate until the beacon locater spots its target
  RSpeed = SpeedF25R
  LSpeed = SpeedR25L
  DO
    ' Each iteration refresh the servos
    GOSUB PulseServos
    GOSUB ReadBeacon
    IF (ACC = Back)  THEN
      ' quickly do a 180
      RSpeed = SpeedR75R
      LSpeed = SpeedF75L
      Y = 40
    ELSEIF (ACC = Right)  THEN
      ' rotate until the beacon is front
      RSpeed = SpeedR50R
      LSpeed = SpeedF50L
      Y = 20
    ELSEIF (ACC = Left)  THEN
      ' rotate until the beacon is in front
      RSpeed = SpeedF50R
      LSpeed = SpeedR50L
      Y = 20
    ELSEIF (ACC = Front)  THEN
      ' Move towards beacon
      RSpeed = SpeedF75R
      LSpeed = SpeedF75L
      Y = 1
    ENDIF
    DO UNTIL Y = 0
      GOSUB PulseServos
      Y = Y - 1
    LOOP
  LOOP

Comments

  • SapphireSapphire Posts: 496
    edited 2014-09-07 15:22
    That's pretty cool, Martin. I really like how well it got to the target, then headed back to the beacon.

    Nice work!
  • xanaduxanadu Posts: 3,347
    edited 2014-09-07 15:29
    Awesome, what are the IR beacons, I see they're high or low signal for detect, is that something you custom built too?

    Outstanding work being able to clock everything so smoothly with the code!
  • Martin_HMartin_H Posts: 4,051
    edited 2014-09-07 16:49
    Thanks guys.
    xanadu wrote: »
    Awesome, what are the IR beacons, I see they're high or low signal for detect, is that something you custom built too?

    They based around a pair of Pololu IR beacons that parallax sells, here's a link: http://www.parallax.com/product/28049 . But I built the app mod board that lets me plug one into the Boe-bot, and a stand for the other one. This keeps them roughly at the same height and above the other sensors. I think anyone who's gone through the "Robotics with the Boe-Bot" book can understand how they work and put them to good use. But because they're surface mount with their own microcontroller they offload a lot of complexity from the BS2 in not much space.
  • ercoerco Posts: 20,256
    edited 2014-09-08 09:50
    Super cool, Martin H!!
  • PublisonPublison Posts: 12,366
    edited 2014-09-08 10:46
    Thanks for the video Martin. Sorry I did not respond sooner I've be fight a Male-ware issue that I just got resolved.

    That's very cool!

    I bet you could get close to 15' if the reflective was not wrapped, but a 3" flat strip on the front of the target. That's how I got my best results.

    Jim
  • Martin_HMartin_H Posts: 4,051
    edited 2014-09-08 18:57
    Thanks guys. I'm glad the video entertained as I had fun with that project. I'm loving that Parallax gripper too.
    Publison wrote: »
    I bet you could get close to 15' if the reflective was not wrapped, but a 3" flat strip on the front of the target. That's how I got my best results.

    I'm going to make more targets for three point navigation. So I'll try the flat strip as that's easier to fabricate than a round target anyway. I've done integer trig with the BS2 before, so how hard can triangulation be?
  • WhitWhit Posts: 4,191
    edited 2014-09-09 12:24
    Great work Martin! I never would have guessed the reflective tape would matter so much! Works really well and I love the IR beacon.
Sign In or Register to comment.