This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| en:iot-open:practical:hardware:itt:avr:ir_distance [2025/09/02 13:03] – raivo.sell | en:iot-open:practical:hardware:itt:avr:ir_distance [2025/09/02 14:23] (current) – raivo.sell | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Infrared distance sensor ====== | ||
| + | ===== Theory ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | For measuring the distance to an object, there are optical sensors using the triangulation measuring method. The company “Sharp” produces the most common infra-red (IR) wavelength using distance sensors, which have an analogue voltage output. The sensors made by “Sharp” have an IR LED equipped with a lens, which emits a narrow light beam. After reflecting from the object, the beam will be directed through the second lens to a position-sensitive photo detector (PSD). The conductivity of this PSD depends on the position where the beam falls. The conductivity is converted to voltage, and if the voltage is digitized by using an analogue-digital converter, the distance can be calculated. The route of beams reflecting from different distances is presented on the drawing next to the text | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | The output of distance sensors by " | ||
| + | |||
| + | ===== Practice | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | The HomeLab set of sensors includes an IR distance sensor, SHARP GP2Y0A21YK. The measuring range of the sensor is 10 cm – 80 cm. The output voltage of this sensor is, depending on the distance measured, up to 3 V. The distance sensor can be connected to any ADC (the analogue-digital converter) channel of the HomeLab module. On the basis of previous exercises with sensors, it is easy to write a program that measures the output voltage of the distance sensors, but in addition, this exercise includes converting this output voltage to distance. | ||
| + | |||
| + | On the datasheet of the GP2Y0A21YK is a graph of the relation between its output voltage and measured distance. This graph is not a linear one; however, the graph of inverse values of output voltage and distance almost is, and from that, it is quite easy to find the formula for converting voltage to distance. | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // The structure of the parameters of the IR distance sensors | ||
| + | typedef const struct | ||
| + | { | ||
| + | const signed short a; | ||
| + | const signed short b; | ||
| + | const signed short k; | ||
| + | } | ||
| + | ir_distance_sensor; | ||
| + | |||
| + | // The object of the parameters of GP2Y0A21YK sensor | ||
| + | const ir_distance_sensor GP2Y0A21YK = { 5461, -17, 2 }; | ||
| + | |||
| + | // Converting the values of the IR distance sensor to centimeters | ||
| + | // Returns -1, if the conversion did not succeed | ||
| + | signed short ir_distance_calculate_cm(ir_distance_sensor sensor, | ||
| + | unsigned short adc_value) | ||
| + | { | ||
| + | if (adc_value + sensor.b <= 0) | ||
| + | { | ||
| + | return -1; | ||
| + | } | ||
| + | |||
| + | return sensor.a / (adc_value + sensor.b) - sensor.k; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | To make the conversion, the function // | ||
| + | |||
| + | <code c> | ||
| + | // The example program of the IR distance sensor of the HomeLab | ||
| + | // Measured results in centimeters are displayed on the LCD | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | #define ADC_CHANNEL 0 | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | signed short value, distance; | ||
| + | char text[16]; | ||
| + | |||
| + | // Initialization of LCD | ||
| + | lcd_gfx_init(); | ||
| + | lcd_gfx_clear(); | ||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Setup of the ADC | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Endless loop | ||
| + | while (1) | ||
| + | { | ||
| + | // Reading the 4 times rounded value of output voltage | ||
| + | value = adc_get_average_value(ADC_CHANNEL, | ||
| + | |||
| + | // Conversing ADC value to distance | ||
| + | distance = ir_distance_calculate_cm(GP2Y0A21YK, | ||
| + | |||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | |||
| + | // Was the calculation successful? | ||
| + | if (distance >= 0) | ||
| + | { | ||
| + | // Conversing distance to text | ||
| + | sprintf(text, | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | // Creating the text for an unknown distance | ||
| + | sprintf(text, | ||
| + | } | ||
| + | |||
| + | lcd_gfx_goto_char_xy(1, | ||
| + | lcd_gfx_write_string(text); | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Task to be implemented ==== | ||
| + | - Show on the LCD the direction, whether the distance increases or decreases. For changing the distance, use a Servo motor (use the following scenario and instructions for servo motor control). | ||