Получение расстояния от ИК-сенсора

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Доброе время суток! Я пока что новичок в ардуино, поэтому прошу сильно не пинать.

В общем, вот моя проблема: для одного проекта был куплен известный ИК-дальномер Sharp http://amperka.ru/product/infrared-range-meter-30 . Да вот только не могу я от него получить нормальное значение. Мне б хотя бы перевести в вольты, используя таблицу из даташита http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a41sk_e.pdf . Вот мой недокод:

#define SENSOR_PIN A5
 
void setup()
{
    Serial.begin(9600);
}
 
void loop()
{
    delay(1000);
    int val = analogRead(SENSOR_PIN);
    int l = map(val, 0, 1023, 5, 0); // Вот тут проблемка. Не уверен, что сделал правильно, дабы перевести в вольты
    Serial.println(l);
}

Был бы очень признателен, если бы Вы помогли мне с кодом. Желательно, чтобы выдавалось сразу значение в см, если это возможно. Заранее спасибо!

Alex_Sk
Offline
Зарегистрирован: 06.01.2015
int l = map(val, 0, 1023, 0, 5000);

результат будет в милливольтах которые по своей таблице переводить в расстояние

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Alex_Sk пишет:

int l = map(val, 0, 1023, 0, 5000);

результат будет в милливольтах которые по своей таблице переводить в расстояние

Спасибо! А нельзя ли сделать чтобы было сразу в см или в мм? Было бы очень хорошо!

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Еси прописать 

map(val, 0, 1023, 0, 5000)

 , то монитор выдаёт 2233 при 10 сантиметрах, но в даташите при 10 см должно быть 1,23 Вольт. Почему?  Если прописать 

map(val, 0, 1023, 5000, 0)

 , то будет тоже не 1,23   

 

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

Потому что такое значение val считывается функцией analogRead(). А map() только масштабирует диапазон значений 0...1023 в диапазон 0...5000

Тестером проверить что при этих 10см реально на датчике сложно?

Araris
Offline
Зарегистрирован: 09.11.2012

float volts = analogRead(sensor)*0.0048828125; // value from sensor * (5/1024)
int distance = 13*pow(volts, -1); // worked out from datasheet graph

Отсюда: http://tinkcore.com/sharp-ir-gp2y0a41-skf/

Alex_Sk
Offline
Зарегистрирован: 06.01.2015

Жуть. Использовать функцию применяемую с дробными степенями для возведения в -1 степень вместо простого деления? Явно кто-то прикалывался.