Shop OBEX P1 Docs P2 Docs Learn Events
converting GP2D02 ir reading into centimeters — Parallax Forums

converting GP2D02 ir reading into centimeters

Special_KSpecial_K Posts: 162
edited 2006-08-17 04:44 in BASIC Stamp
Does anyone have a BS2 code that can convert the readout from the Sharp GP2D02 IR Sensor into centimeters values?

Comments

  • Chris SavageChris Savage Parallax Engineering Posts: 14,406
    edited 2006-08-11 02:57
    There is code for the Sharp GP2D12 at the following link.· I don't know if it will help, but it's there for reference.· Take care.

    http://www.parallax.com/dl/docs/cols/nv/vol5/col/nv114.pdf

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Chris Savage
    Parallax Tech Support
    csavage@parallax.com
  • Special_KSpecial_K Posts: 162
    edited 2006-08-11 03:17
    I do not think that this code will help. The GP2D02 will return a value of 255 to 29. ..
    255 being the dection of a very close item.
  • Special_KSpecial_K Posts: 162
    edited 2006-08-11 16:10
    I found this code at
    http://www.barello.net/Papers/GP2D02/index.htm
    I just do not know how to turn it into bs2 code
    Somebody said...
    Since the calibration calculation only involves two constants, one can figure out what those are using two measurements from the unit. For details on how I got these formulas, see Derivation Of GP2D02 linearization formulas.

    For the linearization formula

    D = Kg/(X-Ko)

    Kg is the gain, or overall shape of the curve described by Kg/X
    Ko is an offset, shifting the curve up or down.

    Let D and X be the distance and output, respectively of your first measurement.
    Let D' and X' be the distance and output, respectively, of the second measurement.

    Kg = (X'-X) D'D/(D-D')
    Ko = (D'X' - DX)/(D' - D)
    any help converting this to BS2 code would be much appreciated
    436 x 455 - 17K
  • FranklinFranklin Posts: 4,747
    edited 2006-08-11 17:05
    This is c code but if you google for the device you will find more (possibly basic). Remember the minimum distance is 10cm and you must not read below that if you want correct results.

    http://www.seattlerobotics.org/encoder/200112/gp2d02.html

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    - Stephen
  • Bruce BatesBruce Bates Posts: 3,045
    edited 2006-08-11 17:29
    Special_K -

    See if this is as helpful as I think it may be, even though it's a different Sharp I/R distance sensor, I suspect the linearization curve is the same, or nearly the same:

    http://www.acroname.com/robotics/info/articles/irlinear/irlinear.html

    I suppose if worse turns to worst, you can always build some tables, and use a lookup to determine the appropriate distance from the data obtained from the sensor. Not "pretty" by any means, but it should work reasonably well.

    Regards,

    Bruce Bates

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    <!--StartFragment -->
  • Tracy AllenTracy Allen Posts: 6,662
    edited 2006-08-11 20:04
    Also, you might find something to help you at Jonathan's site:
    madlabs.info/gp2d12/sharp_gp2d12.shtml

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Tracy Allen
    www.emesystems.com
  • Special_KSpecial_K Posts: 162
    edited 2006-08-11 20:07
    found this
    home.twmi.rr.com/brouillette/gp2d02/GP2D02_convert3.xls
    it converts the GP2D02 output into a Centimeter form, but it uses decimals and the BS2 can not handle that. can anyone see a way to convert this into BS2 code.
    also this code
    www.ottawarobotics.org/articles/gp2d02/gp2d02.html
    www.cs.montana.edu/harkin/courses/cs445/topics/10-ir/lectures/slideset1.pdf

    Post Edited (Special_K) : 8/11/2006 9:19:07 PM GMT
  • Special_KSpecial_K Posts: 162
    edited 2006-08-12 08:19
    I got a rough centimeter reading smile.gif
    got the code from this site.
    www.schoeldgen.de/robot/getdist.c


    val02 = val02 - 60 ' /* remove basic sensor offset */
    IF (val02 < 1)THEN val02 = 1 '  /* avoid divide by zero */
    ircm= 1500 / val02'  /* hyperbolic conversion TO (rough) centimeters*/
    



    Here is the code bit placed into the GP2D02 full code ( from acroname) with a dual reading from a Ping))). Let me know if you have or can tighten up the readings from the GP2D02..
    Thanks to all.

    ' {$STAMP BS2}
    ' {$PBASIC 2.5}
    '--------------------------------------------------------
    Ping    PIN   14
    '-------[noparse][[/noparse]VARIABLES]-------------------------------
    pingdist    VAR Word  'Value where ping reading is stored
    rawDist     VAR Word  ' raw measurement
    ircm        VAR Word   'gp2d02 distanc in centimeters
    val02   VAR  Byte  ' value where reading is stored
    '-------[noparse][[/noparse]CONSTANTS]-------------------------------
    RawToCm     CON  $08D1     ' 1 / 29.034
    Sdat        CON  15        ' PSC Module
    Trigger     CON  5         ' trigger pulse = 10 uS
    Scale       CON  $200      ' raw x 2.00 = uS
    cl          CON  4  ' pin 4 is output (clock)
    dt          CON  5  ' pin 5 is the input (data)
    '--------------------------------------------------------
    ' I/O pin setup for detector
    
    INPUT dt    ' make pin 15 the input
    HIGH cl      ' make pin 14 output and high
    '-------[noparse][[/noparse]MAIN CODE]-------------------------------
    DEBUG CLS,                                    ' setup report screen '|
          "SENSORS VALUES", CR,                                         '|
          "-------------------", CR,                                    '|
          CR,                                                           '|
          "raw IR", CR,  '---------------------------------------------|line 3
          "cm IR", CR,  '--------------------------------------------|line 4
          "ping", CR,  '--------------------------------------------|line 5
          CR
    DO
    GOSUB read02    ' call IR measurement routine
    GOSUB Get_Sonar ' call sonar measurement routine
    GOSUB readings    ' call display routine
    LOOP
    END      ' stop Stamp when done
    
    '-------[noparse][[/noparse]SUBROUTINES]-----------------------------
    '--------------------------------------------------------
    ' subroutine read02
    '
    ' This subroutine takes a reading from the connected
    ' GP2D02 detector and stores the value in "val02".
    ' Any two pins can be used.  Set "dt" to the data line
    ' of the GP2D02 (pin 4 on JST connector, yellow wire).
    ' Set cl to the clock line of the GP2D02 (pin 2 on the
    ' JST connector, green wire).
    Get_Sonar:
     PULSOUT Ping, Trigger                         ' activate sensor
     PULSIN  Ping, 1, rawDist                      ' measure ec:o pulse
     rawDist = rawDist */ Scale                    ' convert to uS
     rawDist = rawDist / 2                         ' remove return trip
     pingdist = rawDist ** RawToCm                 ' convert to centimeters
     RETURN
    read02:
      LOW cl    ' turn on detector for reading
      rl:
      IF IN5 = 0 THEN rl  ' wait for input high
      SHIFTIN dt, cl, MSBPOST, [noparse][[/noparse]val02]
      HIGH cl    ' turn detector off
    val02 = val02 - 60 ' /* remove basic sensor offset */
    IF (val02 < 1)THEN val02 = 1 '  /* avoid divide by zero */
    ircm= 1500 / val02'  /* hyperbolic conversion TO (rough) centimeters*/
    RETURN
    readings:
    DEBUG CRSRXY, 15, 3,
    DEC val02, CLREOL
    DEBUG CRSRXY, 15, 4,
    DEC ircm, CLREOL
    DEBUG CRSRXY, 15, 5,
    DEC pingdist, CLREOL
    RETURN
    
  • AmirNathooAmirNathoo Posts: 4
    edited 2006-08-14 22:09
    If you look at the datasheet, it provides a linear function (1/(R+4)) Vs V where R is the range and V is the value from the ADC. You can use that to calculate the distance,
    instead of using the Range Vs V. which is non linear.

    See the datasheet http://www.acroname.com/robotics/parts/GP2D120_SS.pdf

    Given that you can use the following formulae to get the distance:

    R = (m' / (V + b')) - K

    (m') and (b') are values you will need to determine by trial and error, as they depend on the sensor and the ADC you are using. (K) is equal to 4 for the GPD12

    I am using a 10bit ADC and my m'=5930 and b'=3

    You can try this by placing an object at a known distance from the sensor (preferably between 10 and 80cm) and reading the returned value (R) from the formulae. You can then adjust your m' and b' values, according to the expected distance. This is an empirical approach, but works very well.

    The range here is in inch..but it is easy to convert this in cm.
  • AmirNathooAmirNathoo Posts: 4
    edited 2006-08-14 22:14
    I guess your question was about the GP2D02 which I beleive is no longer manufactured. The range is similar to the GP2D12. So the formulae above should work the same.
  • Special_KSpecial_K Posts: 162
    edited 2006-08-15 15:49
    Thanks I will try this formula. I will post results.
  • Special_KSpecial_K Posts: 162
    edited 2006-08-17 04:00
    Used some of that code you wrote and added some from the other equation, I came up with this
    read02:
      LOW cl    ' turn on detector for reading
      rl:
      IF IN5 = 0 THEN rl        'wait for input high
      SHIFTIN dt, cl, MSBPOST, [noparse][[/noparse]IRCNT]
      HIGH cl                   'turn detector off
    X =(((2251/(IRCNT-60))-4))
    



    X =(((2251/(IRCNT-60))-4))

    this code does the conversion into CM
    IRCN is the readout from the GP2D02. it works ok but it is not spot on. still want a tighter reading.
    if anyone can help tune up this equation please post.
    thanks
  • Bruce BatesBruce Bates Posts: 3,045
    edited 2006-08-17 04:44
    Special K -

    I don't suppose you're going to like this answer, but be that as it may. The GP2D02 is now an obsolete sensor from what I understand. One of the reasons is certainly the difficulty that you're experiencing right now.

    There are a number of other similar Sharp sensors, even some with digital output, which might ease this pain substantially. I've attached a Sharp Sensor Guide, although it is a few years out of date. Hope that is helpful.

    Regards,

    Bruce Bates
Sign In or Register to comment.