Датчик измерения расстояния SHARP-GP2Y0A710K0F — рассчёт расстояния



SHARP-GP2Y0A710K0F — это ИК-датчик измерения расстояния с большим диапазоном определения:
от 100 до 550 см
и работающий по принципу триангуляции.
Подробнее про датчик можно прочитать в заметке — Датчик измерения расстояния SHARP-GP2Y0A710K0F
— там рассмотрены характеристики датчика и написан скетч, считывающий напряжение выдаваемое сенсором с аналогового входа контроллера Arduino/CraftDuino.
Теперь же, рассмотрим пересчёт напряжения датчика в расстояние до объекта.

Обратите внимание, что датчик заработает только при подключении всех пинов его разъёма:

1 и 5 пины разъёма должны подключаться к «земле» (GND),
2 и 3 пины подключаются к Vcc (5V),
4 пин подключается к аналоговому входу контроллера Arduino/CraftDuino.

Разъём представляет собой хитрую вилку с шагом 1.5мм и доволно трудно доставаем, поэтому пришлось разломать наиболее похожий разъём на отдельные пины и повтыкать их отдельно, изолировав термоусадкой.

Если воспользоваться фотоаппаратом, то будет видно свечение ИК-диода

Остаётся пересчитать напряжение, выдаваемой датчиком, в расстояние до объекта.
Для этого, воспользуемся документацией на датчик, а именно — графиком, на котором изображена линейная зависимость напряжения от обратного значения расстояния (1/см).

Видим линейную зависимость, а значит — нам просто нужно узнать параметры этой линии и использовать их для пересчёта напряжения в расстояние до объекта.

Уравнение прямой:

y = k*x + b

, где
k — угловой коэффициент прямой (k = tg(phi), где phi — угол между прямой и осью OX)
b — точка пересечения прямой и оси OY (при x=0)

Уравнение прямой по двум точкам (x1, y1) и (x2, y2):

 y - y1     x - x1
------- = --------
y2 - y1    x2 - x1

k = (y2-y1)/(x2-x1)

из этой формулы и двух значений, определённых по графику линейной зависимости напряжения от обратного значения расстояния:

1) (0.002 , 1.4)
2) (0.010 , 2.5)

находим коэффициенты прямой:

k = 137.5
b = 1.125

Т.о., можем переписать скетч для контроллера Arduino/CraftDuino чтобы напряжение сразу пересчитывалось в расстояние до объекта (в сантиметрах):

//
// SHARP IR sensor test distance calculation (cm)
//
// https://robocraft.ru
//

int IRpin = 0;                                    // analog pin for reading the IR sensor

// linear coefficients to calculate the distance
#define SHARP_GP2Y0A710K0F_K 137.5
#define SHARP_GP2Y0A710K0F_B 1.125

float get_distance_from_volts(float volts)
{
  return SHARP_GP2Y0A710K0F_K/(volts - SHARP_GP2Y0A710K0F_B);
}

void setup() {

  Serial.begin(9600);                             // start the serial port
}

void loop() {

  // 5v/1024 = 0.0048828125

  float volts = analogRead(IRpin)*0.0048828125;   // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
  float dist_cm = get_distance_from_volts(volts);
  Serial.println(dist_cm);                       // print the distance
  delay(100);                                     // arbitary wait time.
}

Используя этот скетч можно определить, что сенсор выдаёт адекватное расстояние где-то от 60 сантиметров и обладает довольно узкой диаграммой направленности.

Сенсор SHARP предоставлен компанией Farnell, за что ей (и лично Ryan Gibson) большое спасибо!

Ссылки
http://ru.wikipedia.org/wiki/Прямая

По теме
Датчик измерения расстояния SHARP-GP2Y0A710K0F
Программирование Arduino — аналоговый ввод/вывод
Датчик измерения расстояния SHARP-GP2Y0A02YK0F


2 комментария на «“Датчик измерения расстояния SHARP-GP2Y0A710K0F — рассчёт расстояния”»

  1. А почему бы не использовать map?

    float dist_sm=1000000L/map(analogRead(IRpin),287,512,2000L,10000L)

    map имеет тип long, поэтому значения выходного диапазона выбраны *10^6; входной диапазон 287 — 1,4V, 512 — 2.5V

  2. Не нашел, как отредактировать свой коментарий, поэтому пишу новый. Операция деления должна выполняться в режиме float, поэтому нужно исправить:

    float dist_sm=1000000.0/map(analogRead(IRpin),287,512,2000L,10000L)

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение