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 — рассчёт расстояния”»
А почему бы не использовать map?
map имеет тип long, поэтому значения выходного диапазона выбраны *10^6; входной диапазон 287 — 1,4V, 512 — 2.5V
Не нашел, как отредактировать свой коментарий, поэтому пишу новый. Операция деления должна выполняться в режиме float, поэтому нужно исправить: