Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / rangefinders / rangefinder.c @ 1455

History | View | Annotate | Download (4.8 KB)

1
/**
2
 * Copyright (c) 2007 Colony Project
3
 * 
4
 * Permission is hereby granted, free of charge, to any person
5
 * obtaining a copy of this software and associated documentation
6
 * files (the "Software"), to deal in the Software without
7
 * restriction, including without limitation the rights to use,
8
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
9
 * copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following
11
 * conditions:
12
 * 
13
 * The above copyright notice and this permission notice shall be
14
 * included in all copies or substantial portions of the Software.
15
 * 
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
 * OTHER DEALINGS IN THE SOFTWARE.
24
 **/
25

    
26

    
27
/**
28
 * @file rangefinder.c
29
 * @brief Rangefinders
30
 *
31
 * Implementation of functions for rangefinder use.
32
 *
33
 * @author Colony Project, CMU Robotics Club
34
 **/
35

    
36
/*
37
  Authors: James Kong and Greg Tress
38

39
  Last Modified: 10/07/09 by Dan Shope
40
  -Revised LUT to match GP2D120X Sensors (4-30cm)
41
  -range_read_distance() now returns -1 for below lower bound, -2 for beyond upper bound
42

43
  Modified: 4/30/06 by James
44
  -Started log_distance conversion function !!!NOT COMPLETE!!!
45
  -Cleaning up comments
46

47
  -----------------
48
  rangefinder.c
49
  Using Sharp GP2D120X IR Rangefinder
50

51
  Vin is the input to the rangefinder, designated RANGE_CTRL.
52
  Vout is the output from the rangefinder, designated RANGE_IN# where # is the rangefinder you are reading from
53

54
  Expected Initial Conditions:
55
  Vin is high and Vout should read high.
56

57
  Usage:
58
  1.) Set Vin low. Vout should read low.
59
  2.) Wait for high on Vout.
60
  3.) Begin clocking Vin and reading 8 bits from Vout (MSB first).
61
  4.) Set Vin high for 2ms or more to turn off rangefinder
62

63
*/
64

    
65
#include "dragonfly_lib.h"
66
#include "rangefinder.h"
67

    
68
/*
69
  read_distance returns the 8-bit reading from the rangefinder
70
  parameters:
71
  range_id - dio pin set as the rangefinder Vout [i.e. RANGE_IN0]
72

73
  NOTE:
74
  The Sharp GD2D02 returns values on a decreasing logrithmic scale.
75
  So higher values correspond to closer distances.  Use linearize_distance to convert to normal centimeter scale.
76
  Also, when reading distances closer than 8cm, the Sharp GD2D02 will return lower values than the values at 8cm.
77
  At this point, we are only reading from one rangefinder [RANGE_IN0].
78
*/
79

    
80
// constants
81
/* Averaged over 5 robots, should give real (mm) values to +/-10 millimeters
82

83
   Note the minimum value is .4V (20), and the maximum is 2.6V (133).
84
   Gives distance in mm.
85

86
   excel formula(valid for inputs 20-133):  ROUND(2353.6*(E2^(-1.1146))*10,0)
87

88
   This is only valid for the GP2D120X, with objects directly ahead and more than
89
   10cm from the detector.  See the datasheet for more information.
90
*/
91

    
92
static int IR_dist_conversion[72] = {
93
        327,315,303,291,281,271,262,253,245,238,231,224,218,212,206,200,
94
        195,190,185,181,177,173,168,165,161,158,155,151,148,145,143,140,
95
        137,134,132,130,127,125,123,121,119,117,115,114,111,110,108,106,
96
        105,104,102,100,99,98,97,95,94,93,91,90,89,88,87,86,84,83,83,82,
97
        81,80,79,78
98
};
99

    
100
/**
101
 * @defgroup rangefinder Rangefinder
102
 * @brief Functions for using the IR rangefinders
103
 * 
104
 * Functions for using the IR rangefinders.
105
 *
106
 * @{
107
 **/
108

    
109
/**
110
 * Initializes the rangefinders. This must be called before
111
 * range_read_distance.
112
 *
113
 * @see range_read_distance
114
 **/
115
void range_init(void)
116
{
117
  digital_output(_PIN_B4,0);
118
}
119

    
120
/**
121
 * Reads the distance measured by one of the rangefinders.
122
 * This distance is in arbitrary units.
123
 *
124
 * @param range_id the rangefinder to use. This should be one
125
 * of the constants IR1 - IR5.
126
 *
127
 * @return the distance measured by the rangefinder
128
 *
129
 * @see range_init
130
 **/
131
int range_read_distance(int range_id) {
132
  return linearize_distance(analog8(range_id));
133
}
134

    
135
/**
136
 * Transforms distance readings from logarithmic to linear scale.
137
 * This probably isn't the function you are looking for.
138
 *
139
 * @param value the 8-bit analog value from rangefinder
140
 *
141
 * @return linearized distance reading from rangefinder (integer in [78,327])
142
 * @return (-1) if below MIN_IR_ADC8
143
 * @return (-2) if beyond MAX_IR_ADC8
144
 **/
145
int linearize_distance(int value) {
146
  if(value < MIN_IR_ADC8) {
147
    return -1;
148
  } else if(value > MAX_IR_ADC8) {
149
    return -2;
150
  } else {
151
    return IR_dist_conversion[value - MIN_IR_ADC8];
152
  }
153
}
154

    
155
/** @} **/ //end defgroup